[
  {
    "path": ".github/conda/bld.bat",
    "content": "cd bindings\\python\n%PYTHON% -m pip install . --prefix=%PREFIX%\n"
  },
  {
    "path": ".github/conda/build.sh",
    "content": "cd bindings/python\n$PYTHON -m pip install . --prefix=$PREFIX\n"
  },
  {
    "path": ".github/conda/meta.yaml",
    "content": "{% set name = \"tokenizers\" %}\n\npackage:\n  name: \"{{ name|lower }}\"\n  version: \"{{ TOKENIZERS_VERSION }}\"\n\nsource:\n  path: ../../\n\nrequirements:\n  host:\n    - pip\n    - python x.x\n    - setuptools\n    - setuptools-rust\n    - pkg-config\n    - openssl\n    - maturin\n\n  run:\n    - python x.x\n\ntest:\n  imports:\n    - tokenizers\n    - tokenizers.models\n\nabout:\n  home: https://huggingface.co/docs/tokenizers\n  license: Apache License 2.0\n  license_file: LICENSE\n  summary: \"💥 Fast State-of-the-Art Tokenizers optimized for Research and Production\"\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 7\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - pinned\n  - security\n# Label to use when marking an issue as stale\nstaleLabel: wontfix\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n"
  },
  {
    "path": ".github/workflows/CI.yml",
    "content": "# This file is autogenerated by maturin v1.7.4\n# To update, run\n#\n#    maturin generate-ci github -m bindings/python/Cargo.toml\n#\nname: CI\n\non:\n  push:\n    branches:\n      - main\n      - master\n    tags:\n      - '*'\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  linux:\n    runs-on: ${{ matrix.platform.runner }}\n    strategy:\n      matrix:\n        platform:\n          - runner: ubuntu-latest\n            target: x86_64\n          - runner: ubuntu-latest\n            target: x86\n          - runner: ubuntu-latest\n            target: aarch64\n          - runner: ubuntu-latest\n            target: armv7\n          - runner: ubuntu-latest\n            target: s390x\n          - runner: ubuntu-latest\n            target: ppc64le\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n      - name: Build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: ${{ matrix.platform.target }}\n          args: --release --out dist --manifest-path bindings/python/Cargo.toml\n          sccache: 'true'\n          manylinux: auto\n      - name: Upload wheels\n        uses: actions/upload-artifact@v4\n        with:\n          name: wheels-linux-${{ matrix.platform.target }}\n          path: dist\n\n  musllinux:\n    runs-on: ${{ matrix.platform.runner }}\n    strategy:\n      matrix:\n        platform:\n          - runner: ubuntu-latest\n            target: x86_64\n          - runner: ubuntu-latest\n            target: x86\n          - runner: ubuntu-latest\n            target: aarch64\n          - runner: ubuntu-latest\n            target: armv7\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n      - name: Build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: ${{ matrix.platform.target }}\n          args: --release --out dist --manifest-path bindings/python/Cargo.toml\n          sccache: 'true'\n          manylinux: musllinux_1_2\n      - name: Upload wheels\n        uses: actions/upload-artifact@v4\n        with:\n          name: wheels-musllinux-${{ matrix.platform.target }}\n          path: dist\n\n  windows:\n    runs-on: ${{ matrix.platform.runner }}\n    strategy:\n      matrix:\n        platform:\n          - runner: windows-latest\n            target: x64\n            architecture: x64\n          - runner: windows-latest\n            target: x86\n            architecture: x86\n          - runner: windows-11-arm\n            target: aarch64\n            architecture: arm64\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n          architecture: ${{ matrix.platform.architecture }}\n      - name: Build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: ${{ matrix.platform.target }}\n          args: --release --out dist --manifest-path bindings/python/Cargo.toml\n          sccache: 'true'\n      - name: Upload wheels\n        uses: actions/upload-artifact@v4\n        with:\n          name: wheels-windows-${{ matrix.platform.target }}\n          path: dist\n\n  macos:\n    runs-on: ${{ matrix.platform.runner }}\n    strategy:\n      matrix:\n        platform:\n          - runner: macos-15-intel\n            target: x86_64\n          - runner: macos-14\n            target: aarch64\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n      - name: Build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: ${{ matrix.platform.target }}\n          args: --release --out dist --manifest-path bindings/python/Cargo.toml\n          sccache: 'true'\n      - name: Upload wheels\n        uses: actions/upload-artifact@v4\n        with:\n          name: wheels-macos-${{ matrix.platform.target }}\n          path: dist\n\n  sdist:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Build sdist\n        uses: PyO3/maturin-action@v1\n        with:\n          command: sdist\n          args: --out dist --manifest-path bindings/python/Cargo.toml\n      - name: Upload sdist\n        uses: actions/upload-artifact@v4\n        with:\n          name: wheels-sdist\n          path: dist\n\n  release:\n    name: Release\n    runs-on: ubuntu-latest\n    if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}\n    needs: [linux, musllinux, windows, macos, sdist]\n    permissions:\n      # Use to sign the release artifacts\n      id-token: write\n      # Used to upload release artifacts\n      contents: write\n      # Used to generate artifact attestation\n      attestations: write\n    steps:\n      - uses: actions/download-artifact@v4\n      - name: Generate artifact attestation\n        uses: actions/attest-build-provenance@v1\n        with:\n          subject-path: 'wheels-*/*'\n      - name: Publish to PyPI\n        if: \"startsWith(github.ref, 'refs/tags/')\"\n        uses: PyO3/maturin-action@v1\n        env:\n          MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN_DIST}}\n        with:\n          command: upload\n          args: --non-interactive --skip-existing wheels-*/*\n"
  },
  {
    "path": ".github/workflows/build_documentation.yml",
    "content": "name: Build documentation\n\non:\n  push:\n    branches:\n      - main\n      - doc-builder*\n      - v*-release\n      - use_templates\n\njobs:\n  build:\n    uses: huggingface/doc-builder/.github/workflows/build_main_documentation.yml@main\n    with:\n      commit_sha: ${{ github.sha }}\n      package: tokenizers\n      path_to_docs: tokenizers/docs/source-doc-builder/\n      package_path: tokenizers/bindings/python/\n      install_rust: true\n    secrets:\n      hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }}\n"
  },
  {
    "path": ".github/workflows/build_pr_documentation.yml",
    "content": "name: Build PR Documentation\n\non:\n  pull_request:\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\njobs:\n  build:\n    uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@main\n    with:\n      commit_sha: ${{ github.event.pull_request.head.sha }}\n      pr_number: ${{ github.event.number }}\n      package: tokenizers\n      path_to_docs: tokenizers/docs/source-doc-builder/\n      package_path: tokenizers/bindings/python/\n      install_rust: true\n"
  },
  {
    "path": ".github/workflows/delete_doc_comment.yml",
    "content": "name: Delete doc comment\n\non:\n  workflow_run:\n    workflows: [\"Delete doc comment trigger\"]\n    types:\n      - completed\n\njobs:\n  delete:\n    uses: huggingface/doc-builder/.github/workflows/delete_doc_comment.yml@main\n    secrets:\n      comment_bot_token: ${{ secrets.COMMENT_BOT_TOKEN }}"
  },
  {
    "path": ".github/workflows/delete_doc_comment_trigger.yml",
    "content": "name: Delete doc comment trigger\n\non:\n  pull_request:\n    types: [ closed ]\n\n\njobs:\n  delete:\n    uses: huggingface/doc-builder/.github/workflows/delete_doc_comment_trigger.yml@main\n    with:\n      pr_number: ${{ github.event.number }}"
  },
  {
    "path": ".github/workflows/docs-check.yml",
    "content": "name: Documentation\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Install Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: 3.12\n\n      - name: Install dependencies\n        run: pip install sphinx sphinx_rtd_theme setuptools-rust\n\n      - name: Install Rust\n        uses: dtolnay/rust-toolchain@stable\n\n      - name: Build tokenizers\n        working-directory: ./bindings/python\n        run: pip install -e .\n\n      - name: Build documentation\n        working-directory: ./docs\n        run: make clean && make html_all O=\"-W --keep-going\"\n\n      - name: Upload built doc\n        uses: actions/upload-artifact@v4\n        with:\n          name: documentation\n          path: ./docs/build/*\n"
  },
  {
    "path": ".github/workflows/node-release.yml",
    "content": "name: Node Release\n\nenv:\n  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n  AWS_DEFAULT_REGION: us-east-1\n\non:\n  push:\n    tags:\n      - node-v*\n\njobs:\n  build:\n    env:\n      MACOSX_DEPLOYMENT_TARGET: 10.11\n    strategy:\n      matrix:\n        settings:\n          - host: macos-latest\n            target: x86_64-apple-darwin\n          - host: windows-latest\n            target: x86_64-pc-windows-msvc\n          - host: ubuntu-latest\n            target: x86_64-unknown-linux-gnu\n    runs-on: ${{ matrix.settings.host }}\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Install Rust\n        uses: dtolnay/rust-toolchain@stable\n\n      # Necessary for now for the cargo cache: https://github.com/actions/cache/issues/133#issuecomment-599102035\n      - if: matrix.os == 'ubuntu-latest'\n        run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/\n\n      - name: Cache Cargo Registry\n        uses: actions/cache@v4\n        with:\n          path: ~/.cargo/registry\n          key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.toml') }}\n\n      - name: Install Node ${{ matrix.node-version }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: latest\n          cache: yarn\n          cache-dependency-path: ./bindings/node/\n\n      - name: Install npm dependencies\n        working-directory: ./bindings/node\n        run: yarn install\n\n      - name: Build and package rust\n        working-directory: ./bindings/node\n        run: |\n          yarn build &&\n          strip -x *.node\n\n      - name: Install Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: 3.x\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: bindings-${{ matrix.settings.target }}\n          path: ${{ env.APP_NAME }}bindings/node/*.node\n          if-no-files-found: error\n  publish:\n    name: Publish\n    runs-on: ubuntu-latest\n    needs:\n      - build\n    steps:\n      - uses: actions/checkout@v4\n      - name: Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: latest\n          check-latest: true\n          cache: yarn\n          cache-dependency-path: ./bindings/node/\n      - name: Install dependencies\n        working-directory: ./bindings/node\n        run: yarn install\n      - name: Download all artifacts\n        uses: actions/download-artifact@v4\n        with:\n          path: ./bindings/node/artifacts\n      - name: Move artifacts\n        working-directory: ./bindings/node\n        run: yarn artifacts\n      - name: List packages\n        working-directory: ./bindings/node\n        run: ls -R ./npm\n        shell: bash\n      - name: Publish\n        working-directory: ./bindings/node\n        run: |\n          echo \"//registry.npmjs.org/:_authToken=$NPM_TOKEN\" >> ~/.npmrc\n          npm publish --access public --tag next\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/node.yml",
    "content": "name: Node\non:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - bindings/python/**\n  pull_request:\n    paths-ignore:\n      - bindings/python/**\n\njobs:\n  build_and_test:\n    name: Check everything builds\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Install Rust\n        uses: dtolnay/rust-toolchain@stable\n        with:\n          components: rustfmt, clippy\n\n      # Necessary for now for the cargo cache: https://github.com/actions/cache/issues/133#issuecomment-599102035\n      - run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/\n\n      - name: Cache Cargo Registry\n        uses: actions/cache@v4\n        with:\n          path: ~/.cargo/registry\n          key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}\n\n      - name: Install Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: latest\n      - name: Install dependencies\n        working-directory: ./bindings/node\n        run: yarn install\n\n      - name: Build all\n        working-directory: ./bindings/node\n        run: yarn build\n\n      - name: Lint Rust formatting\n        uses: actions-rs/cargo@v1\n        with:\n          command: fmt\n          args: --manifest-path ./bindings/node/Cargo.toml -- --check\n\n      - name: Lint Rust with Clippy\n        uses: actions-rs/cargo@v1\n        with:\n          command: clippy\n          args: --manifest-path ./bindings/node/Cargo.toml --all-targets --all-features -- -D warnings\n\n      - name: Lint TS\n        working-directory: ./bindings/node\n        run: yarn lint\n\n      - name: Run JS tests\n        working-directory: ./bindings/node\n        run: make test\n"
  },
  {
    "path": ".github/workflows/python-release.yml",
    "content": "name: Python Release\non:\n  push:\n    tags:\n      - v*\n\nenv:\n  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n  AWS_DEFAULT_REGION: us-east-1\n  PYPI_TOKEN: ${{ secrets.PYPI_TOKEN_DIST }}\n  DIST_DIR: ${{ github.sha }}\n\njobs:\n  lock_exists:\n    runs-on: ubuntu-latest\n    name: Cargo.lock\n    steps:\n      - uses: actions/checkout@v4\n      - name: Cargo.lock lock exists \n        run: cat Cargo.lock\n        working-directory: ./bindings/python\n\n  build:\n    name: build on ${{ matrix.platform || matrix.os }} (${{ matrix.target }} - ${{ matrix.manylinux || 'auto' }})\n    # only run on push to main and on release\n    needs: [lock_exists]\n    if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'Full Build')\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu, macos, windows]\n        target: [x86_64, aarch64]\n        manylinux: [auto]\n        include:\n          - os: ubuntu\n            platform: linux\n          - os: windows\n            ls: dir\n            interpreter: 3.9 3.10 3.11 3.12 3.13 pypy3.9 pypy3.10\n          - os: windows\n            ls: dir\n            target: x86_64\n            python-architecture: x64\n            interpreter: 3.9 3.10 3.11 3.12 3.13\n          - os: windows\n            ls: dir\n            target: i686\n            python-architecture: x86\n            python-install: | \n                3.9\n                3.10\n                3.11\n                3.12\n                3.13\n            interpreter: 3.9 3.10 3.11 3.12 3.13\n          - os: windows-11-arm\n            ls: dir\n            target: aarch64\n            python-architecture: arm64\n            python-install: |\n              3.11\n              3.12\n              3.13\n            interpreter: 3.11 3.12 3.13\n              # - os: windows\n              #   ls: dir\n              #   target: aarch64\n              #   interpreter: 3.11 3.12\n          - os: macos\n            target: aarch64\n            interpreter: 3.9 3.10 3.11 3.12 3.13 pypy3.9 pypy3.10\n          - os: ubuntu\n            platform: linux\n            target: i686\n          - os: ubuntu\n            platform: linux\n            target: aarch64\n\n          - os: ubuntu\n            platform: linux\n            target: armv7\n            interpreter: 3.9 3.10 3.11 3.12 3.13\n          # musllinux\n          - os: ubuntu\n            platform: linux\n            target: x86_64\n            manylinux: musllinux_1_1\n          - os: ubuntu\n            platform: linux\n            target: aarch64\n            manylinux: musllinux_1_1\n          - os: ubuntu\n            platform: linux\n            target: ppc64le\n            interpreter: 3.9 3.10 3.11 3.12 3.13\n          - os: ubuntu\n            platform: linux\n            target: s390x\n            interpreter: 3.9 3.10 3.11 3.12 3.13\n        exclude:\n          - os: windows\n            target: aarch64\n              #   # Optimized PGO builds for x86_64 manylinux and windows follow a different matrix,\n              #   # maybe in future maturin-action can support this automatically\n              #   - os: ubuntu\n              #     target: x86_64\n              #     manylinux: auto\n              #   - os: windows\n              #     target: x86_64\n              # Windows on arm64 only supports Python 3.11+\n\n    runs-on: ${{\n        matrix.os == 'windows-11-arm' && matrix.os ||\n        format('{0}-latest', matrix.os)\n      }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: set up python\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python-install || '3.13' }}\n          architecture: ${{ matrix.python-architecture || 'x64' }}\n\n      - run: pip install -U twine\n\n      - name: build wheels\n        uses: PyO3/maturin-action@v1\n        with:\n          target: ${{ matrix.target }}\n          working-directory: ./bindings/python\n          manylinux: ${{ matrix.manylinux || 'auto' }}\n          container: ${{ matrix.container }}\n          args: --release --out dist --interpreter ${{ matrix.interpreter || '3.9 3.10 3.11 3.12 3.13 pypy3.9 pypy3.10' }} ${{ matrix.extra-build-args }}\n          rust-toolchain: stable\n          docker-options: -e CI\n\n      - run: ${{ matrix.ls || 'ls -lh' }} dist/\n        working-directory: ./bindings/python\n\n      - run: twine check --strict dist/*\n        working-directory: ./bindings/python\n\n      - uses: actions/upload-artifact@v4\n        with:\n          name: pypi_files-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux }}\n          path: ./bindings/python/dist\n  build-sdist:\n    name: build sdist\n    needs: [lock_exists]\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: PyO3/maturin-action@v1\n        with:\n          working-directory: ./bindings/python\n          command: sdist\n          args: --out dist\n          rust-toolchain: stable\n      - uses: actions/upload-artifact@v4\n        with:\n          name: pypi_files-srt\n          path: ./bindings/python/dist\n\n\n  upload_package:\n    name: Upload package to PyPi\n    runs-on: ubuntu-latest\n    needs: [build, build-sdist]\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: \"3.13\"\n          architecture: x64\n\n      - uses: actions/download-artifact@v4\n        with:\n          path: ./bindings/python/dist\n          merge-multiple: true\n          # Temporary deactivation while testing abi3 CI\n          # - name: Upload to PyPi\n          #   working-directory: ./bindings/python\n          #   run: |\n          #     pip install twine\n          #     twine upload dist/* -u __token__ -p \"$PYPI_TOKEN\"\n"
  },
  {
    "path": ".github/workflows/python.yml",
    "content": "name: Python\n\non:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - bindings/node/**\n  pull_request:\n    paths-ignore:\n      - bindings/node/**\n\njobs:\n  build_win_32:\n    name: Check it builds for Windows 32-bit\n    runs-on: windows-latest\n    strategy:\n      matrix:\n        python: [\"3.9\", \"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\", \"3.14t\"]\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Install Rust\n        uses: actions-rs/toolchain@v1\n        with:\n          toolchain: stable-i686-pc-windows-msvc\n          override: true\n\n      - name: Override toolchain\n        shell: bash\n        working-directory: ./bindings/python\n        run: echo \"stable-i686-pc-windows-msvc\" > rust-toolchain\n\n\n      - name: Install Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python }}\n          architecture: x86\n\n      - name: Build\n        uses: actions-rs/cargo@v1\n        with:\n          command: build\n          args: --manifest-path ./bindings/python/Cargo.toml\n\n\n  build_and_test:\n    name: Check everything builds & tests\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest]\n        python: [\"3.14\", \"3.14t\"]\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n        \n\n      - name: Install Rust\n        uses: actions-rs/toolchain@v1\n        with:\n          toolchain: stable\n          components: rustfmt, clippy\n\n      - name: Install audit\n        uses: actions-rs/cargo@v1\n        with:\n          command: install\n          args: cargo-audit\n\n      - name: Install Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python }}\n          architecture: \"x64\"\n\n\n      - name: Cache Cargo Registry\n        uses: actions/cache@v4\n        with:\n          path: ~/.cargo/registry\n          key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}\n\n          # - name: Cache Cargo Build Target\n          #   uses: actions/cache@v1\n          #   with:\n          #     path: ./bindings/python/target\n          #     key: ${{ runner.os }}-cargo-python-build-${{ hashFiles('**/Cargo.lock') }}\n\n      - name: Lint with RustFmt\n        uses: actions-rs/cargo@v1\n        with:\n          toolchain: stable\n          command: fmt\n          args: --manifest-path ./bindings/python/Cargo.toml -- --check\n\n      - name: Lint with Clippy\n        uses: actions-rs/cargo@v1\n        with:\n          command: clippy\n          args: --manifest-path ./bindings/python/Cargo.toml --all-targets --all-features -- -D warnings\n\n      - name: Install cargo-audit\n        run: cargo install cargo-audit\n\n      - name: Run Audit\n        uses: actions-rs/cargo@v1\n        with:\n          command: audit\n          args: -D warnings -f ./bindings/python/Cargo.lock  --ignore RUSTSEC-2024-0436 --ignore RUSTSEC-2025-0014 --ignore RUSTSEC-2025-0119 --ignore RUSTSEC-2024-0436\n\n      - name: Install\n        working-directory: ./bindings/python\n        run: |\n          python -m venv .env\n          source .env/bin/activate\n          pip install -U pip\n          pip install pytest requests setuptools_rust numpy pyarrow datasets ty\n          pip install -e .[dev]\n\n      - name: Check style\n        working-directory: ./bindings/python\n        run: |\n          source .env/bin/activate\n          make check-style\n\n      - name: Type check\n        working-directory: ./bindings/python\n        run: |\n          source .env/bin/activate\n          ty check py_src --exclude py_src/tokenizers/implementations \n\n      - name: Run tests\n        working-directory: ./bindings/python\n        run: |\n          source .env/bin/activate\n          make test\n"
  },
  {
    "path": ".github/workflows/rust-release.yml",
    "content": "name: Rust Release\n\nenv:\n  CRATES_TOKEN: ${{ secrets.CRATES_TOKEN }}\n\non:\n  push:\n    tags:\n      - v*\n\njobs:\n  rust_publish:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Install Rust\n        uses: dtolnay/rust-toolchain@stable\n\n      - name: Cache Cargo Registry\n        uses: actions/cache@v4\n        with:\n          path: ~/.cargo/registry\n          key: ubuntu-latest-cargo-registry-${{ hashFiles('**/Cargo.toml') }}\n\n      - name: Publish package rust\n        working-directory: ./tokenizers\n        if: ${{ !contains(github.ref, 'rc') }}\n        run: cargo publish --token ${CRATES_TOKEN}\n\n"
  },
  {
    "path": ".github/workflows/rust.yml",
    "content": "name: Rust\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n    env:\n      MACOSX_DEPLOYMENT_TARGET: 10.12\n    strategy:\n      matrix:\n        os: [ubuntu-latest, windows-latest, macOS-latest]\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install Rust Stable\n        uses: actions-rs/toolchain@v1\n        with:\n          toolchain: stable\n          components: rustfmt, clippy\n          override: true\n\n      # Necessary for now for the cargo cache: https://github.com/actions/cache/issues/133#issuecomment-599102035\n      - if: matrix.os == 'ubuntu-latest'\n        run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/\n\n      - name: Install cargo-readme for Ubuntu\n        if: matrix.os == 'ubuntu-latest'\n        uses: actions-rs/cargo@v1\n        with:\n          command: install\n          args: cargo-readme\n\n      - name: Install audit\n        uses: actions-rs/cargo@v1\n        with:\n          command: install\n          args: cargo-audit\n\n      - name: Build\n        uses: actions-rs/cargo@v1\n        with:\n          command: build\n          args: --all-targets --verbose --manifest-path ./tokenizers/Cargo.toml\n\n      - name: Lint with RustFmt\n        uses: actions-rs/cargo@v1\n        with:\n          command: fmt\n          args: --manifest-path ./tokenizers/Cargo.toml -- --check\n\n      - name: Lint Benchmarks with RustFmt\n        uses: actions-rs/cargo@v1\n        with:\n          command: fmt\n          args: --manifest-path ./tokenizers/Cargo.toml -- ./tokenizers/benches/bpe_benchmark.rs --check\n\n      - name: Lint with Clippy\n        uses: actions-rs/cargo@v1\n        with:\n          command: clippy\n          args: --manifest-path ./tokenizers/Cargo.toml --all-targets --all-features -- -D warnings\n\n      - name: Run Tests\n        if: matrix.os != 'windows-latest'\n        shell: bash\n        working-directory: ./tokenizers\n        run: make test\n\n      # Skip integration tests for now on Windows\n      - name: Run lib Tests on Windows\n        if: matrix.os == 'windows-latest'\n        uses: actions-rs/cargo@v1\n        with:\n          command: test\n          args: --verbose --manifest-path ./tokenizers/Cargo.toml --lib\n\n      - name: Run doc Tests on Windows\n        if: matrix.os == 'windows-latest'\n        uses: actions-rs/cargo@v1\n        with:\n          command: test\n          args: --verbose --manifest-path ./tokenizers/Cargo.toml --doc\n\n      - name: Install cargo-audit\n        run: cargo install cargo-audit\n\n      - name: Run Audit\n        uses: actions-rs/cargo@v1\n        with:\n          command: audit\n          args: -D warnings -f ./tokenizers/Cargo.lock --ignore RUSTSEC-2024-0436 --ignore RUSTSEC-2025-0014 --ignore RUSTSEC-2025-0119\n\n      # Verify that Readme.md is up to date.\n      - name: Make sure, Readme generated from lib.rs matches actual Readme\n        if: matrix.os == 'ubuntu-latest'\n        shell: bash\n        working-directory: ./tokenizers\n        run: cargo readme > must_match_readme.md && diff must_match_readme.md README.md\n\n      - name: Check semver\n        if: matrix.os == 'ubuntu-latest'\n        uses: obi1kenobi/cargo-semver-checks-action@v2\n        with:\n          manifest-path: ./tokenizers/Cargo.toml\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: 'Close stale issues and PRs'\non:\n  schedule:\n    - cron: '30 1 * * *'\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v9\n        with:\n          stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'\n          days-before-stale: 30\n          days-before-close: 5\n"
  },
  {
    "path": ".github/workflows/trufflehog.yml",
    "content": "on:\n  push:\n\nname: Secret Leaks\n\njobs:\n  trufflehog:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n    - name: Secret Scanning\n      uses: trufflesecurity/trufflehog@853e1e8d249fd1e29d0fcc7280d29b03df3d643d\n      with:\n        # exclude buggy postgres detector that is causing false positives and not relevant to our codebase\n        extra_args: --results=verified,unknown --exclude-detectors=postgres\n"
  },
  {
    "path": ".github/workflows/upload_pr_documentation.yml",
    "content": "name: Upload PR Documentation\n\non:\n  workflow_run:\n    workflows: [\"Build PR Documentation\"]\n    types:\n      - completed\n\njobs:\n  build:\n    uses: huggingface/doc-builder/.github/workflows/upload_pr_documentation.yml@main\n    with:\n      package_name: tokenizers\n    secrets:\n      hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }}\n      comment_bot_token: ${{ secrets.COMMENT_BOT_TOKEN }}"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n*~\n\n.vim\n.env\ntarget\n.idea\n**/Cargo.lock\n\n/data\ntokenizers/data\nbindings/python/tests/data\ndocs/build/\ndocs/make.bat\n\n__pycache__\npip-wheel-metadata\n*.egg-info\n*.so\n/bindings/python/examples/.ipynb_checkpoints\n/bindings/python/build\n/bindings/python/dist\n\n.vscode\n*.code-workspace\n"
  },
  {
    "path": "CITATION.cff",
    "content": "# This CITATION.cff file was generated with cffinit.\n# Visit https://bit.ly/cffinit to generate yours today!\n\ncff-version: 1.2.0\ntitle: HuggingFace's Tokenizers\nmessage: >-\n  Fast State-of-the-Art Tokenizers optimized for Research\n  and Production.\ntype: software\nauthors:\n  - given-names: Anthony\n    family-names: Moi\n    email: m.anthony.moi@gmail.com\n    affiliation: HuggingFace\n  - given-names: Nicolas\n    family-names: Patry\n    affiliation: HuggingFace\nrepository-code: 'https://github.com/huggingface/tokenizers'\nurl: 'https://github.com/huggingface/tokenizers'\nrepository: 'https://huggingface.co'\nabstract: >-\n  Fast State-of-the-Art Tokenizers optimized for Research\n  and Production.\nkeywords:\n  - Rust\n  - Tokenizer\n  - NLP\nlicense: Apache-2.0\ncommit: 37372b6\nversion: 0.13.4\ndate-released: '2023-04-05'\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n    <br>\n    <img src=\"https://huggingface.co/landing/assets/tokenizers/tokenizers-logo.png\" width=\"600\"/>\n    <br>\n<p>\n<p align=\"center\">\n    <img alt=\"Build\" src=\"https://github.com/huggingface/tokenizers/workflows/Rust/badge.svg\">\n    <a href=\"https://github.com/huggingface/tokenizers/blob/main/LICENSE\">\n        <img alt=\"GitHub\" src=\"https://img.shields.io/github/license/huggingface/tokenizers.svg?color=blue&cachedrop\">\n    </a>\n    <a href=\"https://pepy.tech/project/tokenizers\">\n        <img src=\"https://pepy.tech/badge/tokenizers/week\" />\n    </a>\n</p>\n\nProvides an implementation of today's most used tokenizers, with a focus on performance and\nversatility.\n\n## Main features:\n\n - Train new vocabularies and tokenize, using today's most used tokenizers.\n - Extremely fast (both training and tokenization), thanks to the Rust implementation. Takes\n   less than 20 seconds to tokenize a GB of text on a server's CPU.\n - Easy to use, but also extremely versatile.\n - Designed for research and production.\n - Normalization comes with alignments tracking. It's always possible to get the part of the\n   original sentence that corresponds to a given token.\n - Does all the pre-processing: Truncate, Pad, add the special tokens your model needs.\n\n## Performances\nPerformances can vary depending on hardware, but running the [~/bindings/python/benches/test_tiktoken.py](bindings/python/benches/test_tiktoken.py) should give the following on a g6 aws instance:\n![image](https://github.com/user-attachments/assets/2b913d4b-e488-4cbc-b542-f90a6c40643d)\n\n\n## Bindings\n\nWe provide bindings to the following languages (more to come!):\n  - [Rust](https://github.com/huggingface/tokenizers/tree/main/tokenizers) (Original implementation)\n  - [Python](https://github.com/huggingface/tokenizers/tree/main/bindings/python)\n  - [Node.js](https://github.com/huggingface/tokenizers/tree/main/bindings/node)\n  - [Ruby](https://github.com/ankane/tokenizers-ruby) (Contributed by @ankane, external repo)\n\n## Installation\n\nYou can install from source using:\n```bash\npip install git+https://github.com/huggingface/tokenizers.git#subdirectory=bindings/python\n```\n\nor install the released versions with\n\n```bash\npip install tokenizers\n```\n \n## Quick example using Python:\n\nChoose your model between Byte-Pair Encoding, WordPiece or Unigram and instantiate a tokenizer:\n\n```python\nfrom tokenizers import Tokenizer\nfrom tokenizers.models import BPE\n\ntokenizer = Tokenizer(BPE())\n```\n\nYou can customize how pre-tokenization (e.g., splitting into words) is done:\n\n```python\nfrom tokenizers.pre_tokenizers import Whitespace\n\ntokenizer.pre_tokenizer = Whitespace()\n```\n\nThen training your tokenizer on a set of files just takes two lines of codes:\n\n```python\nfrom tokenizers.trainers import BpeTrainer\n\ntrainer = BpeTrainer(special_tokens=[\"[UNK]\", \"[CLS]\", \"[SEP]\", \"[PAD]\", \"[MASK]\"])\ntokenizer.train(files=[\"wiki.train.raw\", \"wiki.valid.raw\", \"wiki.test.raw\"], trainer=trainer)\n```\n\nOnce your tokenizer is trained, encode any text with just one line:\n```python\noutput = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\")\nprint(output.tokens)\n# [\"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\"]\n```\n\nCheck the [documentation](https://huggingface.co/docs/tokenizers/index)\nor the [quicktour](https://huggingface.co/docs/tokenizers/quicktour) to learn more!\n"
  },
  {
    "path": "RELEASE.md",
    "content": "## How to release\n\n# Before the release\n\nSimple checklist on how to make releases for `tokenizers`.\n\n- Freeze `master` branch.\n- Run all tests (Check CI has properly run)\n- If any significant work, check benchmarks:\n  - `cd tokenizers && cargo bench` (needs to be run on latest release tag to measure difference if it's your first time)\n- Run all `transformers` tests. (`transformers` is a big user of `tokenizers` we need\n  to make sure we don't break it, testing is one way to make sure nothing unforeseen\n  has been done.)\n  - Run all fast tests at the VERY least (not just the tokenization tests). (`RUN_PIPELINE_TESTS=1 CUDA_VISIBLE_DEVICES=-1 pytest -sv tests/`)\n  - When all *fast*  tests work, then we can also (it's recommended) run the whole `transformers`\n  test suite. \n    - Rebase this [PR](https://github.com/huggingface/transformers/pull/16708).\n        This will create new docker images ready to run the tests suites with `tokenizers` from the main branch.\n    - Wait for actions to finish\n    - Rebase this [PR](https://github.com/huggingface/transformers/pull/16712)\n        This will run the actual full test suite.\n    - Check the results.\n- **If any breaking change has been done**, make sure the version can safely be increased for transformers users (`tokenizers` version need to make sure users don't upgrade before `transformers` has). [link](https://github.com/huggingface/transformers/blob/main/setup.py#L154)\n  For instance `tokenizers>=0.10,<0.11` so we can safely upgrade to `0.11` without impacting\n  current users\n- Then start a new PR containing all desired code changes from the following steps.\n- You will `Create release` after the code modifications are on `master`.\n\n# Rust\n\n- `tokenizers` (rust, python & node) versions don't have to be in sync but it's\n  very common to release for all versions at once for new features.\n- Edit `Cargo.toml` to reflect new version\n- Edit `CHANGELOG.md`:\n    - Add relevant PRs that were added (python PRs do not belong for instance).\n    - Add links at the end of the files.\n- Go to [Releases](https://github.com/huggingface/tokenizers/releases)\n- Create new Release:\n    - Mark it as pre-release\n    - Use new version name with a new tag (create on publish) `vX.X.X`.\n    - Copy paste the new part of the `CHANGELOG.md`\n- ⚠️  Click on `Publish release`. This will start the whole process of building a uploading\n  the new version on `crates.io`, there's no going back after this\n- Go to the [Actions](https://github.com/huggingface/tokenizers/actions) tab and check everything works smoothly.\n- If anything fails, you need to fix the CI/CD to make it work again. Since your package was not uploaded to the repository properly, you can try again.\n\n\n# Python\n\n- Edit `bindings/python/setup.py` to reflect new version.\n- Edit `bindings/python/py_src/tokenizers/__init__.py` to reflect new version.\n- Edit `CHANGELOG.md`:\n    - Add relevant PRs that were added (node PRs do not belong for instance).\n    - Add links at the end of the files.\n- Go to [Releases](https://github.com/huggingface/tokenizers/releases)\n- Create new Release:\n    - Mark it as pre-release\n    - Use new version name with a new tag (create on publish) `python-vX.X.X`.\n    - Copy paste the new part of the `CHANGELOG.md`\n- ⚠️  Click on `Publish release`. This will start the whole process of building a uploading\n  the new version on `pypi`, there's no going back after this\n- Go to the [Actions](https://github.com/huggingface/tokenizers/actions) tab and check everything works smoothly.\n- If anything fails, you need to fix the CI/CD to make it work again. Since your package was not uploaded to the repository properly, you can try again.\n- This CI/CD has 3 distinct builds, `Pypi`(normal), `conda` and `extra`. `Extra` is REALLY slow (~4h), this is normal since it has to rebuild many things, but enables the wheel to be available for old Linuxes\n\n# Node\n\n- Edit `bindings/node/package.json` to reflect new version.\n- Edit `CHANGELOG.md`:\n    - Add relevant PRs that were added (python PRs do not belong for instance).\n    - Add links at the end of the files.\n- Go to [Releases](https://github.com/huggingface/tokenizers/releases)\n- Create new Release:\n    - Mark it as pre-release\n    - Use new version name with a new tag (create on publish) `node-vX.X.X`.\n    - Copy paste the new part of the `CHANGELOG.md`\n- ⚠️  Click on `Publish release`. This will start the whole process of building a uploading\n  the new version on `npm`, there's no going back after this\n- Go to the [Actions](https://github.com/huggingface/tokenizers/actions) tab and check everything works smoothly.\n- If anything fails, you need to fix the CI/CD to make it work again. Since your package was not uploaded to the repository properly, you can try again.\n\n\n# Testing the CI/CD for release\n\n\nIf you want to make modifications to the CI/CD of the release GH actions, you need\nto : \n- **Comment the part that uploads the artifacts** to `crates.io`, `PyPi` or `npm`.\n- Change the trigger mechanism so it can trigger every time you push to your branch.\n- Keep pushing your changes until the artifacts are properly created.\n"
  },
  {
    "path": "bindings/node/.cargo/config.toml",
    "content": "[target.aarch64-unknown-linux-musl]\nlinker = \"aarch64-linux-musl-gcc\"\nrustflags = [\"-C\", \"target-feature=-crt-static\"]\n"
  },
  {
    "path": "bindings/node/.editorconfig",
    "content": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors or IDEs\n# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": "bindings/node/.eslintrc.yml",
    "content": "parser: '@typescript-eslint/parser'\n\nparserOptions:\n  ecmaFeatures:\n    jsx: true\n  ecmaVersion: latest\n  sourceType: module\n  project: ./tsconfig.json\n\nenv:\n  browser: true\n  es6: true\n  node: true\n  jest: true\n\nignorePatterns: ['index.js', 'target/']\n\nplugins:\n  - import\n  - '@typescript-eslint'\n\nextends:\n  - eslint:recommended\n  - plugin:prettier/recommended\n\nrules:\n  # 0 = off, 1 = warn, 2 = error\n  'space-before-function-paren': 0\n  'no-useless-constructor': 0\n  'no-undef': 2\n  'no-console': [2, { allow: ['error', 'warn', 'info', 'assert'] }]\n  'comma-dangle': ['error', 'only-multiline']\n  'no-unused-vars': 0\n  'no-var': 2\n  'one-var-declaration-per-line': 2\n  'prefer-const': 2\n  'no-const-assign': 2\n  'no-duplicate-imports': 2\n  'no-use-before-define': [2, { 'functions': false, 'classes': false }]\n  'eqeqeq': [2, 'always', { 'null': 'ignore' }]\n  'no-case-declarations': 0\n  'no-restricted-syntax':\n    [\n      2,\n      {\n        'selector': 'BinaryExpression[operator=/(==|===|!=|!==)/][left.raw=true], BinaryExpression[operator=/(==|===|!=|!==)/][right.raw=true]',\n        'message': Don't compare for equality against boolean literals,\n      },\n    ]\n\n  # https://github.com/benmosher/eslint-plugin-import/pull/334\n  'import/no-duplicates': 2\n  'import/first': 2\n  'import/newline-after-import': 2\n  'import/order':\n    [\n      2,\n      {\n        'newlines-between': 'always',\n        'alphabetize': { 'order': 'asc' },\n        'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],\n      },\n    ]\n\noverrides:\n  - files:\n      - ./**/*{.ts,.tsx}\n    rules:\n      'no-unused-vars': [2, { varsIgnorePattern: '^_', argsIgnorePattern: '^_', ignoreRestSiblings: true }]\n      'no-undef': 0\n      # TypeScript declare merge\n      'no-redeclare': 0\n      'no-useless-constructor': 0\n      'no-dupe-class-members': 0\n      'no-case-declarations': 0\n      'no-duplicate-imports': 0\n      # TypeScript Interface and Type\n      'no-use-before-define': 0\n\n      '@typescript-eslint/adjacent-overload-signatures': 2\n      '@typescript-eslint/await-thenable': 2\n      '@typescript-eslint/consistent-type-assertions': 2\n      '@typescript-eslint/ban-types':\n        [\n          'error',\n          {\n            'types':\n              {\n                'String': { 'message': 'Use string instead', 'fixWith': 'string' },\n                'Number': { 'message': 'Use number instead', 'fixWith': 'number' },\n                'Boolean': { 'message': 'Use boolean instead', 'fixWith': 'boolean' },\n                'Function': { 'message': 'Use explicit type instead' },\n              },\n          },\n        ]\n      '@typescript-eslint/explicit-member-accessibility':\n        [\n          'error',\n          {\n            accessibility: 'explicit',\n            overrides:\n              {\n                accessors: 'no-public',\n                constructors: 'no-public',\n                methods: 'no-public',\n                properties: 'no-public',\n                parameterProperties: 'explicit',\n              },\n          },\n        ]\n      '@typescript-eslint/method-signature-style': 2\n      '@typescript-eslint/no-floating-promises': 2\n      '@typescript-eslint/no-implied-eval': 2\n      '@typescript-eslint/no-for-in-array': 2\n      '@typescript-eslint/no-inferrable-types': 2\n      '@typescript-eslint/no-invalid-void-type': 2\n      '@typescript-eslint/no-misused-new': 2\n      '@typescript-eslint/no-misused-promises': 2\n      '@typescript-eslint/no-namespace': 2\n      '@typescript-eslint/no-non-null-asserted-optional-chain': 2\n      '@typescript-eslint/no-throw-literal': 2\n      '@typescript-eslint/no-unnecessary-boolean-literal-compare': 2\n      '@typescript-eslint/prefer-for-of': 2\n      '@typescript-eslint/prefer-nullish-coalescing': 2\n      '@typescript-eslint/switch-exhaustiveness-check': 2\n      '@typescript-eslint/prefer-optional-chain': 2\n      '@typescript-eslint/prefer-readonly': 2\n      '@typescript-eslint/prefer-string-starts-ends-with': 0\n      '@typescript-eslint/no-array-constructor': 2\n      '@typescript-eslint/require-await': 2\n      '@typescript-eslint/return-await': 2\n      '@typescript-eslint/ban-ts-comment':\n        [2, { 'ts-expect-error': false, 'ts-ignore': true, 'ts-nocheck': true, 'ts-check': false }]\n      '@typescript-eslint/naming-convention':\n        [\n          2,\n          {\n            selector: 'memberLike',\n            format: ['camelCase', 'PascalCase'],\n            modifiers: ['private'],\n            leadingUnderscore: 'forbid',\n          },\n        ]\n      '@typescript-eslint/no-unused-vars':\n        [2, { varsIgnorePattern: '^_', argsIgnorePattern: '^_', ignoreRestSiblings: true }]\n      '@typescript-eslint/member-ordering':\n        [\n          2,\n          {\n            default:\n              [\n                'public-static-field',\n                'protected-static-field',\n                'private-static-field',\n                'public-static-method',\n                'protected-static-method',\n                'private-static-method',\n                'public-instance-field',\n                'protected-instance-field',\n                'private-instance-field',\n                'public-constructor',\n                'protected-constructor',\n                'private-constructor',\n                'public-instance-method',\n                'protected-instance-method',\n                'private-instance-method',\n              ],\n          },\n        ]\n"
  },
  {
    "path": "bindings/node/.gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n*        text=auto\n\n\n*.ts    text eol=lf merge=union \n*.tsx   text eol=lf merge=union \n*.rs    text eol=lf merge=union \n*.js    text eol=lf merge=union \n*.json  text eol=lf merge=union \n*.debug text eol=lf merge=union \n\n# Generated codes\nindex.js linguist-detectable=false\nindex.d.ts linguist-detectable=false "
  },
  {
    "path": "bindings/node/.gitignore",
    "content": "\n# Created by https://www.toptal.com/developers/gitignore/api/node\n# Edit at https://www.toptal.com/developers/gitignore?templates=node\n\n### Node ###\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs.org/api/report.html)\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n*.lcov\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# TypeScript v1 declaration files\ntypings/\n\n# TypeScript cache\n*.tsbuildinfo\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Microbundle cache\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n.env.test\n\n# parcel-bundler cache (https://parceljs.org/)\n.cache\n\n# Next.js build output\n.next\n\n# Nuxt.js build / generate output\n.nuxt\ndist\n\n# Gatsby files\n.cache/\n# Comment in the public line in if your project uses Gatsby and not Next.js\n# https://nextjs.org/blog/next-9-1#public-directory-support\n# public\n\n# vuepress build output\n.vuepress/dist\n\n# Serverless directories\n.serverless/\n\n# FuseBox cache\n.fusebox/\n\n# DynamoDB Local files\n.dynamodb/\n\n# TernJS port file\n.tern-port\n\n# Stores VSCode versions used for testing VSCode extensions\n.vscode-test\n\n# End of https://www.toptal.com/developers/gitignore/api/node\n\n\n#Added by cargo\n\n/target\nCargo.lock\n\n*.node\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions"
  },
  {
    "path": "bindings/node/.prettierignore",
    "content": "target\n.yarn"
  },
  {
    "path": "bindings/node/.taplo.toml",
    "content": "exclude = [\"node_modules/**/*.toml\"]\n\n# https://taplo.tamasfe.dev/configuration/formatter-options.html\n[formatting]\nalign_entries = true\nindent_tables = true\nreorder_keys  = true\n"
  },
  {
    "path": "bindings/node/.yarn/releases/yarn-3.5.1.cjs",
    "content": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var Sge=Object.create;var lS=Object.defineProperty;var vge=Object.getOwnPropertyDescriptor;var xge=Object.getOwnPropertyNames;var Pge=Object.getPrototypeOf,Dge=Object.prototype.hasOwnProperty;var J=(r=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(r,{get:(e,t)=>(typeof require<\"u\"?require:e)[t]}):r)(function(r){if(typeof require<\"u\")return require.apply(this,arguments);throw new Error('Dynamic require of \"'+r+'\" is not supported')});var kge=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ut=(r,e)=>{for(var t in e)lS(r,t,{get:e[t],enumerable:!0})},Rge=(r,e,t,i)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of xge(e))!Dge.call(r,n)&&n!==t&&lS(r,n,{get:()=>e[n],enumerable:!(i=vge(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?Sge(Pge(r)):{},Rge(e||!r||!r.__esModule?lS(t,\"default\",{value:r,enumerable:!0}):t,r));var vU=w((j7e,SU)=>{SU.exports=bU;bU.sync=$ge;var BU=J(\"fs\");function _ge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(\";\"),t.indexOf(\"\")!==-1))return!0;for(var i=0;i<t.length;i++){var n=t[i].toLowerCase();if(n&&r.substr(-n.length).toLowerCase()===n)return!0}return!1}function QU(r,e,t){return!r.isSymbolicLink()&&!r.isFile()?!1:_ge(e,t)}function bU(r,e,t){BU.stat(r,function(i,n){t(i,i?!1:QU(n,r,e))})}function $ge(r,e){return QU(BU.statSync(r),r,e)}});var RU=w((q7e,kU)=>{kU.exports=PU;PU.sync=efe;var xU=J(\"fs\");function PU(r,e,t){xU.stat(r,function(i,n){t(i,i?!1:DU(n,e))})}function efe(r,e){return DU(xU.statSync(r),e)}function DU(r,e){return r.isFile()&&tfe(r,e)}function tfe(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt(\"100\",8),l=parseInt(\"010\",8),c=parseInt(\"001\",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var NU=w((W7e,FU)=>{var J7e=J(\"fs\"),lI;process.platform===\"win32\"||global.TESTING_WINDOWS?lI=vU():lI=RU();FU.exports=SS;SS.sync=rfe;function SS(r,e,t){if(typeof e==\"function\"&&(t=e,e={}),!t){if(typeof Promise!=\"function\")throw new TypeError(\"callback not provided\");return new Promise(function(i,n){SS(r,e||{},function(s,o){s?n(s):i(o)})})}lI(r,e||{},function(i,n){i&&(i.code===\"EACCES\"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function rfe(r,e){try{return lI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code===\"EACCES\")return!1;throw t}}});var HU=w((z7e,KU)=>{var Dg=process.platform===\"win32\"||process.env.OSTYPE===\"cygwin\"||process.env.OSTYPE===\"msys\",LU=J(\"path\"),ife=Dg?\";\":\":\",TU=NU(),OU=r=>Object.assign(new Error(`not found: ${r}`),{code:\"ENOENT\"}),MU=(r,e)=>{let t=e.colon||ife,i=r.match(/\\//)||Dg&&r.match(/\\\\/)?[\"\"]:[...Dg?[process.cwd()]:[],...(e.path||process.env.PATH||\"\").split(t)],n=Dg?e.pathExt||process.env.PATHEXT||\".EXE;.CMD;.BAT;.COM\":\"\",s=Dg?n.split(t):[\"\"];return Dg&&r.indexOf(\".\")!==-1&&s[0]!==\"\"&&s.unshift(\"\"),{pathEnv:i,pathExt:s,pathExtExe:n}},UU=(r,e,t)=>{typeof e==\"function\"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=MU(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(OU(r));let f=i[c],h=/^\".*\"$/.test(f)?f.slice(1,-1):f,p=LU.join(h,r),C=!h&&/^\\.[\\\\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];TU(c+p,{pathExt:s},(C,y)=>{if(!C&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},nfe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=MU(r,e),s=[];for(let o=0;o<t.length;o++){let a=t[o],l=/^\".*\"$/.test(a)?a.slice(1,-1):a,c=LU.join(l,r),u=!l&&/^\\.[\\\\\\/]/.test(r)?r.slice(0,2)+c:c;for(let g=0;g<i.length;g++){let f=u+i[g];try{if(TU.sync(f,{pathExt:n}))if(e.all)s.push(f);else return f}catch{}}}if(e.all&&s.length)return s;if(e.nothrow)return null;throw OU(r)};KU.exports=UU;UU.sync=nfe});var YU=w((V7e,vS)=>{\"use strict\";var GU=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!==\"win32\"?\"PATH\":Object.keys(e).reverse().find(i=>i.toUpperCase()===\"PATH\")||\"Path\"};vS.exports=GU;vS.exports.default=GU});var WU=w((X7e,JU)=>{\"use strict\";var jU=J(\"path\"),sfe=HU(),ofe=YU();function qU(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=sfe.sync(r.command,{path:t[ofe({env:t})],pathExt:e?jU.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=jU.resolve(n?r.options.cwd:\"\",o)),o}function afe(r){return qU(r)||qU(r,!0)}JU.exports=afe});var zU=w((Z7e,PS)=>{\"use strict\";var xS=/([()\\][%!^\"`<>&|;, *?])/g;function Afe(r){return r=r.replace(xS,\"^$1\"),r}function lfe(r,e){return r=`${r}`,r=r.replace(/(\\\\*)\"/g,'$1$1\\\\\"'),r=r.replace(/(\\\\*)$/,\"$1$1\"),r=`\"${r}\"`,r=r.replace(xS,\"^$1\"),e&&(r=r.replace(xS,\"^$1\")),r}PS.exports.command=Afe;PS.exports.argument=lfe});var XU=w((_7e,VU)=>{\"use strict\";VU.exports=/^#!(.*)/});var _U=w(($7e,ZU)=>{\"use strict\";var cfe=XU();ZU.exports=(r=\"\")=>{let e=r.match(cfe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,\"\").split(\" \"),n=t.split(\"/\").pop();return n===\"env\"?i:i?`${n} ${i}`:n}});var eK=w((eZe,$U)=>{\"use strict\";var DS=J(\"fs\"),ufe=_U();function gfe(r){let t=Buffer.alloc(150),i;try{i=DS.openSync(r,\"r\"),DS.readSync(i,t,0,150,0),DS.closeSync(i)}catch{}return ufe(t.toString())}$U.exports=gfe});var nK=w((tZe,iK)=>{\"use strict\";var ffe=J(\"path\"),tK=WU(),rK=zU(),hfe=eK(),pfe=process.platform===\"win32\",dfe=/\\.(?:com|exe)$/i,Cfe=/node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;function mfe(r){r.file=tK(r);let e=r.file&&hfe(r.file);return e?(r.args.unshift(r.file),r.command=e,tK(r)):r.file}function Efe(r){if(!pfe)return r;let e=mfe(r),t=!dfe.test(e);if(r.options.forceShell||t){let i=Cfe.test(e);r.command=ffe.normalize(r.command),r.command=rK.command(r.command),r.args=r.args.map(s=>rK.argument(s,i));let n=[r.command].concat(r.args).join(\" \");r.args=[\"/d\",\"/s\",\"/c\",`\"${n}\"`],r.command=process.env.comspec||\"cmd.exe\",r.options.windowsVerbatimArguments=!0}return r}function Ife(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:Efe(i)}iK.exports=Ife});var aK=w((rZe,oK)=>{\"use strict\";var kS=process.platform===\"win32\";function RS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:\"ENOENT\",errno:\"ENOENT\",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function yfe(r,e){if(!kS)return;let t=r.emit;r.emit=function(i,n){if(i===\"exit\"){let s=sK(n,e,\"spawn\");if(s)return t.call(r,\"error\",s)}return t.apply(r,arguments)}}function sK(r,e){return kS&&r===1&&!e.file?RS(e.original,\"spawn\"):null}function wfe(r,e){return kS&&r===1&&!e.file?RS(e.original,\"spawnSync\"):null}oK.exports={hookChildProcess:yfe,verifyENOENT:sK,verifyENOENTSync:wfe,notFoundError:RS}});var LS=w((iZe,kg)=>{\"use strict\";var AK=J(\"child_process\"),FS=nK(),NS=aK();function lK(r,e,t){let i=FS(r,e,t),n=AK.spawn(i.command,i.args,i.options);return NS.hookChildProcess(n,i),n}function Bfe(r,e,t){let i=FS(r,e,t),n=AK.spawnSync(i.command,i.args,i.options);return n.error=n.error||NS.verifyENOENTSync(n.status,i),n}kg.exports=lK;kg.exports.spawn=lK;kg.exports.sync=Bfe;kg.exports._parse=FS;kg.exports._enoent=NS});var uK=w((nZe,cK)=>{\"use strict\";function Qfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Zl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,Zl)}Qfe(Zl,Error);Zl.buildMessage=function(r,e){var t={literal:function(c){return'\"'+n(c.text)+'\"'},class:function(c){var u=\"\",g;for(g=0;g<c.parts.length;g++)u+=c.parts[g]instanceof Array?s(c.parts[g][0])+\"-\"+s(c.parts[g][1]):s(c.parts[g]);return\"[\"+(c.inverted?\"^\":\"\")+u+\"]\"},any:function(c){return\"any character\"},end:function(c){return\"end of input\"},other:function(c){return c.description}};function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}function n(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function s(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function o(c){return t[c.type](c)}function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=o(c[g]);if(u.sort(),u.length>0){for(g=1,f=1;g<u.length;g++)u[g-1]!==u[g]&&(u[f]=u[g],f++);u.length=f}switch(u.length){case 1:return u[0];case 2:return u[0]+\" or \"+u[1];default:return u.slice(0,-1).join(\", \")+\", or \"+u[u.length-1]}}function l(c){return c?'\"'+n(c)+'\"':\"end of input\"}return\"Expected \"+a(r)+\" but \"+l(e)+\" found.\"};function bfe(r,e){e=e!==void 0?e:{};var t={},i={Start:SA},n=SA,s=function(m){return m||[]},o=function(m,b,N){return[{command:m,type:b}].concat(N||[])},a=function(m,b){return[{command:m,type:b||\";\"}]},l=function(m){return m},c=\";\",u=me(\";\",!1),g=\"&\",f=me(\"&\",!1),h=function(m,b){return b?{chain:m,then:b}:{chain:m}},p=function(m,b){return{type:m,line:b}},C=\"&&\",y=me(\"&&\",!1),B=\"||\",v=me(\"||\",!1),D=function(m,b){return b?{...m,then:b}:m},L=function(m,b){return{type:m,chain:b}},H=\"|&\",j=me(\"|&\",!1),$=\"|\",V=me(\"|\",!1),W=\"=\",_=me(\"=\",!1),A=function(m,b){return{name:m,args:[b]}},Ae=function(m){return{name:m,args:[]}},ge=\"(\",re=me(\"(\",!1),O=\")\",F=me(\")\",!1),ue=function(m,b){return{type:\"subshell\",subshell:m,args:b}},pe=\"{\",ke=me(\"{\",!1),Fe=\"}\",Ne=me(\"}\",!1),oe=function(m,b){return{type:\"group\",group:m,args:b}},le=function(m,b){return{type:\"command\",args:b,envs:m}},Be=function(m){return{type:\"envs\",envs:m}},fe=function(m){return m},ae=function(m){return m},qe=/^[0-9]/,ne=Je([[\"0\",\"9\"]],!1,!1),Y=function(m,b,N){return{type:\"redirection\",subtype:b,fd:m!==null?parseInt(m):null,args:[N]}},he=\">>\",ie=me(\">>\",!1),de=\">&\",_e=me(\">&\",!1),Pt=\">\",It=me(\">\",!1),Or=\"<<<\",ii=me(\"<<<\",!1),gi=\"<&\",hr=me(\"<&\",!1),fi=\"<\",ni=me(\"<\",!1),Us=function(m){return{type:\"argument\",segments:[].concat(...m)}},pr=function(m){return m},Ii=\"$'\",rs=me(\"$'\",!1),ga=\"'\",dA=me(\"'\",!1),cg=function(m){return[{type:\"text\",text:m}]},is='\"\"',CA=me('\"\"',!1),fa=function(){return{type:\"text\",text:\"\"}},wp='\"',mA=me('\"',!1),EA=function(m){return m},wr=function(m){return{type:\"arithmetic\",arithmetic:m,quoted:!0}},Ll=function(m){return{type:\"shell\",shell:m,quoted:!0}},ug=function(m){return{type:\"variable\",...m,quoted:!0}},Io=function(m){return{type:\"text\",text:m}},gg=function(m){return{type:\"arithmetic\",arithmetic:m,quoted:!1}},Bp=function(m){return{type:\"shell\",shell:m,quoted:!1}},Qp=function(m){return{type:\"variable\",...m,quoted:!1}},vr=function(m){return{type:\"glob\",pattern:m}},se=/^[^']/,yo=Je([\"'\"],!0,!1),Rn=function(m){return m.join(\"\")},fg=/^[^$\"]/,Qt=Je([\"$\",'\"'],!0,!1),Tl=`\\\\\n`,Fn=me(`\\\\\n`,!1),ns=function(){return\"\"},ss=\"\\\\\",gt=me(\"\\\\\",!1),wo=/^[\\\\$\"`]/,At=Je([\"\\\\\",\"$\",'\"',\"`\"],!1,!1),An=function(m){return m},S=\"\\\\a\",Tt=me(\"\\\\a\",!1),hg=function(){return\"a\"},Ol=\"\\\\b\",bp=me(\"\\\\b\",!1),Sp=function(){return\"\\b\"},vp=/^[Ee]/,xp=Je([\"E\",\"e\"],!1,!1),Pp=function(){return\"\\x1B\"},G=\"\\\\f\",yt=me(\"\\\\f\",!1),IA=function(){return\"\\f\"},Wi=\"\\\\n\",Ml=me(\"\\\\n\",!1),Xe=function(){return`\n`},ha=\"\\\\r\",pg=me(\"\\\\r\",!1),OE=function(){return\"\\r\"},Dp=\"\\\\t\",ME=me(\"\\\\t\",!1),ar=function(){return\"\t\"},Nn=\"\\\\v\",Ul=me(\"\\\\v\",!1),kp=function(){return\"\\v\"},Ks=/^[\\\\'\"?]/,pa=Je([\"\\\\\",\"'\",'\"',\"?\"],!1,!1),ln=function(m){return String.fromCharCode(parseInt(m,16))},Te=\"\\\\x\",dg=me(\"\\\\x\",!1),Kl=\"\\\\u\",Hs=me(\"\\\\u\",!1),Hl=\"\\\\U\",yA=me(\"\\\\U\",!1),Cg=function(m){return String.fromCodePoint(parseInt(m,16))},mg=/^[0-7]/,da=Je([[\"0\",\"7\"]],!1,!1),Ca=/^[0-9a-fA-f]/,rt=Je([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"f\"]],!1,!1),Bo=nt(),wA=\"-\",Gl=me(\"-\",!1),Gs=\"+\",Yl=me(\"+\",!1),UE=\".\",Rp=me(\".\",!1),Eg=function(m,b,N){return{type:\"number\",value:(m===\"-\"?-1:1)*parseFloat(b.join(\"\")+\".\"+N.join(\"\"))}},Fp=function(m,b){return{type:\"number\",value:(m===\"-\"?-1:1)*parseInt(b.join(\"\"))}},KE=function(m){return{type:\"variable\",...m}},jl=function(m){return{type:\"variable\",name:m}},HE=function(m){return m},Ig=\"*\",BA=me(\"*\",!1),Rr=\"/\",GE=me(\"/\",!1),Ys=function(m,b,N){return{type:b===\"*\"?\"multiplication\":\"division\",right:N}},js=function(m,b){return b.reduce((N,K)=>({left:N,...K}),m)},yg=function(m,b,N){return{type:b===\"+\"?\"addition\":\"subtraction\",right:N}},QA=\"$((\",R=me(\"$((\",!1),q=\"))\",Ce=me(\"))\",!1),Ue=function(m){return m},Re=\"$(\",ze=me(\"$(\",!1),dt=function(m){return m},Ft=\"${\",Ln=me(\"${\",!1),Jb=\":-\",P1=me(\":-\",!1),D1=function(m,b){return{name:m,defaultValue:b}},Wb=\":-}\",k1=me(\":-}\",!1),R1=function(m){return{name:m,defaultValue:[]}},zb=\":+\",F1=me(\":+\",!1),N1=function(m,b){return{name:m,alternativeValue:b}},Vb=\":+}\",L1=me(\":+}\",!1),T1=function(m){return{name:m,alternativeValue:[]}},Xb=function(m){return{name:m}},O1=\"$\",M1=me(\"$\",!1),U1=function(m){return e.isGlobPattern(m)},K1=function(m){return m},Zb=/^[a-zA-Z0-9_]/,_b=Je([[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\"],!1,!1),$b=function(){return T()},eS=/^[$@*?#a-zA-Z0-9_\\-]/,tS=Je([\"$\",\"@\",\"*\",\"?\",\"#\",[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\",\"-\"],!1,!1),H1=/^[(){}<>$|&; \\t\"']/,wg=Je([\"(\",\")\",\"{\",\"}\",\"<\",\">\",\"$\",\"|\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),rS=/^[<>&; \\t\"']/,iS=Je([\"<\",\">\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),YE=/^[ \\t]/,jE=Je([\" \",\"\t\"],!1,!1),Q=0,Me=0,bA=[{line:1,column:1}],d=0,E=[],I=0,k;if(\"startRule\"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');n=i[e.startRule]}function T(){return r.substring(Me,Q)}function Z(){return Et(Me,Q)}function te(m,b){throw b=b!==void 0?b:Et(Me,Q),Ri([lt(m)],r.substring(Me,Q),b)}function we(m,b){throw b=b!==void 0?b:Et(Me,Q),Tn(m,b)}function me(m,b){return{type:\"literal\",text:m,ignoreCase:b}}function Je(m,b,N){return{type:\"class\",parts:m,inverted:b,ignoreCase:N}}function nt(){return{type:\"any\"}}function wt(){return{type:\"end\"}}function lt(m){return{type:\"other\",description:m}}function it(m){var b=bA[m],N;if(b)return b;for(N=m-1;!bA[N];)N--;for(b=bA[N],b={line:b.line,column:b.column};N<m;)r.charCodeAt(N)===10?(b.line++,b.column=1):b.column++,N++;return bA[m]=b,b}function Et(m,b){var N=it(m),K=it(b);return{start:{offset:m,line:N.line,column:N.column},end:{offset:b,line:K.line,column:K.column}}}function Qe(m){Q<d||(Q>d&&(d=Q,E=[]),E.push(m))}function Tn(m,b){return new Zl(m,null,null,b)}function Ri(m,b,N){return new Zl(Zl.buildMessage(m,b),m,b,N)}function SA(){var m,b;return m=Q,b=Mr(),b===t&&(b=null),b!==t&&(Me=m,b=s(b)),m=b,m}function Mr(){var m,b,N,K,ce;if(m=Q,b=Ur(),b!==t){for(N=[],K=He();K!==t;)N.push(K),K=He();N!==t?(K=ma(),K!==t?(ce=os(),ce===t&&(ce=null),ce!==t?(Me=m,b=o(b,K,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;if(m===t)if(m=Q,b=Ur(),b!==t){for(N=[],K=He();K!==t;)N.push(K),K=He();N!==t?(K=ma(),K===t&&(K=null),K!==t?(Me=m,b=a(b,K),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function os(){var m,b,N,K,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Mr(),N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();K!==t?(Me=m,b=l(N),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function ma(){var m;return r.charCodeAt(Q)===59?(m=c,Q++):(m=t,I===0&&Qe(u)),m===t&&(r.charCodeAt(Q)===38?(m=g,Q++):(m=t,I===0&&Qe(f))),m}function Ur(){var m,b,N;return m=Q,b=G1(),b!==t?(N=lge(),N===t&&(N=null),N!==t?(Me=m,b=h(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function lge(){var m,b,N,K,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=cge(),N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();if(K!==t)if(ce=Ur(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=p(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function cge(){var m;return r.substr(Q,2)===C?(m=C,Q+=2):(m=t,I===0&&Qe(y)),m===t&&(r.substr(Q,2)===B?(m=B,Q+=2):(m=t,I===0&&Qe(v))),m}function G1(){var m,b,N;return m=Q,b=fge(),b!==t?(N=uge(),N===t&&(N=null),N!==t?(Me=m,b=D(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function uge(){var m,b,N,K,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=gge(),N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();if(K!==t)if(ce=G1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=L(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function gge(){var m;return r.substr(Q,2)===H?(m=H,Q+=2):(m=t,I===0&&Qe(j)),m===t&&(r.charCodeAt(Q)===124?(m=$,Q++):(m=t,I===0&&Qe(V))),m}function qE(){var m,b,N,K,ce,Se;if(m=Q,b=eU(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(_)),N!==t)if(K=q1(),K!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,b=A(b,K),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;else Q=m,m=t;if(m===t)if(m=Q,b=eU(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(_)),N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();K!==t?(Me=m,b=Ae(b),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function fge(){var m,b,N,K,ce,Se,ht,Bt,Jr,hi,as;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===40?(N=ge,Q++):(N=t,I===0&&Qe(re)),N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();if(K!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===41?(ht=O,Q++):(ht=t,I===0&&Qe(F)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Np();hi!==t;)Jr.push(hi),hi=Np();if(Jr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,b=ue(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===123?(N=pe,Q++):(N=t,I===0&&Qe(ke)),N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();if(K!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===125?(ht=Fe,Q++):(ht=t,I===0&&Qe(Ne)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Np();hi!==t;)Jr.push(hi),hi=Np();if(Jr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,b=oe(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){for(N=[],K=qE();K!==t;)N.push(K),K=qE();if(N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();if(K!==t){if(ce=[],Se=j1(),Se!==t)for(;Se!==t;)ce.push(Se),Se=j1();else ce=t;if(ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=le(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],K=qE(),K!==t)for(;K!==t;)N.push(K),K=qE();else N=t;if(N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();K!==t?(Me=m,b=Be(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}}}return m}function Y1(){var m,b,N,K,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],K=JE(),K!==t)for(;K!==t;)N.push(K),K=JE();else N=t;if(N!==t){for(K=[],ce=He();ce!==t;)K.push(ce),ce=He();K!==t?(Me=m,b=fe(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t;return m}function j1(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t?(N=Np(),N!==t?(Me=m,b=ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();b!==t?(N=JE(),N!==t?(Me=m,b=ae(N),m=b):(Q=m,m=t)):(Q=m,m=t)}return m}function Np(){var m,b,N,K,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(qe.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(ne)),N===t&&(N=null),N!==t?(K=hge(),K!==t?(ce=JE(),ce!==t?(Me=m,b=Y(N,K,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function hge(){var m;return r.substr(Q,2)===he?(m=he,Q+=2):(m=t,I===0&&Qe(ie)),m===t&&(r.substr(Q,2)===de?(m=de,Q+=2):(m=t,I===0&&Qe(_e)),m===t&&(r.charCodeAt(Q)===62?(m=Pt,Q++):(m=t,I===0&&Qe(It)),m===t&&(r.substr(Q,3)===Or?(m=Or,Q+=3):(m=t,I===0&&Qe(ii)),m===t&&(r.substr(Q,2)===gi?(m=gi,Q+=2):(m=t,I===0&&Qe(hr)),m===t&&(r.charCodeAt(Q)===60?(m=fi,Q++):(m=t,I===0&&Qe(ni))))))),m}function JE(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(N=q1(),N!==t?(Me=m,b=ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function q1(){var m,b,N;if(m=Q,b=[],N=J1(),N!==t)for(;N!==t;)b.push(N),N=J1();else b=t;return b!==t&&(Me=m,b=Us(b)),m=b,m}function J1(){var m,b;return m=Q,b=pge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=dge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Cge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=mge(),b!==t&&(Me=m,b=pr(b)),m=b))),m}function pge(){var m,b,N,K;return m=Q,r.substr(Q,2)===Ii?(b=Ii,Q+=2):(b=t,I===0&&Qe(rs)),b!==t?(N=yge(),N!==t?(r.charCodeAt(Q)===39?(K=ga,Q++):(K=t,I===0&&Qe(dA)),K!==t?(Me=m,b=cg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function dge(){var m,b,N,K;return m=Q,r.charCodeAt(Q)===39?(b=ga,Q++):(b=t,I===0&&Qe(dA)),b!==t?(N=Ege(),N!==t?(r.charCodeAt(Q)===39?(K=ga,Q++):(K=t,I===0&&Qe(dA)),K!==t?(Me=m,b=cg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function Cge(){var m,b,N,K;if(m=Q,r.substr(Q,2)===is?(b=is,Q+=2):(b=t,I===0&&Qe(CA)),b!==t&&(Me=m,b=fa()),m=b,m===t)if(m=Q,r.charCodeAt(Q)===34?(b=wp,Q++):(b=t,I===0&&Qe(mA)),b!==t){for(N=[],K=W1();K!==t;)N.push(K),K=W1();N!==t?(r.charCodeAt(Q)===34?(K=wp,Q++):(K=t,I===0&&Qe(mA)),K!==t?(Me=m,b=EA(N),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function mge(){var m,b,N;if(m=Q,b=[],N=z1(),N!==t)for(;N!==t;)b.push(N),N=z1();else b=t;return b!==t&&(Me=m,b=EA(b)),m=b,m}function W1(){var m,b;return m=Q,b=_1(),b!==t&&(Me=m,b=wr(b)),m=b,m===t&&(m=Q,b=$1(),b!==t&&(Me=m,b=Ll(b)),m=b,m===t&&(m=Q,b=aS(),b!==t&&(Me=m,b=ug(b)),m=b,m===t&&(m=Q,b=Ige(),b!==t&&(Me=m,b=Io(b)),m=b))),m}function z1(){var m,b;return m=Q,b=_1(),b!==t&&(Me=m,b=gg(b)),m=b,m===t&&(m=Q,b=$1(),b!==t&&(Me=m,b=Bp(b)),m=b,m===t&&(m=Q,b=aS(),b!==t&&(Me=m,b=Qp(b)),m=b,m===t&&(m=Q,b=Qge(),b!==t&&(Me=m,b=vr(b)),m=b,m===t&&(m=Q,b=Bge(),b!==t&&(Me=m,b=Io(b)),m=b)))),m}function Ege(){var m,b,N;for(m=Q,b=[],se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo));N!==t;)b.push(N),se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo));return b!==t&&(Me=m,b=Rn(b)),m=b,m}function Ige(){var m,b,N;if(m=Q,b=[],N=V1(),N===t&&(fg.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt))),N!==t)for(;N!==t;)b.push(N),N=V1(),N===t&&(fg.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt)));else b=t;return b!==t&&(Me=m,b=Rn(b)),m=b,m}function V1(){var m,b,N;return m=Q,r.substr(Q,2)===Tl?(b=Tl,Q+=2):(b=t,I===0&&Qe(Fn)),b!==t&&(Me=m,b=ns()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(wo.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(At)),N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t)),m}function yge(){var m,b,N;for(m=Q,b=[],N=X1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo)));N!==t;)b.push(N),N=X1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo)));return b!==t&&(Me=m,b=Rn(b)),m=b,m}function X1(){var m,b,N;return m=Q,r.substr(Q,2)===S?(b=S,Q+=2):(b=t,I===0&&Qe(Tt)),b!==t&&(Me=m,b=hg()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ol?(b=Ol,Q+=2):(b=t,I===0&&Qe(bp)),b!==t&&(Me=m,b=Sp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(vp.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(xp)),N!==t?(Me=m,b=Pp(),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===G?(b=G,Q+=2):(b=t,I===0&&Qe(yt)),b!==t&&(Me=m,b=IA()),m=b,m===t&&(m=Q,r.substr(Q,2)===Wi?(b=Wi,Q+=2):(b=t,I===0&&Qe(Ml)),b!==t&&(Me=m,b=Xe()),m=b,m===t&&(m=Q,r.substr(Q,2)===ha?(b=ha,Q+=2):(b=t,I===0&&Qe(pg)),b!==t&&(Me=m,b=OE()),m=b,m===t&&(m=Q,r.substr(Q,2)===Dp?(b=Dp,Q+=2):(b=t,I===0&&Qe(ME)),b!==t&&(Me=m,b=ar()),m=b,m===t&&(m=Q,r.substr(Q,2)===Nn?(b=Nn,Q+=2):(b=t,I===0&&Qe(Ul)),b!==t&&(Me=m,b=kp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(Ks.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(pa)),N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=wge()))))))))),m}function wge(){var m,b,N,K,ce,Se,ht,Bt,Jr,hi,as,AS;return m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(N=nS(),N!==t?(Me=m,b=ln(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Te?(b=Te,Q+=2):(b=t,I===0&&Qe(dg)),b!==t?(N=Q,K=Q,ce=nS(),ce!==t?(Se=On(),Se!==t?(ce=[ce,Se],K=ce):(Q=K,K=t)):(Q=K,K=t),K===t&&(K=nS()),K!==t?N=r.substring(N,Q):N=K,N!==t?(Me=m,b=ln(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Kl?(b=Kl,Q+=2):(b=t,I===0&&Qe(Hs)),b!==t?(N=Q,K=Q,ce=On(),ce!==t?(Se=On(),Se!==t?(ht=On(),ht!==t?(Bt=On(),Bt!==t?(ce=[ce,Se,ht,Bt],K=ce):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t),K!==t?N=r.substring(N,Q):N=K,N!==t?(Me=m,b=ln(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Hl?(b=Hl,Q+=2):(b=t,I===0&&Qe(yA)),b!==t?(N=Q,K=Q,ce=On(),ce!==t?(Se=On(),Se!==t?(ht=On(),ht!==t?(Bt=On(),Bt!==t?(Jr=On(),Jr!==t?(hi=On(),hi!==t?(as=On(),as!==t?(AS=On(),AS!==t?(ce=[ce,Se,ht,Bt,Jr,hi,as,AS],K=ce):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t)):(Q=K,K=t),K!==t?N=r.substring(N,Q):N=K,N!==t?(Me=m,b=Cg(N),m=b):(Q=m,m=t)):(Q=m,m=t)))),m}function nS(){var m;return mg.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(da)),m}function On(){var m;return Ca.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(rt)),m}function Bge(){var m,b,N,K,ce;if(m=Q,b=[],N=Q,r.charCodeAt(Q)===92?(K=ss,Q++):(K=t,I===0&&Qe(gt)),K!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,K=An(ce),N=K):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,K=Q,I++,ce=tU(),I--,ce===t?K=void 0:(Q=K,K=t),K!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,K=An(ce),N=K):(Q=N,N=t)):(Q=N,N=t)),N!==t)for(;N!==t;)b.push(N),N=Q,r.charCodeAt(Q)===92?(K=ss,Q++):(K=t,I===0&&Qe(gt)),K!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,K=An(ce),N=K):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,K=Q,I++,ce=tU(),I--,ce===t?K=void 0:(Q=K,K=t),K!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,K=An(ce),N=K):(Q=N,N=t)):(Q=N,N=t));else b=t;return b!==t&&(Me=m,b=Rn(b)),m=b,m}function sS(){var m,b,N,K,ce,Se;if(m=Q,r.charCodeAt(Q)===45?(b=wA,Q++):(b=t,I===0&&Qe(Gl)),b===t&&(r.charCodeAt(Q)===43?(b=Gs,Q++):(b=t,I===0&&Qe(Yl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(K=r.charAt(Q),Q++):(K=t,I===0&&Qe(ne)),K!==t)for(;K!==t;)N.push(K),qe.test(r.charAt(Q))?(K=r.charAt(Q),Q++):(K=t,I===0&&Qe(ne));else N=t;if(N!==t)if(r.charCodeAt(Q)===46?(K=UE,Q++):(K=t,I===0&&Qe(Rp)),K!==t){if(ce=[],qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne));else ce=t;ce!==t?(Me=m,b=Eg(b,N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;if(m===t){if(m=Q,r.charCodeAt(Q)===45?(b=wA,Q++):(b=t,I===0&&Qe(Gl)),b===t&&(r.charCodeAt(Q)===43?(b=Gs,Q++):(b=t,I===0&&Qe(Yl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(K=r.charAt(Q),Q++):(K=t,I===0&&Qe(ne)),K!==t)for(;K!==t;)N.push(K),qe.test(r.charAt(Q))?(K=r.charAt(Q),Q++):(K=t,I===0&&Qe(ne));else N=t;N!==t?(Me=m,b=Fp(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;if(m===t&&(m=Q,b=aS(),b!==t&&(Me=m,b=KE(b)),m=b,m===t&&(m=Q,b=ql(),b!==t&&(Me=m,b=jl(b)),m=b,m===t)))if(m=Q,r.charCodeAt(Q)===40?(b=ge,Q++):(b=t,I===0&&Qe(re)),b!==t){for(N=[],K=He();K!==t;)N.push(K),K=He();if(N!==t)if(K=Z1(),K!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(Q)===41?(Se=O,Q++):(Se=t,I===0&&Qe(F)),Se!==t?(Me=m,b=HE(K),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t}return m}function oS(){var m,b,N,K,ce,Se,ht,Bt;if(m=Q,b=sS(),b!==t){for(N=[],K=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=Ig,Q++):(Se=t,I===0&&Qe(BA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=K,ce=Ys(b,Se,Bt),K=ce):(Q=K,K=t)):(Q=K,K=t)}else Q=K,K=t;else Q=K,K=t;for(;K!==t;){for(N.push(K),K=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=Ig,Q++):(Se=t,I===0&&Qe(BA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=K,ce=Ys(b,Se,Bt),K=ce):(Q=K,K=t)):(Q=K,K=t)}else Q=K,K=t;else Q=K,K=t}N!==t?(Me=m,b=js(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function Z1(){var m,b,N,K,ce,Se,ht,Bt;if(m=Q,b=oS(),b!==t){for(N=[],K=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Gs,Q++):(Se=t,I===0&&Qe(Yl)),Se===t&&(r.charCodeAt(Q)===45?(Se=wA,Q++):(Se=t,I===0&&Qe(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=K,ce=yg(b,Se,Bt),K=ce):(Q=K,K=t)):(Q=K,K=t)}else Q=K,K=t;else Q=K,K=t;for(;K!==t;){for(N.push(K),K=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Gs,Q++):(Se=t,I===0&&Qe(Yl)),Se===t&&(r.charCodeAt(Q)===45?(Se=wA,Q++):(Se=t,I===0&&Qe(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=K,ce=yg(b,Se,Bt),K=ce):(Q=K,K=t)):(Q=K,K=t)}else Q=K,K=t;else Q=K,K=t}N!==t?(Me=m,b=js(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function _1(){var m,b,N,K,ce,Se;if(m=Q,r.substr(Q,3)===QA?(b=QA,Q+=3):(b=t,I===0&&Qe(R)),b!==t){for(N=[],K=He();K!==t;)N.push(K),K=He();if(N!==t)if(K=Z1(),K!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(Q,2)===q?(Se=q,Q+=2):(Se=t,I===0&&Qe(Ce)),Se!==t?(Me=m,b=Ue(K),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;return m}function $1(){var m,b,N,K;return m=Q,r.substr(Q,2)===Re?(b=Re,Q+=2):(b=t,I===0&&Qe(ze)),b!==t?(N=Mr(),N!==t?(r.charCodeAt(Q)===41?(K=O,Q++):(K=t,I===0&&Qe(F)),K!==t?(Me=m,b=dt(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function aS(){var m,b,N,K,ce,Se;return m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,2)===Jb?(K=Jb,Q+=2):(K=t,I===0&&Qe(P1)),K!==t?(ce=Y1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=D1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,3)===Wb?(K=Wb,Q+=3):(K=t,I===0&&Qe(k1)),K!==t?(Me=m,b=R1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,2)===zb?(K=zb,Q+=2):(K=t,I===0&&Qe(F1)),K!==t?(ce=Y1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=N1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,3)===Vb?(K=Vb,Q+=3):(K=t,I===0&&Qe(L1)),K!==t?(Me=m,b=T1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.charCodeAt(Q)===125?(K=Fe,Q++):(K=t,I===0&&Qe(Ne)),K!==t?(Me=m,b=Xb(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.charCodeAt(Q)===36?(b=O1,Q++):(b=t,I===0&&Qe(M1)),b!==t?(N=ql(),N!==t?(Me=m,b=Xb(N),m=b):(Q=m,m=t)):(Q=m,m=t)))))),m}function Qge(){var m,b,N;return m=Q,b=bge(),b!==t?(Me=Q,N=U1(b),N?N=void 0:N=t,N!==t?(Me=m,b=K1(b),m=b):(Q=m,m=t)):(Q=m,m=t),m}function bge(){var m,b,N,K,ce;if(m=Q,b=[],N=Q,K=Q,I++,ce=rU(),I--,ce===t?K=void 0:(Q=K,K=t),K!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,K=An(ce),N=K):(Q=N,N=t)):(Q=N,N=t),N!==t)for(;N!==t;)b.push(N),N=Q,K=Q,I++,ce=rU(),I--,ce===t?K=void 0:(Q=K,K=t),K!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,K=An(ce),N=K):(Q=N,N=t)):(Q=N,N=t);else b=t;return b!==t&&(Me=m,b=Rn(b)),m=b,m}function eU(){var m,b,N;if(m=Q,b=[],Zb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(_b)),N!==t)for(;N!==t;)b.push(N),Zb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(_b));else b=t;return b!==t&&(Me=m,b=$b()),m=b,m}function ql(){var m,b,N;if(m=Q,b=[],eS.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(tS)),N!==t)for(;N!==t;)b.push(N),eS.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(tS));else b=t;return b!==t&&(Me=m,b=$b()),m=b,m}function tU(){var m;return H1.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(wg)),m}function rU(){var m;return rS.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(iS)),m}function He(){var m,b;if(m=[],YE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(jE)),b!==t)for(;b!==t;)m.push(b),YE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(jE));else m=t;return m}if(k=n(),k!==t&&Q===r.length)return k;throw k!==t&&Q<r.length&&Qe(wt()),Ri(E,d<r.length?r.charAt(d):null,d<r.length?Et(d,d+1):Et(d,d))}cK.exports={SyntaxError:Zl,parse:bfe}});var hK=w((mZe,fK)=>{\"use strict\";function Sfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function $l(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,$l)}Sfe($l,Error);$l.buildMessage=function(r,e){var t={literal:function(c){return'\"'+n(c.text)+'\"'},class:function(c){var u=\"\",g;for(g=0;g<c.parts.length;g++)u+=c.parts[g]instanceof Array?s(c.parts[g][0])+\"-\"+s(c.parts[g][1]):s(c.parts[g]);return\"[\"+(c.inverted?\"^\":\"\")+u+\"]\"},any:function(c){return\"any character\"},end:function(c){return\"end of input\"},other:function(c){return c.description}};function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}function n(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function s(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function o(c){return t[c.type](c)}function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=o(c[g]);if(u.sort(),u.length>0){for(g=1,f=1;g<u.length;g++)u[g-1]!==u[g]&&(u[f]=u[g],f++);u.length=f}switch(u.length){case 1:return u[0];case 2:return u[0]+\" or \"+u[1];default:return u.slice(0,-1).join(\", \")+\", or \"+u[u.length-1]}}function l(c){return c?'\"'+n(c)+'\"':\"end of input\"}return\"Expected \"+a(r)+\" but \"+l(e)+\" found.\"};function vfe(r,e){e=e!==void 0?e:{};var t={},i={resolution:le},n=le,s=\"/\",o=ge(\"/\",!1),a=function(ne,Y){return{from:ne,descriptor:Y}},l=function(ne){return{descriptor:ne}},c=\"@\",u=ge(\"@\",!1),g=function(ne,Y){return{fullName:ne,description:Y}},f=function(ne){return{fullName:ne}},h=function(){return W()},p=/^[^\\/@]/,C=re([\"/\",\"@\"],!0,!1),y=/^[^\\/]/,B=re([\"/\"],!0,!1),v=0,D=0,L=[{line:1,column:1}],H=0,j=[],$=0,V;if(\"startRule\"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');n=i[e.startRule]}function W(){return r.substring(D,v)}function _(){return ke(D,v)}function A(ne,Y){throw Y=Y!==void 0?Y:ke(D,v),oe([ue(ne)],r.substring(D,v),Y)}function Ae(ne,Y){throw Y=Y!==void 0?Y:ke(D,v),Ne(ne,Y)}function ge(ne,Y){return{type:\"literal\",text:ne,ignoreCase:Y}}function re(ne,Y,he){return{type:\"class\",parts:ne,inverted:Y,ignoreCase:he}}function O(){return{type:\"any\"}}function F(){return{type:\"end\"}}function ue(ne){return{type:\"other\",description:ne}}function pe(ne){var Y=L[ne],he;if(Y)return Y;for(he=ne-1;!L[he];)he--;for(Y=L[he],Y={line:Y.line,column:Y.column};he<ne;)r.charCodeAt(he)===10?(Y.line++,Y.column=1):Y.column++,he++;return L[ne]=Y,Y}function ke(ne,Y){var he=pe(ne),ie=pe(Y);return{start:{offset:ne,line:he.line,column:he.column},end:{offset:Y,line:ie.line,column:ie.column}}}function Fe(ne){v<H||(v>H&&(H=v,j=[]),j.push(ne))}function Ne(ne,Y){return new $l(ne,null,null,Y)}function oe(ne,Y,he){return new $l($l.buildMessage(ne,Y),ne,Y,he)}function le(){var ne,Y,he,ie;return ne=v,Y=Be(),Y!==t?(r.charCodeAt(v)===47?(he=s,v++):(he=t,$===0&&Fe(o)),he!==t?(ie=Be(),ie!==t?(D=ne,Y=a(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=Be(),Y!==t&&(D=ne,Y=l(Y)),ne=Y),ne}function Be(){var ne,Y,he,ie;return ne=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(he=c,v++):(he=t,$===0&&Fe(u)),he!==t?(ie=qe(),ie!==t?(D=ne,Y=g(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=fe(),Y!==t&&(D=ne,Y=f(Y)),ne=Y),ne}function fe(){var ne,Y,he,ie,de;return ne=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Fe(u)),Y!==t?(he=ae(),he!==t?(r.charCodeAt(v)===47?(ie=s,v++):(ie=t,$===0&&Fe(o)),ie!==t?(de=ae(),de!==t?(D=ne,Y=h(),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=ae(),Y!==t&&(D=ne,Y=h()),ne=Y),ne}function ae(){var ne,Y,he;if(ne=v,Y=[],p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(C)),he!==t)for(;he!==t;)Y.push(he),p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(C));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}function qe(){var ne,Y,he;if(ne=v,Y=[],y.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(B)),he!==t)for(;he!==t;)Y.push(he),y.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(B));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v<r.length&&Fe(F()),oe(j,H<r.length?r.charAt(H):null,H<r.length?ke(H,H+1):ke(H,H))}fK.exports={SyntaxError:$l,parse:vfe}});var tc=w((IZe,ec)=>{\"use strict\";function dK(r){return typeof r>\"u\"||r===null}function xfe(r){return typeof r==\"object\"&&r!==null}function Pfe(r){return Array.isArray(r)?r:dK(r)?[]:[r]}function Dfe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t<i;t+=1)n=s[t],r[n]=e[n];return r}function kfe(r,e){var t=\"\",i;for(i=0;i<e;i+=1)t+=r;return t}function Rfe(r){return r===0&&Number.NEGATIVE_INFINITY===1/r}ec.exports.isNothing=dK;ec.exports.isObject=xfe;ec.exports.toArray=Pfe;ec.exports.repeat=kfe;ec.exports.isNegativeZero=Rfe;ec.exports.extend=Dfe});var Ng=w((yZe,CK)=>{\"use strict\";function Vp(r,e){Error.call(this),this.name=\"YAMLException\",this.reason=r,this.mark=e,this.message=(this.reason||\"(unknown reason)\")+(this.mark?\" \"+this.mark.toString():\"\"),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||\"\"}Vp.prototype=Object.create(Error.prototype);Vp.prototype.constructor=Vp;Vp.prototype.toString=function(e){var t=this.name+\": \";return t+=this.reason||\"(unknown reason)\",!e&&this.mark&&(t+=\" \"+this.mark.toString()),t};CK.exports=Vp});var IK=w((wZe,EK)=>{\"use strict\";var mK=tc();function HS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}HS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i=\"\",n=this.position;n>0&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=\" ... \",n+=5;break}for(s=\"\",o=this.position;o<this.buffer.length&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(o))===-1;)if(o+=1,o-this.position>t/2-1){s=\" ... \",o-=5;break}return a=this.buffer.slice(n,o),mK.repeat(\" \",e)+i+a+s+`\n`+mK.repeat(\" \",e+this.position-n+i.length)+\"^\"};HS.prototype.toString=function(e){var t,i=\"\";return this.name&&(i+='in \"'+this.name+'\" '),i+=\"at line \"+(this.line+1)+\", column \"+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`:\n`+t)),i};EK.exports=HS});var si=w((BZe,wK)=>{\"use strict\";var yK=Ng(),Ffe=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],Nfe=[\"scalar\",\"sequence\",\"mapping\"];function Lfe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Tfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(Ffe.indexOf(t)===-1)throw new yK('Unknown option \"'+t+'\" is met in definition of \"'+r+'\" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Lfe(e.styleAliases||null),Nfe.indexOf(this.kind)===-1)throw new yK('Unknown kind \"'+this.kind+'\" is specified for \"'+r+'\" YAML type.')}wK.exports=Tfe});var rc=w((QZe,QK)=>{\"use strict\";var BK=tc(),dI=Ng(),Ofe=si();function GS(r,e,t){var i=[];return r.include.forEach(function(n){t=GS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Mfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(i);return r}function Lg(r){this.include=r.include||[],this.implicit=r.implicit||[],this.explicit=r.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&e.loadKind!==\"scalar\")throw new dI(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\")}),this.compiledImplicit=GS(this,\"implicit\",[]),this.compiledExplicit=GS(this,\"explicit\",[]),this.compiledTypeMap=Mfe(this.compiledImplicit,this.compiledExplicit)}Lg.DEFAULT=null;Lg.create=function(){var e,t;switch(arguments.length){case 1:e=Lg.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new dI(\"Wrong number of arguments for Schema.create function\")}if(e=BK.toArray(e),t=BK.toArray(t),!e.every(function(i){return i instanceof Lg}))throw new dI(\"Specified list of super schemas (or a single Schema object) contains a non-Schema object.\");if(!t.every(function(i){return i instanceof Ofe}))throw new dI(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");return new Lg({include:e,explicit:t})};QK.exports=Lg});var SK=w((bZe,bK)=>{\"use strict\";var Ufe=si();bK.exports=new Ufe(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(r){return r!==null?r:\"\"}})});var xK=w((SZe,vK)=>{\"use strict\";var Kfe=si();vK.exports=new Kfe(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(r){return r!==null?r:[]}})});var DK=w((vZe,PK)=>{\"use strict\";var Hfe=si();PK.exports=new Hfe(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(r){return r!==null?r:{}}})});var CI=w((xZe,kK)=>{\"use strict\";var Gfe=rc();kK.exports=new Gfe({explicit:[SK(),xK(),DK()]})});var FK=w((PZe,RK)=>{\"use strict\";var Yfe=si();function jfe(r){if(r===null)return!0;var e=r.length;return e===1&&r===\"~\"||e===4&&(r===\"null\"||r===\"Null\"||r===\"NULL\")}function qfe(){return null}function Jfe(r){return r===null}RK.exports=new Yfe(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:jfe,construct:qfe,predicate:Jfe,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})});var LK=w((DZe,NK)=>{\"use strict\";var Wfe=si();function zfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r===\"true\"||r===\"True\"||r===\"TRUE\")||e===5&&(r===\"false\"||r===\"False\"||r===\"FALSE\")}function Vfe(r){return r===\"true\"||r===\"True\"||r===\"TRUE\"}function Xfe(r){return Object.prototype.toString.call(r)===\"[object Boolean]\"}NK.exports=new Wfe(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:zfe,construct:Vfe,predicate:Xfe,represent:{lowercase:function(r){return r?\"true\":\"false\"},uppercase:function(r){return r?\"TRUE\":\"FALSE\"},camelcase:function(r){return r?\"True\":\"False\"}},defaultStyle:\"lowercase\"})});var OK=w((kZe,TK)=>{\"use strict\";var Zfe=tc(),_fe=si();function $fe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function ehe(r){return 48<=r&&r<=55}function the(r){return 48<=r&&r<=57}function rhe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n===\"-\"||n===\"+\")&&(n=r[++t]),n===\"0\"){if(t+1===e)return!0;if(n=r[++t],n===\"b\"){for(t++;t<e;t++)if(n=r[t],n!==\"_\"){if(n!==\"0\"&&n!==\"1\")return!1;i=!0}return i&&n!==\"_\"}if(n===\"x\"){for(t++;t<e;t++)if(n=r[t],n!==\"_\"){if(!$fe(r.charCodeAt(t)))return!1;i=!0}return i&&n!==\"_\"}for(;t<e;t++)if(n=r[t],n!==\"_\"){if(!ehe(r.charCodeAt(t)))return!1;i=!0}return i&&n!==\"_\"}if(n===\"_\")return!1;for(;t<e;t++)if(n=r[t],n!==\"_\"){if(n===\":\")break;if(!the(r.charCodeAt(t)))return!1;i=!0}return!i||n===\"_\"?!1:n!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(r.slice(t))}function ihe(r){var e=r,t=1,i,n,s=[];return e.indexOf(\"_\")!==-1&&(e=e.replace(/_/g,\"\")),i=e[0],(i===\"-\"||i===\"+\")&&(i===\"-\"&&(t=-1),e=e.slice(1),i=e[0]),e===\"0\"?0:i===\"0\"?e[1]===\"b\"?t*parseInt(e.slice(2),2):e[1]===\"x\"?t*parseInt(e,16):t*parseInt(e,8):e.indexOf(\":\")!==-1?(e.split(\":\").forEach(function(o){s.unshift(parseInt(o,10))}),e=0,n=1,s.forEach(function(o){e+=o*n,n*=60}),t*e):t*parseInt(e,10)}function nhe(r){return Object.prototype.toString.call(r)===\"[object Number]\"&&r%1===0&&!Zfe.isNegativeZero(r)}TK.exports=new _fe(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:rhe,construct:ihe,predicate:nhe,represent:{binary:function(r){return r>=0?\"0b\"+r.toString(2):\"-0b\"+r.toString(2).slice(1)},octal:function(r){return r>=0?\"0\"+r.toString(8):\"-0\"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?\"0x\"+r.toString(16).toUpperCase():\"-0x\"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}})});var KK=w((RZe,UK)=>{\"use strict\";var MK=tc(),she=si(),ohe=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function ahe(r){return!(r===null||!ohe.test(r)||r[r.length-1]===\"_\")}function Ahe(r){var e,t,i,n;return e=r.replace(/_/g,\"\").toLowerCase(),t=e[0]===\"-\"?-1:1,n=[],\"+-\".indexOf(e[0])>=0&&(e=e.slice(1)),e===\".inf\"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===\".nan\"?NaN:e.indexOf(\":\")>=0?(e.split(\":\").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var lhe=/^[-+]?[0-9]+e/;function che(r,e){var t;if(isNaN(r))switch(e){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===r)switch(e){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(MK.isNegativeZero(r))return\"-0.0\";return t=r.toString(10),lhe.test(t)?t.replace(\"e\",\".e\"):t}function uhe(r){return Object.prototype.toString.call(r)===\"[object Number]\"&&(r%1!==0||MK.isNegativeZero(r))}UK.exports=new she(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:ahe,construct:Ahe,predicate:uhe,represent:che,defaultStyle:\"lowercase\"})});var YS=w((FZe,HK)=>{\"use strict\";var ghe=rc();HK.exports=new ghe({include:[CI()],implicit:[FK(),LK(),OK(),KK()]})});var jS=w((NZe,GK)=>{\"use strict\";var fhe=rc();GK.exports=new fhe({include:[YS()]})});var JK=w((LZe,qK)=>{\"use strict\";var hhe=si(),YK=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),jK=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function phe(r){return r===null?!1:YK.exec(r)!==null||jK.exec(r)!==null}function dhe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=YK.exec(r),e===null&&(e=jK.exec(r)),e===null)throw new Error(\"Date resolve error\");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+=\"0\";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]===\"-\"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Che(r){return r.toISOString()}qK.exports=new hhe(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:phe,construct:dhe,instanceOf:Date,represent:Che})});var zK=w((TZe,WK)=>{\"use strict\";var mhe=si();function Ehe(r){return r===\"<<\"||r===null}WK.exports=new mhe(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:Ehe})});var ZK=w((OZe,XK)=>{\"use strict\";var ic;try{VK=J,ic=VK(\"buffer\").Buffer}catch{}var VK,Ihe=si(),qS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function yhe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=qS;for(t=0;t<n;t++)if(e=s.indexOf(r.charAt(t)),!(e>64)){if(e<0)return!1;i+=6}return i%8===0}function whe(r){var e,t,i=r.replace(/[\\r\\n=]/g,\"\"),n=i.length,s=qS,o=0,a=[];for(e=0;e<n;e++)e%4===0&&e&&(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),ic?ic.from?ic.from(a):new ic(a):a}function Bhe(r){var e=\"\",t=0,i,n,s=r.length,o=qS;for(i=0;i<s;i++)i%3===0&&i&&(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function Qhe(r){return ic&&ic.isBuffer(r)}XK.exports=new Ihe(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:yhe,construct:whe,predicate:Qhe,represent:Bhe})});var $K=w((UZe,_K)=>{\"use strict\";var bhe=si(),She=Object.prototype.hasOwnProperty,vhe=Object.prototype.toString;function xhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t<i;t+=1){if(n=a[t],o=!1,vhe.call(n)!==\"[object Object]\")return!1;for(s in n)if(She.call(n,s))if(!o)o=!0;else return!1;if(!o)return!1;if(e.indexOf(s)===-1)e.push(s);else return!1}return!0}function Phe(r){return r!==null?r:[]}_K.exports=new bhe(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:xhe,construct:Phe})});var t2=w((KZe,e2)=>{\"use strict\";var Dhe=si(),khe=Object.prototype.toString;function Rhe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e<t;e+=1){if(i=o[e],khe.call(i)!==\"[object Object]\"||(n=Object.keys(i),n.length!==1))return!1;s[e]=[n[0],i[n[0]]]}return!0}function Fhe(r){if(r===null)return[];var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e<t;e+=1)i=o[e],n=Object.keys(i),s[e]=[n[0],i[n[0]]];return s}e2.exports=new Dhe(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:Rhe,construct:Fhe})});var i2=w((HZe,r2)=>{\"use strict\";var Nhe=si(),Lhe=Object.prototype.hasOwnProperty;function The(r){if(r===null)return!0;var e,t=r;for(e in t)if(Lhe.call(t,e)&&t[e]!==null)return!1;return!0}function Ohe(r){return r!==null?r:{}}r2.exports=new Nhe(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:The,construct:Ohe})});var Tg=w((GZe,n2)=>{\"use strict\";var Mhe=rc();n2.exports=new Mhe({include:[jS()],implicit:[JK(),zK()],explicit:[ZK(),$K(),t2(),i2()]})});var o2=w((YZe,s2)=>{\"use strict\";var Uhe=si();function Khe(){return!0}function Hhe(){}function Ghe(){return\"\"}function Yhe(r){return typeof r>\"u\"}s2.exports=new Uhe(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:Khe,construct:Hhe,predicate:Yhe,represent:Ghe})});var A2=w((jZe,a2)=>{\"use strict\";var jhe=si();function qhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\\/([gim]*)$/.exec(r),i=\"\";return!(e[0]===\"/\"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!==\"/\"))}function Jhe(r){var e=r,t=/\\/([gim]*)$/.exec(r),i=\"\";return e[0]===\"/\"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Whe(r){var e=\"/\"+r.source+\"/\";return r.global&&(e+=\"g\"),r.multiline&&(e+=\"m\"),r.ignoreCase&&(e+=\"i\"),e}function zhe(r){return Object.prototype.toString.call(r)===\"[object RegExp]\"}a2.exports=new jhe(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:qhe,construct:Jhe,predicate:zhe,represent:Whe})});var u2=w((qZe,c2)=>{\"use strict\";var mI;try{l2=J,mI=l2(\"esprima\")}catch{typeof window<\"u\"&&(mI=window.esprima)}var l2,Vhe=si();function Xhe(r){if(r===null)return!1;try{var e=\"(\"+r+\")\",t=mI.parse(e,{range:!0});return!(t.type!==\"Program\"||t.body.length!==1||t.body[0].type!==\"ExpressionStatement\"||t.body[0].expression.type!==\"ArrowFunctionExpression\"&&t.body[0].expression.type!==\"FunctionExpression\")}catch{return!1}}function Zhe(r){var e=\"(\"+r+\")\",t=mI.parse(e,{range:!0}),i=[],n;if(t.type!==\"Program\"||t.body.length!==1||t.body[0].type!==\"ExpressionStatement\"||t.body[0].expression.type!==\"ArrowFunctionExpression\"&&t.body[0].expression.type!==\"FunctionExpression\")throw new Error(\"Failed to resolve function\");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type===\"BlockStatement\"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,\"return \"+e.slice(n[0],n[1]))}function _he(r){return r.toString()}function $he(r){return Object.prototype.toString.call(r)===\"[object Function]\"}c2.exports=new Vhe(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:Xhe,construct:Zhe,predicate:$he,represent:_he})});var Xp=w((WZe,f2)=>{\"use strict\";var g2=rc();f2.exports=g2.DEFAULT=new g2({include:[Tg()],explicit:[o2(),A2(),u2()]})});var R2=w((zZe,Zp)=>{\"use strict\";var wa=tc(),I2=Ng(),epe=IK(),y2=Tg(),tpe=Xp(),kA=Object.prototype.hasOwnProperty,EI=1,w2=2,B2=3,II=4,JS=1,rpe=2,h2=3,ipe=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,npe=/[\\x85\\u2028\\u2029]/,spe=/[,\\[\\]\\{\\}]/,Q2=/^(?:!|!!|![a-z\\-]+!)$/i,b2=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function p2(r){return Object.prototype.toString.call(r)}function vo(r){return r===10||r===13}function sc(r){return r===9||r===32}function gn(r){return r===9||r===32||r===10||r===13}function Og(r){return r===44||r===91||r===93||r===123||r===125}function ope(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function ape(r){return r===120?2:r===117?4:r===85?8:0}function Ape(r){return 48<=r&&r<=57?r-48:-1}function d2(r){return r===48?\"\\0\":r===97?\"\\x07\":r===98?\"\\b\":r===116||r===9?\"\t\":r===110?`\n`:r===118?\"\\v\":r===102?\"\\f\":r===114?\"\\r\":r===101?\"\\x1B\":r===32?\" \":r===34?'\"':r===47?\"/\":r===92?\"\\\\\":r===78?\"\\x85\":r===95?\"\\xA0\":r===76?\"\\u2028\":r===80?\"\\u2029\":\"\"}function lpe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var S2=new Array(256),v2=new Array(256);for(nc=0;nc<256;nc++)S2[nc]=d2(nc)?1:0,v2[nc]=d2(nc);var nc;function cpe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||tpe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function x2(r,e){return new I2(e,new epe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw x2(r,e)}function yI(r,e){r.onWarning&&r.onWarning.call(null,x2(r,e))}var C2={YAML:function(e,t,i){var n,s,o;e.version!==null&&ft(e,\"duplication of %YAML directive\"),i.length!==1&&ft(e,\"YAML directive accepts exactly one argument\"),n=/^([0-9]+)\\.([0-9]+)$/.exec(i[0]),n===null&&ft(e,\"ill-formed argument of the YAML directive\"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&ft(e,\"unacceptable YAML version of the document\"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&yI(e,\"unsupported YAML version of the document\")},TAG:function(e,t,i){var n,s;i.length!==2&&ft(e,\"TAG directive accepts exactly two arguments\"),n=i[0],s=i[1],Q2.test(n)||ft(e,\"ill-formed tag handle (first argument) of the TAG directive\"),kA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for \"'+n+'\" tag handle'),b2.test(s)||ft(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[n]=s}};function DA(r,e,t,i){var n,s,o,a;if(e<t){if(a=r.input.slice(e,t),i)for(n=0,s=a.length;n<s;n+=1)o=a.charCodeAt(n),o===9||32<=o&&o<=1114111||ft(r,\"expected valid JSON character\");else ipe.test(a)&&ft(r,\"the stream contains non-printable characters\");r.result+=a}}function m2(r,e,t,i){var n,s,o,a;for(wa.isObject(t)||ft(r,\"cannot merge mappings; the provided source object is unacceptable\"),n=Object.keys(t),o=0,a=n.length;o<a;o+=1)s=n[o],kA.call(e,s)||(e[s]=t[s],i[s]=!0)}function Mg(r,e,t,i,n,s,o,a){var l,c;if(Array.isArray(n))for(n=Array.prototype.slice.call(n),l=0,c=n.length;l<c;l+=1)Array.isArray(n[l])&&ft(r,\"nested arrays are not supported inside keys\"),typeof n==\"object\"&&p2(n[l])===\"[object Object]\"&&(n[l]=\"[object Object]\");if(typeof n==\"object\"&&p2(n)===\"[object Object]\"&&(n=\"[object Object]\"),n=String(n),e===null&&(e={}),i===\"tag:yaml.org,2002:merge\")if(Array.isArray(s))for(l=0,c=s.length;l<c;l+=1)m2(r,e,s[l],t);else m2(r,e,s,t);else!r.json&&!kA.call(t,n)&&kA.call(e,n)&&(r.line=o||r.line,r.position=a||r.position,ft(r,\"duplicated mapping key\")),e[n]=s,delete t[n];return e}function WS(r){var e;e=r.input.charCodeAt(r.position),e===10?r.position++:e===13?(r.position++,r.input.charCodeAt(r.position)===10&&r.position++):ft(r,\"a line break is expected\"),r.line+=1,r.lineStart=r.position}function zr(r,e,t){for(var i=0,n=r.input.charCodeAt(r.position);n!==0;){for(;sc(n);)n=r.input.charCodeAt(++r.position);if(e&&n===35)do n=r.input.charCodeAt(++r.position);while(n!==10&&n!==13&&n!==0);if(vo(n))for(WS(r),n=r.input.charCodeAt(r.position),i++,r.lineIndent=0;n===32;)r.lineIndent++,n=r.input.charCodeAt(++r.position);else break}return t!==-1&&i!==0&&r.lineIndent<t&&yI(r,\"deficient indentation\"),i}function wI(r){var e=r.position,t;return t=r.input.charCodeAt(e),!!((t===45||t===46)&&t===r.input.charCodeAt(e+1)&&t===r.input.charCodeAt(e+2)&&(e+=3,t=r.input.charCodeAt(e),t===0||gn(t)))}function zS(r,e){e===1?r.result+=\" \":e>1&&(r.result+=wa.repeat(`\n`,e-1))}function upe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),gn(h)||Og(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),gn(n)||t&&Og(n)))return!1;for(r.kind=\"scalar\",r.result=\"\",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),gn(n)||t&&Og(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),gn(i))break}else{if(r.position===r.lineStart&&wI(r)||t&&Og(h))break;if(vo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,zr(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(DA(r,s,o,!1),zS(r,r.line-l),s=o=r.position,a=!1),sc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return DA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function gpe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind=\"scalar\",r.result=\"\",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(DA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else vo(t)?(DA(r,i,n,!0),zS(r,zr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&wI(r)?ft(r,\"unexpected end of the document within a single quoted scalar\"):(r.position++,n=r.position);ft(r,\"unexpected end of the stream within a single quoted scalar\")}function fpe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind=\"scalar\",r.result=\"\",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return DA(r,t,r.position,!0),r.position++,!0;if(a===92){if(DA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),vo(a))zr(r,!1,e);else if(a<256&&S2[a])r.result+=v2[a],r.position++;else if((o=ape(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=ope(a))>=0?s=(s<<4)+o:ft(r,\"expected hexadecimal character\");r.result+=lpe(s),r.position++}else ft(r,\"unknown escape sequence\");t=i=r.position}else vo(a)?(DA(r,t,i,!0),zS(r,zr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&wI(r)?ft(r,\"unexpected end of the document within a double quoted scalar\"):(r.position++,i=r.position)}ft(r,\"unexpected end of the stream within a double quoted scalar\")}function hpe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(zr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?\"mapping\":\"sequence\",r.result=s,!0;t||ft(r,\"missed comma between flow collection entries\"),p=h=C=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),gn(a)&&(c=u=!0,r.position++,zr(r,!0,e))),i=r.line,Ug(r,e,EI,!1,!0),p=r.tag,h=r.result,zr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),zr(r,!0,e),Ug(r,e,EI,!1,!0),C=r.result),g?Mg(r,s,f,p,h,C):c?s.push(Mg(r,null,f,p,h,C)):s.push(h),zr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}ft(r,\"unexpected end of the stream within a flow collection\")}function ppe(r,e){var t,i,n=JS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind=\"scalar\",r.result=\"\";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)JS===n?n=g===43?h2:rpe:ft(r,\"repeat of a chomping mode identifier\");else if((u=Ape(g))>=0)u===0?ft(r,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):o?ft(r,\"repeat of an indentation width identifier\"):(a=e+u-1,o=!0);else break;if(sc(g)){do g=r.input.charCodeAt(++r.position);while(sc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!vo(g)&&g!==0)}for(;g!==0;){for(WS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndent<a)&&g===32;)r.lineIndent++,g=r.input.charCodeAt(++r.position);if(!o&&r.lineIndent>a&&(a=r.lineIndent),vo(g)){l++;continue}if(r.lineIndent<a){n===h2?r.result+=wa.repeat(`\n`,s?1+l:l):n===JS&&s&&(r.result+=`\n`);break}for(i?sc(g)?(c=!0,r.result+=wa.repeat(`\n`,s?1+l:l)):c?(c=!1,r.result+=wa.repeat(`\n`,l+1)):l===0?s&&(r.result+=\" \"):r.result+=wa.repeat(`\n`,l):r.result+=wa.repeat(`\n`,s?1+l:l),s=!0,o=!0,l=0,t=r.position;!vo(g)&&g!==0;)g=r.input.charCodeAt(++r.position);DA(r,t,r.position,!1)}return!0}function E2(r,e){var t,i=r.tag,n=r.anchor,s=[],o,a=!1,l;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),l=r.input.charCodeAt(r.position);l!==0&&!(l!==45||(o=r.input.charCodeAt(r.position+1),!gn(o)));){if(a=!0,r.position++,zr(r,!0,-1)&&r.lineIndent<=e){s.push(null),l=r.input.charCodeAt(r.position);continue}if(t=r.line,Ug(r,e,B2,!1,!0),s.push(r.result),zr(r,!0,-1),l=r.input.charCodeAt(r.position),(r.line===t||r.lineIndent>e)&&l!==0)ft(r,\"bad indentation of a sequence entry\");else if(r.lineIndent<e)break}return a?(r.tag=i,r.anchor=n,r.kind=\"sequence\",r.result=s,!0):!1}function dpe(r,e,t){var i,n,s,o,a=r.tag,l=r.anchor,c={},u={},g=null,f=null,h=null,p=!1,C=!1,y;for(r.anchor!==null&&(r.anchorMap[r.anchor]=c),y=r.input.charCodeAt(r.position);y!==0;){if(i=r.input.charCodeAt(r.position+1),s=r.line,o=r.position,(y===63||y===58)&&gn(i))y===63?(p&&(Mg(r,c,u,g,f,null),g=f=h=null),C=!0,p=!0,n=!0):p?(p=!1,n=!0):ft(r,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),r.position+=1,y=i;else if(Ug(r,t,w2,!1,!0))if(r.line===s){for(y=r.input.charCodeAt(r.position);sc(y);)y=r.input.charCodeAt(++r.position);if(y===58)y=r.input.charCodeAt(++r.position),gn(y)||ft(r,\"a whitespace character is expected after the key-value separator within a block mapping\"),p&&(Mg(r,c,u,g,f,null),g=f=h=null),C=!0,p=!1,n=!1,g=r.tag,f=r.result;else if(C)ft(r,\"can not read an implicit mapping pair; a colon is missed\");else return r.tag=a,r.anchor=l,!0}else if(C)ft(r,\"can not read a block mapping entry; a multiline key may not be an implicit key\");else return r.tag=a,r.anchor=l,!0;else break;if((r.line===s||r.lineIndent>e)&&(Ug(r,e,II,!0,n)&&(p?f=r.result:h=r.result),p||(Mg(r,c,u,g,f,h,s,o),g=f=h=null),zr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)ft(r,\"bad indentation of a mapping entry\");else if(r.lineIndent<e)break}return p&&Mg(r,c,u,g,f,null),C&&(r.tag=a,r.anchor=l,r.kind=\"mapping\",r.result=c),C}function Cpe(r){var e,t=!1,i=!1,n,s,o;if(o=r.input.charCodeAt(r.position),o!==33)return!1;if(r.tag!==null&&ft(r,\"duplication of a tag property\"),o=r.input.charCodeAt(++r.position),o===60?(t=!0,o=r.input.charCodeAt(++r.position)):o===33?(i=!0,n=\"!!\",o=r.input.charCodeAt(++r.position)):n=\"!\",e=r.position,t){do o=r.input.charCodeAt(++r.position);while(o!==0&&o!==62);r.position<r.length?(s=r.input.slice(e,r.position),o=r.input.charCodeAt(++r.position)):ft(r,\"unexpected end of the stream within a verbatim tag\")}else{for(;o!==0&&!gn(o);)o===33&&(i?ft(r,\"tag suffix cannot contain exclamation marks\"):(n=r.input.slice(e-1,r.position+1),Q2.test(n)||ft(r,\"named tag handle cannot contain such characters\"),i=!0,e=r.position+1)),o=r.input.charCodeAt(++r.position);s=r.input.slice(e,r.position),spe.test(s)&&ft(r,\"tag suffix cannot contain flow indicator characters\")}return s&&!b2.test(s)&&ft(r,\"tag name cannot contain such characters: \"+s),t?r.tag=s:kA.call(r.tagMap,n)?r.tag=r.tagMap[n]+s:n===\"!\"?r.tag=\"!\"+s:n===\"!!\"?r.tag=\"tag:yaml.org,2002:\"+s:ft(r,'undeclared tag handle \"'+n+'\"'),!0}function mpe(r){var e,t;if(t=r.input.charCodeAt(r.position),t!==38)return!1;for(r.anchor!==null&&ft(r,\"duplication of an anchor property\"),t=r.input.charCodeAt(++r.position),e=r.position;t!==0&&!gn(t)&&!Og(t);)t=r.input.charCodeAt(++r.position);return r.position===e&&ft(r,\"name of an anchor node must contain at least one character\"),r.anchor=r.input.slice(e,r.position),!0}function Epe(r){var e,t,i;if(i=r.input.charCodeAt(r.position),i!==42)return!1;for(i=r.input.charCodeAt(++r.position),e=r.position;i!==0&&!gn(i)&&!Og(i);)i=r.input.charCodeAt(++r.position);return r.position===e&&ft(r,\"name of an alias node must contain at least one character\"),t=r.input.slice(e,r.position),kA.call(r.anchorMap,t)||ft(r,'unidentified alias \"'+t+'\"'),r.result=r.anchorMap[t],zr(r,!0,-1),!0}function Ug(r,e,t,i,n){var s,o,a,l=1,c=!1,u=!1,g,f,h,p,C;if(r.listener!==null&&r.listener(\"open\",r),r.tag=null,r.anchor=null,r.kind=null,r.result=null,s=o=a=II===t||B2===t,i&&zr(r,!0,-1)&&(c=!0,r.lineIndent>e?l=1:r.lineIndent===e?l=0:r.lineIndent<e&&(l=-1)),l===1)for(;Cpe(r)||mpe(r);)zr(r,!0,-1)?(c=!0,a=s,r.lineIndent>e?l=1:r.lineIndent===e?l=0:r.lineIndent<e&&(l=-1)):a=!1;if(a&&(a=c||n),(l===1||II===t)&&(EI===t||w2===t?p=e:p=e+1,C=r.position-r.lineStart,l===1?a&&(E2(r,C)||dpe(r,C,p))||hpe(r,p)?u=!0:(o&&ppe(r,p)||gpe(r,p)||fpe(r,p)?u=!0:Epe(r)?(u=!0,(r.tag!==null||r.anchor!==null)&&ft(r,\"alias node should not have any properties\")):upe(r,p,EI===t)&&(u=!0,r.tag===null&&(r.tag=\"?\")),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):l===0&&(u=a&&E2(r,C))),r.tag!==null&&r.tag!==\"!\")if(r.tag===\"?\"){for(r.result!==null&&r.kind!==\"scalar\"&&ft(r,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+r.kind+'\"'),g=0,f=r.implicitTypes.length;g<f;g+=1)if(h=r.implicitTypes[g],h.resolve(r.result)){r.result=h.construct(r.result),r.tag=h.tag,r.anchor!==null&&(r.anchorMap[r.anchor]=r.result);break}}else kA.call(r.typeMap[r.kind||\"fallback\"],r.tag)?(h=r.typeMap[r.kind||\"fallback\"][r.tag],r.result!==null&&h.kind!==r.kind&&ft(r,\"unacceptable node kind for !<\"+r.tag+'> tag; it should be \"'+h.kind+'\", not \"'+r.kind+'\"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):ft(r,\"cannot resolve a node with !<\"+r.tag+\"> explicit tag\")):ft(r,\"unknown tag !<\"+r.tag+\">\");return r.listener!==null&&r.listener(\"close\",r),r.tag!==null||r.anchor!==null||u}function Ipe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(zr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!gn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&ft(r,\"directive name must not be less than one character in length\");o!==0;){for(;sc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!vo(o));break}if(vo(o))break;for(t=r.position;o!==0&&!gn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&WS(r),kA.call(C2,i)?C2[i](r,i,n):yI(r,'unknown document directive \"'+i+'\"')}if(zr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,zr(r,!0,-1)):s&&ft(r,\"directives end mark is expected\"),Ug(r,r.lineIndent-1,II,!1,!0),zr(r,!0,-1),r.checkLineBreaks&&npe.test(r.input.slice(e,r.position))&&yI(r,\"non-ASCII line breaks are interpreted as content\"),r.documents.push(r.result),r.position===r.lineStart&&wI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,zr(r,!0,-1));return}if(r.position<r.length-1)ft(r,\"end of the stream or a document separator is expected\");else return}function P2(r,e){r=String(r),e=e||{},r.length!==0&&(r.charCodeAt(r.length-1)!==10&&r.charCodeAt(r.length-1)!==13&&(r+=`\n`),r.charCodeAt(0)===65279&&(r=r.slice(1)));var t=new cpe(r,e),i=r.indexOf(\"\\0\");for(i!==-1&&(t.position=i,ft(t,\"null byte is not allowed in input\")),t.input+=\"\\0\";t.input.charCodeAt(t.position)===32;)t.lineIndent+=1,t.position+=1;for(;t.position<t.length-1;)Ipe(t);return t.documents}function D2(r,e,t){e!==null&&typeof e==\"object\"&&typeof t>\"u\"&&(t=e,e=null);var i=P2(r,t);if(typeof e!=\"function\")return i;for(var n=0,s=i.length;n<s;n+=1)e(i[n])}function k2(r,e){var t=P2(r,e);if(t.length!==0){if(t.length===1)return t[0];throw new I2(\"expected a single document in the stream, but found more\")}}function ype(r,e,t){return typeof e==\"object\"&&e!==null&&typeof t>\"u\"&&(t=e,e=null),D2(r,e,wa.extend({schema:y2},t))}function wpe(r,e){return k2(r,wa.extend({schema:y2},e))}Zp.exports.loadAll=D2;Zp.exports.load=k2;Zp.exports.safeLoadAll=ype;Zp.exports.safeLoad=wpe});var tH=w((VZe,_S)=>{\"use strict\";var $p=tc(),ed=Ng(),Bpe=Xp(),Qpe=Tg(),K2=Object.prototype.toString,H2=Object.prototype.hasOwnProperty,bpe=9,_p=10,Spe=13,vpe=32,xpe=33,Ppe=34,G2=35,Dpe=37,kpe=38,Rpe=39,Fpe=42,Y2=44,Npe=45,j2=58,Lpe=61,Tpe=62,Ope=63,Mpe=64,q2=91,J2=93,Upe=96,W2=123,Kpe=124,z2=125,Ni={};Ni[0]=\"\\\\0\";Ni[7]=\"\\\\a\";Ni[8]=\"\\\\b\";Ni[9]=\"\\\\t\";Ni[10]=\"\\\\n\";Ni[11]=\"\\\\v\";Ni[12]=\"\\\\f\";Ni[13]=\"\\\\r\";Ni[27]=\"\\\\e\";Ni[34]='\\\\\"';Ni[92]=\"\\\\\\\\\";Ni[133]=\"\\\\N\";Ni[160]=\"\\\\_\";Ni[8232]=\"\\\\L\";Ni[8233]=\"\\\\P\";var Hpe=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"];function Gpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n<s;n+=1)o=i[n],a=String(e[o]),o.slice(0,2)===\"!!\"&&(o=\"tag:yaml.org,2002:\"+o.slice(2)),l=r.compiledTypeMap.fallback[o],l&&H2.call(l.styleAliases,a)&&(a=l.styleAliases[a]),t[o]=a;return t}function F2(r){var e,t,i;if(e=r.toString(16).toUpperCase(),r<=255)t=\"x\",i=2;else if(r<=65535)t=\"u\",i=4;else if(r<=4294967295)t=\"U\",i=8;else throw new ed(\"code point within a string may not be greater than 0xFFFFFFFF\");return\"\\\\\"+t+$p.repeat(\"0\",i-e.length)+e}function Ype(r){this.schema=r.schema||Bpe,this.indent=Math.max(1,r.indent||2),this.noArrayIndent=r.noArrayIndent||!1,this.skipInvalid=r.skipInvalid||!1,this.flowLevel=$p.isNothing(r.flowLevel)?-1:r.flowLevel,this.styleMap=Gpe(this.schema,r.styles||null),this.sortKeys=r.sortKeys||!1,this.lineWidth=r.lineWidth||80,this.noRefs=r.noRefs||!1,this.noCompatMode=r.noCompatMode||!1,this.condenseFlow=r.condenseFlow||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function N2(r,e){for(var t=$p.repeat(\" \",e),i=0,n=-1,s=\"\",o,a=r.length;i<a;)n=r.indexOf(`\n`,i),n===-1?(o=r.slice(i),i=a):(o=r.slice(i,n+1),i=n+1),o.length&&o!==`\n`&&(s+=t),s+=o;return s}function VS(r,e){return`\n`+$p.repeat(\" \",r.indent*e)}function jpe(r,e){var t,i,n;for(t=0,i=r.implicitTypes.length;t<i;t+=1)if(n=r.implicitTypes[t],n.resolve(e))return!0;return!1}function ZS(r){return r===vpe||r===bpe}function Kg(r){return 32<=r&&r<=126||161<=r&&r<=55295&&r!==8232&&r!==8233||57344<=r&&r<=65533&&r!==65279||65536<=r&&r<=1114111}function qpe(r){return Kg(r)&&!ZS(r)&&r!==65279&&r!==Spe&&r!==_p}function L2(r,e){return Kg(r)&&r!==65279&&r!==Y2&&r!==q2&&r!==J2&&r!==W2&&r!==z2&&r!==j2&&(r!==G2||e&&qpe(e))}function Jpe(r){return Kg(r)&&r!==65279&&!ZS(r)&&r!==Npe&&r!==Ope&&r!==j2&&r!==Y2&&r!==q2&&r!==J2&&r!==W2&&r!==z2&&r!==G2&&r!==kpe&&r!==Fpe&&r!==xpe&&r!==Kpe&&r!==Lpe&&r!==Tpe&&r!==Rpe&&r!==Ppe&&r!==Dpe&&r!==Mpe&&r!==Upe}function V2(r){var e=/^\\n* /;return e.test(r)}var X2=1,Z2=2,_2=3,$2=4,BI=5;function Wpe(r,e,t,i,n){var s,o,a,l=!1,c=!1,u=i!==-1,g=-1,f=Jpe(r.charCodeAt(0))&&!ZS(r.charCodeAt(r.length-1));if(e)for(s=0;s<r.length;s++){if(o=r.charCodeAt(s),!Kg(o))return BI;a=s>0?r.charCodeAt(s-1):null,f=f&&L2(o,a)}else{for(s=0;s<r.length;s++){if(o=r.charCodeAt(s),o===_p)l=!0,u&&(c=c||s-g-1>i&&r[g+1]!==\" \",g=s);else if(!Kg(o))return BI;a=s>0?r.charCodeAt(s-1):null,f=f&&L2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==\" \"}return!l&&!c?f&&!n(r)?X2:Z2:t>9&&V2(r)?BI:c?$2:_2}function zpe(r,e,t,i){r.dump=function(){if(e.length===0)return\"''\";if(!r.noCompatMode&&Hpe.indexOf(e)!==-1)return\"'\"+e+\"'\";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return jpe(r,l)}switch(Wpe(e,o,r.indent,s,a)){case X2:return e;case Z2:return\"'\"+e.replace(/'/g,\"''\")+\"'\";case _2:return\"|\"+T2(e,r.indent)+O2(N2(e,n));case $2:return\">\"+T2(e,r.indent)+O2(N2(Vpe(e,s),n));case BI:return'\"'+Xpe(e,s)+'\"';default:throw new ed(\"impossible error: invalid scalar style\")}}()}function T2(r,e){var t=V2(r)?String(e):\"\",i=r[r.length-1]===`\n`,n=i&&(r[r.length-2]===`\n`||r===`\n`),s=n?\"+\":i?\"\":\"-\";return t+s+`\n`}function O2(r){return r[r.length-1]===`\n`?r.slice(0,-1):r}function Vpe(r,e){for(var t=/(\\n+)([^\\n]*)/g,i=function(){var c=r.indexOf(`\n`);return c=c!==-1?c:r.length,t.lastIndex=c,M2(r.slice(0,c),e)}(),n=r[0]===`\n`||r[0]===\" \",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===\" \",i+=a+(!n&&!s&&l!==\"\"?`\n`:\"\")+M2(l,e),n=s}return i}function M2(r,e){if(r===\"\"||r[0]===\" \")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l=\"\";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=`\n`+r.slice(n,s),n=s+1),o=a;return l+=`\n`,r.length-n>e&&o>n?l+=r.slice(n,o)+`\n`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Xpe(r){for(var e=\"\",t,i,n,s=0;s<r.length;s++){if(t=r.charCodeAt(s),t>=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=F2((t-55296)*1024+i-56320+65536),s++;continue}n=Ni[t],e+=!n&&Kg(t)?r[s]:n||F2(t)}return e}function Zpe(r,e,t){var i=\"\",n=r.tag,s,o;for(s=0,o=t.length;s<o;s+=1)oc(r,e,t[s],!1,!1)&&(s!==0&&(i+=\",\"+(r.condenseFlow?\"\":\" \")),i+=r.dump);r.tag=n,r.dump=\"[\"+i+\"]\"}function _pe(r,e,t,i){var n=\"\",s=r.tag,o,a;for(o=0,a=t.length;o<a;o+=1)oc(r,e+1,t[o],!0,!0)&&((!i||o!==0)&&(n+=VS(r,e)),r.dump&&_p===r.dump.charCodeAt(0)?n+=\"-\":n+=\"- \",n+=r.dump);r.tag=s,r.dump=n||\"[]\"}function $pe(r,e,t){var i=\"\",n=r.tag,s=Object.keys(t),o,a,l,c,u;for(o=0,a=s.length;o<a;o+=1)u=\"\",o!==0&&(u+=\", \"),r.condenseFlow&&(u+='\"'),l=s[o],c=t[l],oc(r,e,l,!1,!1)&&(r.dump.length>1024&&(u+=\"? \"),u+=r.dump+(r.condenseFlow?'\"':\"\")+\":\"+(r.condenseFlow?\"\":\" \"),oc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump=\"{\"+i+\"}\"}function ede(r,e,t,i){var n=\"\",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys==\"function\")o.sort(r.sortKeys);else if(r.sortKeys)throw new ed(\"sortKeys must be a boolean or a function\");for(a=0,l=o.length;a<l;a+=1)f=\"\",(!i||a!==0)&&(f+=VS(r,e)),c=o[a],u=t[c],oc(r,e+1,c,!0,!0,!0)&&(g=r.tag!==null&&r.tag!==\"?\"||r.dump&&r.dump.length>1024,g&&(r.dump&&_p===r.dump.charCodeAt(0)?f+=\"?\":f+=\"? \"),f+=r.dump,g&&(f+=VS(r,e)),oc(r,e+1,u,!0,g)&&(r.dump&&_p===r.dump.charCodeAt(0)?f+=\":\":f+=\": \",f+=r.dump,n+=f));r.tag=s,r.dump=n||\"{}\"}function U2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s<o;s+=1)if(a=n[s],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof e==\"object\"&&e instanceof a.instanceOf)&&(!a.predicate||a.predicate(e))){if(r.tag=t?a.tag:\"?\",a.represent){if(l=r.styleMap[a.tag]||a.defaultStyle,K2.call(a.represent)===\"[object Function]\")i=a.represent(e,l);else if(H2.call(a.represent,l))i=a.represent[l](e,l);else throw new ed(\"!<\"+a.tag+'> tag resolver accepts not \"'+l+'\" style');r.dump=i}return!0}return!1}function oc(r,e,t,i,n,s){r.tag=null,r.dump=t,U2(r,t,!1)||U2(r,t,!0);var o=K2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o===\"[object Object]\"||o===\"[object Array]\",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!==\"?\"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump=\"*ref_\"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o===\"[object Object]\")i&&Object.keys(r.dump).length!==0?(ede(r,e,r.dump,n),c&&(r.dump=\"&ref_\"+l+r.dump)):($pe(r,e,r.dump),c&&(r.dump=\"&ref_\"+l+\" \"+r.dump));else if(o===\"[object Array]\"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(_pe(r,u,r.dump,n),c&&(r.dump=\"&ref_\"+l+r.dump)):(Zpe(r,u,r.dump),c&&(r.dump=\"&ref_\"+l+\" \"+r.dump))}else if(o===\"[object String]\")r.tag!==\"?\"&&zpe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new ed(\"unacceptable kind of an object to dump \"+o)}r.tag!==null&&r.tag!==\"?\"&&(r.dump=\"!<\"+r.tag+\"> \"+r.dump)}return!0}function tde(r,e){var t=[],i=[],n,s;for(XS(r,t,i),n=0,s=i.length;n<s;n+=1)e.duplicates.push(t[i[n]]);e.usedDuplicates=new Array(s)}function XS(r,e,t){var i,n,s;if(r!==null&&typeof r==\"object\")if(n=e.indexOf(r),n!==-1)t.indexOf(n)===-1&&t.push(n);else if(e.push(r),Array.isArray(r))for(n=0,s=r.length;n<s;n+=1)XS(r[n],e,t);else for(i=Object.keys(r),n=0,s=i.length;n<s;n+=1)XS(r[i[n]],e,t)}function eH(r,e){e=e||{};var t=new Ype(e);return t.noRefs||tde(r,t),oc(t,0,r,!0,!0)?t.dump+`\n`:\"\"}function rde(r,e){return eH(r,$p.extend({schema:Qpe},e))}_S.exports.dump=eH;_S.exports.safeDump=rde});var iH=w((XZe,Fr)=>{\"use strict\";var QI=R2(),rH=tH();function bI(r){return function(){throw new Error(\"Function \"+r+\" is deprecated and cannot be used.\")}}Fr.exports.Type=si();Fr.exports.Schema=rc();Fr.exports.FAILSAFE_SCHEMA=CI();Fr.exports.JSON_SCHEMA=YS();Fr.exports.CORE_SCHEMA=jS();Fr.exports.DEFAULT_SAFE_SCHEMA=Tg();Fr.exports.DEFAULT_FULL_SCHEMA=Xp();Fr.exports.load=QI.load;Fr.exports.loadAll=QI.loadAll;Fr.exports.safeLoad=QI.safeLoad;Fr.exports.safeLoadAll=QI.safeLoadAll;Fr.exports.dump=rH.dump;Fr.exports.safeDump=rH.safeDump;Fr.exports.YAMLException=Ng();Fr.exports.MINIMAL_SCHEMA=CI();Fr.exports.SAFE_SCHEMA=Tg();Fr.exports.DEFAULT_SCHEMA=Xp();Fr.exports.scan=bI(\"scan\");Fr.exports.parse=bI(\"parse\");Fr.exports.compose=bI(\"compose\");Fr.exports.addConstructor=bI(\"addConstructor\")});var sH=w((ZZe,nH)=>{\"use strict\";var ide=iH();nH.exports=ide});var aH=w((_Ze,oH)=>{\"use strict\";function nde(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function ac(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,ac)}nde(ac,Error);ac.buildMessage=function(r,e){var t={literal:function(c){return'\"'+n(c.text)+'\"'},class:function(c){var u=\"\",g;for(g=0;g<c.parts.length;g++)u+=c.parts[g]instanceof Array?s(c.parts[g][0])+\"-\"+s(c.parts[g][1]):s(c.parts[g]);return\"[\"+(c.inverted?\"^\":\"\")+u+\"]\"},any:function(c){return\"any character\"},end:function(c){return\"end of input\"},other:function(c){return c.description}};function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}function n(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function s(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function o(c){return t[c.type](c)}function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=o(c[g]);if(u.sort(),u.length>0){for(g=1,f=1;g<u.length;g++)u[g-1]!==u[g]&&(u[f]=u[g],f++);u.length=f}switch(u.length){case 1:return u[0];case 2:return u[0]+\" or \"+u[1];default:return u.slice(0,-1).join(\", \")+\", or \"+u[u.length-1]}}function l(c){return c?'\"'+n(c)+'\"':\"end of input\"}return\"Expected \"+a(r)+\" but \"+l(e)+\" found.\"};function sde(r,e){e=e!==void 0?e:{};var t={},i={Start:Hs},n=Hs,s=function(R){return[].concat(...R)},o=\"-\",a=ar(\"-\",!1),l=function(R){return R},c=function(R){return Object.assign({},...R)},u=\"#\",g=ar(\"#\",!1),f=Ul(),h=function(){return{}},p=\":\",C=ar(\":\",!1),y=function(R,q){return{[R]:q}},B=\",\",v=ar(\",\",!1),D=function(R,q){return q},L=function(R,q,Ce){return Object.assign({},...[R].concat(q).map(Ue=>({[Ue]:Ce})))},H=function(R){return R},j=function(R){return R},$=Ks(\"correct indentation\"),V=\" \",W=ar(\" \",!1),_=function(R){return R.length===QA*yg},A=function(R){return R.length===(QA+1)*yg},Ae=function(){return QA++,!0},ge=function(){return QA--,!0},re=function(){return pg()},O=Ks(\"pseudostring\"),F=/^[^\\r\\n\\t ?:,\\][{}#&*!|>'\"%@`\\-]/,ue=Nn([\"\\r\",`\n`,\"\t\",\" \",\"?\",\":\",\",\",\"]\",\"[\",\"{\",\"}\",\"#\",\"&\",\"*\",\"!\",\"|\",\">\",\"'\",'\"',\"%\",\"@\",\"`\",\"-\"],!0,!1),pe=/^[^\\r\\n\\t ,\\][{}:#\"']/,ke=Nn([\"\\r\",`\n`,\"\t\",\" \",\",\",\"]\",\"[\",\"{\",\"}\",\":\",\"#\",'\"',\"'\"],!0,!1),Fe=function(){return pg().replace(/^ *| *$/g,\"\")},Ne=\"--\",oe=ar(\"--\",!1),le=/^[a-zA-Z\\/0-9]/,Be=Nn([[\"a\",\"z\"],[\"A\",\"Z\"],\"/\",[\"0\",\"9\"]],!1,!1),fe=/^[^\\r\\n\\t :,]/,ae=Nn([\"\\r\",`\n`,\"\t\",\" \",\":\",\",\"],!0,!1),qe=\"null\",ne=ar(\"null\",!1),Y=function(){return null},he=\"true\",ie=ar(\"true\",!1),de=function(){return!0},_e=\"false\",Pt=ar(\"false\",!1),It=function(){return!1},Or=Ks(\"string\"),ii='\"',gi=ar('\"',!1),hr=function(){return\"\"},fi=function(R){return R},ni=function(R){return R.join(\"\")},Us=/^[^\"\\\\\\0-\\x1F\\x7F]/,pr=Nn(['\"',\"\\\\\",[\"\\0\",\"\u001f\"],\"\\x7F\"],!0,!1),Ii='\\\\\"',rs=ar('\\\\\"',!1),ga=function(){return'\"'},dA=\"\\\\\\\\\",cg=ar(\"\\\\\\\\\",!1),is=function(){return\"\\\\\"},CA=\"\\\\/\",fa=ar(\"\\\\/\",!1),wp=function(){return\"/\"},mA=\"\\\\b\",EA=ar(\"\\\\b\",!1),wr=function(){return\"\\b\"},Ll=\"\\\\f\",ug=ar(\"\\\\f\",!1),Io=function(){return\"\\f\"},gg=\"\\\\n\",Bp=ar(\"\\\\n\",!1),Qp=function(){return`\n`},vr=\"\\\\r\",se=ar(\"\\\\r\",!1),yo=function(){return\"\\r\"},Rn=\"\\\\t\",fg=ar(\"\\\\t\",!1),Qt=function(){return\"\t\"},Tl=\"\\\\u\",Fn=ar(\"\\\\u\",!1),ns=function(R,q,Ce,Ue){return String.fromCharCode(parseInt(`0x${R}${q}${Ce}${Ue}`))},ss=/^[0-9a-fA-F]/,gt=Nn([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"F\"]],!1,!1),wo=Ks(\"blank space\"),At=/^[ \\t]/,An=Nn([\" \",\"\t\"],!1,!1),S=Ks(\"white space\"),Tt=/^[ \\t\\n\\r]/,hg=Nn([\" \",\"\t\",`\n`,\"\\r\"],!1,!1),Ol=`\\r\n`,bp=ar(`\\r\n`,!1),Sp=`\n`,vp=ar(`\n`,!1),xp=\"\\r\",Pp=ar(\"\\r\",!1),G=0,yt=0,IA=[{line:1,column:1}],Wi=0,Ml=[],Xe=0,ha;if(\"startRule\"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');n=i[e.startRule]}function pg(){return r.substring(yt,G)}function OE(){return ln(yt,G)}function Dp(R,q){throw q=q!==void 0?q:ln(yt,G),Kl([Ks(R)],r.substring(yt,G),q)}function ME(R,q){throw q=q!==void 0?q:ln(yt,G),dg(R,q)}function ar(R,q){return{type:\"literal\",text:R,ignoreCase:q}}function Nn(R,q,Ce){return{type:\"class\",parts:R,inverted:q,ignoreCase:Ce}}function Ul(){return{type:\"any\"}}function kp(){return{type:\"end\"}}function Ks(R){return{type:\"other\",description:R}}function pa(R){var q=IA[R],Ce;if(q)return q;for(Ce=R-1;!IA[Ce];)Ce--;for(q=IA[Ce],q={line:q.line,column:q.column};Ce<R;)r.charCodeAt(Ce)===10?(q.line++,q.column=1):q.column++,Ce++;return IA[R]=q,q}function ln(R,q){var Ce=pa(R),Ue=pa(q);return{start:{offset:R,line:Ce.line,column:Ce.column},end:{offset:q,line:Ue.line,column:Ue.column}}}function Te(R){G<Wi||(G>Wi&&(Wi=G,Ml=[]),Ml.push(R))}function dg(R,q){return new ac(R,null,null,q)}function Kl(R,q,Ce){return new ac(ac.buildMessage(R,q),R,q,Ce)}function Hs(){var R;return R=Cg(),R}function Hl(){var R,q,Ce;for(R=G,q=[],Ce=yA();Ce!==t;)q.push(Ce),Ce=yA();return q!==t&&(yt=R,q=s(q)),R=q,R}function yA(){var R,q,Ce,Ue,Re;return R=G,q=Ca(),q!==t?(r.charCodeAt(G)===45?(Ce=o,G++):(Ce=t,Xe===0&&Te(a)),Ce!==t?(Ue=Rr(),Ue!==t?(Re=da(),Re!==t?(yt=R,q=l(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function Cg(){var R,q,Ce;for(R=G,q=[],Ce=mg();Ce!==t;)q.push(Ce),Ce=mg();return q!==t&&(yt=R,q=c(q)),R=q,R}function mg(){var R,q,Ce,Ue,Re,ze,dt,Ft,Ln;if(R=G,q=Rr(),q===t&&(q=null),q!==t){if(Ce=G,r.charCodeAt(G)===35?(Ue=u,G++):(Ue=t,Xe===0&&Te(g)),Ue!==t){if(Re=[],ze=G,dt=G,Xe++,Ft=js(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t),ze!==t)for(;ze!==t;)Re.push(ze),ze=G,dt=G,Xe++,Ft=js(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t);else Re=t;Re!==t?(Ue=[Ue,Re],Ce=Ue):(G=Ce,Ce=t)}else G=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(Ue=[],Re=Ys(),Re!==t)for(;Re!==t;)Ue.push(Re),Re=Ys();else Ue=t;Ue!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=Ca(),q!==t?(Ce=Gl(),Ce!==t?(Ue=Rr(),Ue===t&&(Ue=null),Ue!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=da(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Ca(),q!==t?(Ce=Gs(),Ce!==t?(Ue=Rr(),Ue===t&&(Ue=null),Ue!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=da(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=Ca(),q!==t)if(Ce=Gs(),Ce!==t)if(Ue=Rr(),Ue!==t)if(Re=UE(),Re!==t){if(ze=[],dt=Ys(),dt!==t)for(;dt!==t;)ze.push(dt),dt=Ys();else ze=t;ze!==t?(yt=R,q=y(Ce,Re),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=Ca(),q!==t)if(Ce=Gs(),Ce!==t){if(Ue=[],Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Ln=Gs(),Ln!==t?(yt=Re,ze=D(Ce,Ln),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t),Re!==t)for(;Re!==t;)Ue.push(Re),Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Ln=Gs(),Ln!==t?(yt=Re,ze=D(Ce,Ln),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t);else Ue=t;Ue!==t?(Re=Rr(),Re===t&&(Re=null),Re!==t?(r.charCodeAt(G)===58?(ze=p,G++):(ze=t,Xe===0&&Te(C)),ze!==t?(dt=Rr(),dt===t&&(dt=null),dt!==t?(Ft=da(),Ft!==t?(yt=R,q=L(Ce,Ue,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function da(){var R,q,Ce,Ue,Re,ze,dt;if(R=G,q=G,Xe++,Ce=G,Ue=js(),Ue!==t?(Re=rt(),Re!==t?(r.charCodeAt(G)===45?(ze=o,G++):(ze=t,Xe===0&&Te(a)),ze!==t?(dt=Rr(),dt!==t?(Ue=[Ue,Re,ze,dt],Ce=Ue):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t),Xe--,Ce!==t?(G=q,q=void 0):q=t,q!==t?(Ce=Ys(),Ce!==t?(Ue=Bo(),Ue!==t?(Re=Hl(),Re!==t?(ze=wA(),ze!==t?(yt=R,q=H(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=js(),q!==t?(Ce=Bo(),Ce!==t?(Ue=Cg(),Ue!==t?(Re=wA(),Re!==t?(yt=R,q=H(Ue),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=Yl(),q!==t){if(Ce=[],Ue=Ys(),Ue!==t)for(;Ue!==t;)Ce.push(Ue),Ue=Ys();else Ce=t;Ce!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function Ca(){var R,q,Ce;for(Xe++,R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=_(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),Xe--,R===t&&(q=t,Xe===0&&Te($)),R}function rt(){var R,q,Ce;for(R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=A(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),R}function Bo(){var R;return yt=G,R=Ae(),R?R=void 0:R=t,R}function wA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function Gl(){var R;return R=jl(),R===t&&(R=Rp()),R}function Gs(){var R,q,Ce;if(R=jl(),R===t){if(R=G,q=[],Ce=Eg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Eg();else q=t;q!==t&&(yt=R,q=re()),R=q}return R}function Yl(){var R;return R=Fp(),R===t&&(R=KE(),R===t&&(R=jl(),R===t&&(R=Rp()))),R}function UE(){var R;return R=Fp(),R===t&&(R=jl(),R===t&&(R=Eg())),R}function Rp(){var R,q,Ce,Ue,Re,ze;if(Xe++,R=G,F.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ue)),q!==t){for(Ce=[],Ue=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(pe.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ue=Re):(G=Ue,Ue=t)):(G=Ue,Ue=t);Ue!==t;)Ce.push(Ue),Ue=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(pe.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ue=Re):(G=Ue,Ue=t)):(G=Ue,Ue=t);Ce!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(O)),R}function Eg(){var R,q,Ce,Ue,Re;if(R=G,r.substr(G,2)===Ne?(q=Ne,G+=2):(q=t,Xe===0&&Te(oe)),q===t&&(q=null),q!==t)if(le.test(r.charAt(G))?(Ce=r.charAt(G),G++):(Ce=t,Xe===0&&Te(Be)),Ce!==t){for(Ue=[],fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(ae));Re!==t;)Ue.push(Re),fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(ae));Ue!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function Fp(){var R,q;return R=G,r.substr(G,4)===qe?(q=qe,G+=4):(q=t,Xe===0&&Te(ne)),q!==t&&(yt=R,q=Y()),R=q,R}function KE(){var R,q;return R=G,r.substr(G,4)===he?(q=he,G+=4):(q=t,Xe===0&&Te(ie)),q!==t&&(yt=R,q=de()),R=q,R===t&&(R=G,r.substr(G,5)===_e?(q=_e,G+=5):(q=t,Xe===0&&Te(Pt)),q!==t&&(yt=R,q=It()),R=q),R}function jl(){var R,q,Ce,Ue;return Xe++,R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(r.charCodeAt(G)===34?(Ce=ii,G++):(Ce=t,Xe===0&&Te(gi)),Ce!==t?(yt=R,q=hr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(Ce=HE(),Ce!==t?(r.charCodeAt(G)===34?(Ue=ii,G++):(Ue=t,Xe===0&&Te(gi)),Ue!==t?(yt=R,q=fi(Ce),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),Xe--,R===t&&(q=t,Xe===0&&Te(Or)),R}function HE(){var R,q,Ce;if(R=G,q=[],Ce=Ig(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Ig();else q=t;return q!==t&&(yt=R,q=ni(q)),R=q,R}function Ig(){var R,q,Ce,Ue,Re,ze;return Us.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(pr)),R===t&&(R=G,r.substr(G,2)===Ii?(q=Ii,G+=2):(q=t,Xe===0&&Te(rs)),q!==t&&(yt=R,q=ga()),R=q,R===t&&(R=G,r.substr(G,2)===dA?(q=dA,G+=2):(q=t,Xe===0&&Te(cg)),q!==t&&(yt=R,q=is()),R=q,R===t&&(R=G,r.substr(G,2)===CA?(q=CA,G+=2):(q=t,Xe===0&&Te(fa)),q!==t&&(yt=R,q=wp()),R=q,R===t&&(R=G,r.substr(G,2)===mA?(q=mA,G+=2):(q=t,Xe===0&&Te(EA)),q!==t&&(yt=R,q=wr()),R=q,R===t&&(R=G,r.substr(G,2)===Ll?(q=Ll,G+=2):(q=t,Xe===0&&Te(ug)),q!==t&&(yt=R,q=Io()),R=q,R===t&&(R=G,r.substr(G,2)===gg?(q=gg,G+=2):(q=t,Xe===0&&Te(Bp)),q!==t&&(yt=R,q=Qp()),R=q,R===t&&(R=G,r.substr(G,2)===vr?(q=vr,G+=2):(q=t,Xe===0&&Te(se)),q!==t&&(yt=R,q=yo()),R=q,R===t&&(R=G,r.substr(G,2)===Rn?(q=Rn,G+=2):(q=t,Xe===0&&Te(fg)),q!==t&&(yt=R,q=Qt()),R=q,R===t&&(R=G,r.substr(G,2)===Tl?(q=Tl,G+=2):(q=t,Xe===0&&Te(Fn)),q!==t?(Ce=BA(),Ce!==t?(Ue=BA(),Ue!==t?(Re=BA(),Re!==t?(ze=BA(),ze!==t?(yt=R,q=ns(Ce,Ue,Re,ze),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function BA(){var R;return ss.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(gt)),R}function Rr(){var R,q;if(Xe++,R=[],At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(An)),q!==t)for(;q!==t;)R.push(q),At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(An));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(wo)),R}function GE(){var R,q;if(Xe++,R=[],Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(hg)),q!==t)for(;q!==t;)R.push(q),Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(hg));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(S)),R}function Ys(){var R,q,Ce,Ue,Re,ze;if(R=G,q=js(),q!==t){for(Ce=[],Ue=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=js(),ze!==t?(Re=[Re,ze],Ue=Re):(G=Ue,Ue=t)):(G=Ue,Ue=t);Ue!==t;)Ce.push(Ue),Ue=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=js(),ze!==t?(Re=[Re,ze],Ue=Re):(G=Ue,Ue=t)):(G=Ue,Ue=t);Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)}else G=R,R=t;return R}function js(){var R;return r.substr(G,2)===Ol?(R=Ol,G+=2):(R=t,Xe===0&&Te(bp)),R===t&&(r.charCodeAt(G)===10?(R=Sp,G++):(R=t,Xe===0&&Te(vp)),R===t&&(r.charCodeAt(G)===13?(R=xp,G++):(R=t,Xe===0&&Te(Pp)))),R}let yg=2,QA=0;if(ha=n(),ha!==t&&G===r.length)return ha;throw ha!==t&&G<r.length&&Te(kp()),Kl(Ml,Wi<r.length?r.charAt(Wi):null,Wi<r.length?ln(Wi,Wi+1):ln(Wi,Wi))}oH.exports={SyntaxError:ac,parse:sde}});var fH=w((i_e,ev)=>{\"use strict\";var cde=r=>{let e=!1,t=!1,i=!1;for(let n=0;n<r.length;n++){let s=r[n];e&&/[a-zA-Z]/.test(s)&&s.toUpperCase()===s?(r=r.slice(0,n)+\"-\"+r.slice(n),e=!1,i=t,t=!0,n++):t&&i&&/[a-zA-Z]/.test(s)&&s.toLowerCase()===s?(r=r.slice(0,n-1)+\"-\"+r.slice(n-1),i=t,t=!1,e=!0):(e=s.toLowerCase()===s&&s.toUpperCase()!==s,i=t,t=s.toUpperCase()===s&&s.toLowerCase()!==s)}return r},gH=(r,e)=>{if(!(typeof r==\"string\"||Array.isArray(r)))throw new TypeError(\"Expected the input to be `string | string[]`\");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join(\"-\"):r=r.trim(),r.length===0?\"\":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=cde(r)),r=r.replace(/^[_.\\- ]+/,\"\").toLowerCase().replace(/[_.\\- ]+(\\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\\d+(\\w|$)/g,n=>n.toUpperCase()),t(r))};ev.exports=gH;ev.exports.default=gH});var hH=w((n_e,ude)=>{ude.exports=[{name:\"AppVeyor\",constant:\"APPVEYOR\",env:\"APPVEYOR\",pr:\"APPVEYOR_PULL_REQUEST_NUMBER\"},{name:\"Azure Pipelines\",constant:\"AZURE_PIPELINES\",env:\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\",pr:\"SYSTEM_PULLREQUEST_PULLREQUESTID\"},{name:\"Appcircle\",constant:\"APPCIRCLE\",env:\"AC_APPCIRCLE\"},{name:\"Bamboo\",constant:\"BAMBOO\",env:\"bamboo_planKey\"},{name:\"Bitbucket Pipelines\",constant:\"BITBUCKET\",env:\"BITBUCKET_COMMIT\",pr:\"BITBUCKET_PR_ID\"},{name:\"Bitrise\",constant:\"BITRISE\",env:\"BITRISE_IO\",pr:\"BITRISE_PULL_REQUEST\"},{name:\"Buddy\",constant:\"BUDDY\",env:\"BUDDY_WORKSPACE_ID\",pr:\"BUDDY_EXECUTION_PULL_REQUEST_ID\"},{name:\"Buildkite\",constant:\"BUILDKITE\",env:\"BUILDKITE\",pr:{env:\"BUILDKITE_PULL_REQUEST\",ne:\"false\"}},{name:\"CircleCI\",constant:\"CIRCLE\",env:\"CIRCLECI\",pr:\"CIRCLE_PULL_REQUEST\"},{name:\"Cirrus CI\",constant:\"CIRRUS\",env:\"CIRRUS_CI\",pr:\"CIRRUS_PR\"},{name:\"AWS CodeBuild\",constant:\"CODEBUILD\",env:\"CODEBUILD_BUILD_ARN\"},{name:\"Codefresh\",constant:\"CODEFRESH\",env:\"CF_BUILD_ID\",pr:{any:[\"CF_PULL_REQUEST_NUMBER\",\"CF_PULL_REQUEST_ID\"]}},{name:\"Codeship\",constant:\"CODESHIP\",env:{CI_NAME:\"codeship\"}},{name:\"Drone\",constant:\"DRONE\",env:\"DRONE\",pr:{DRONE_BUILD_EVENT:\"pull_request\"}},{name:\"dsari\",constant:\"DSARI\",env:\"DSARI\"},{name:\"GitHub Actions\",constant:\"GITHUB_ACTIONS\",env:\"GITHUB_ACTIONS\",pr:{GITHUB_EVENT_NAME:\"pull_request\"}},{name:\"GitLab CI\",constant:\"GITLAB\",env:\"GITLAB_CI\",pr:\"CI_MERGE_REQUEST_ID\"},{name:\"GoCD\",constant:\"GOCD\",env:\"GO_PIPELINE_LABEL\"},{name:\"LayerCI\",constant:\"LAYERCI\",env:\"LAYERCI\",pr:\"LAYERCI_PULL_REQUEST\"},{name:\"Hudson\",constant:\"HUDSON\",env:\"HUDSON_URL\"},{name:\"Jenkins\",constant:\"JENKINS\",env:[\"JENKINS_URL\",\"BUILD_ID\"],pr:{any:[\"ghprbPullId\",\"CHANGE_ID\"]}},{name:\"Magnum CI\",constant:\"MAGNUM\",env:\"MAGNUM\"},{name:\"Netlify CI\",constant:\"NETLIFY\",env:\"NETLIFY\",pr:{env:\"PULL_REQUEST\",ne:\"false\"}},{name:\"Nevercode\",constant:\"NEVERCODE\",env:\"NEVERCODE\",pr:{env:\"NEVERCODE_PULL_REQUEST\",ne:\"false\"}},{name:\"Render\",constant:\"RENDER\",env:\"RENDER\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Sail CI\",constant:\"SAIL\",env:\"SAILCI\",pr:\"SAIL_PULL_REQUEST_NUMBER\"},{name:\"Semaphore\",constant:\"SEMAPHORE\",env:\"SEMAPHORE\",pr:\"PULL_REQUEST_NUMBER\"},{name:\"Screwdriver\",constant:\"SCREWDRIVER\",env:\"SCREWDRIVER\",pr:{env:\"SD_PULL_REQUEST\",ne:\"false\"}},{name:\"Shippable\",constant:\"SHIPPABLE\",env:\"SHIPPABLE\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Solano CI\",constant:\"SOLANO\",env:\"TDDIUM\",pr:\"TDDIUM_PR_ID\"},{name:\"Strider CD\",constant:\"STRIDER\",env:\"STRIDER\"},{name:\"TaskCluster\",constant:\"TASKCLUSTER\",env:[\"TASK_ID\",\"RUN_ID\"]},{name:\"TeamCity\",constant:\"TEAMCITY\",env:\"TEAMCITY_VERSION\"},{name:\"Travis CI\",constant:\"TRAVIS\",env:\"TRAVIS\",pr:{env:\"TRAVIS_PULL_REQUEST\",ne:\"false\"}},{name:\"Vercel\",constant:\"VERCEL\",env:\"NOW_BUILDER\"},{name:\"Visual Studio App Center\",constant:\"APPCENTER\",env:\"APPCENTER_BUILD_ID\"}]});var Ac=w(Un=>{\"use strict\";var dH=hH(),xo=process.env;Object.defineProperty(Un,\"_vendors\",{value:dH.map(function(r){return r.constant})});Un.name=null;Un.isPR=null;dH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return pH(i)});if(Un[r.constant]=t,t)switch(Un.name=r.name,typeof r.pr){case\"string\":Un.isPR=!!xo[r.pr];break;case\"object\":\"env\"in r.pr?Un.isPR=r.pr.env in xo&&xo[r.pr.env]!==r.pr.ne:\"any\"in r.pr?Un.isPR=r.pr.any.some(function(i){return!!xo[i]}):Un.isPR=pH(r.pr);break;default:Un.isPR=null}});Un.isCI=!!(xo.CI||xo.CONTINUOUS_INTEGRATION||xo.BUILD_NUMBER||xo.RUN_ID||Un.name);function pH(r){return typeof r==\"string\"?!!xo[r]:Object.keys(r).every(function(e){return xo[e]===r[e]})}});var fn={};ut(fn,{KeyRelationship:()=>lc,applyCascade:()=>od,base64RegExp:()=>yH,colorStringAlphaRegExp:()=>IH,colorStringRegExp:()=>EH,computeKey:()=>RA,getPrintable:()=>Vr,hasExactLength:()=>SH,hasForbiddenKeys:()=>Yde,hasKeyRelationship:()=>av,hasMaxLength:()=>Sde,hasMinLength:()=>bde,hasMutuallyExclusiveKeys:()=>jde,hasRequiredKeys:()=>Gde,hasUniqueItems:()=>vde,isArray:()=>Cde,isAtLeast:()=>Dde,isAtMost:()=>kde,isBase64:()=>Kde,isBoolean:()=>hde,isDate:()=>dde,isDict:()=>Ede,isEnum:()=>Xi,isHexColor:()=>Ude,isISO8601:()=>Mde,isInExclusiveRange:()=>Fde,isInInclusiveRange:()=>Rde,isInstanceOf:()=>yde,isInteger:()=>Nde,isJSON:()=>Hde,isLiteral:()=>gde,isLowerCase:()=>Lde,isNegative:()=>xde,isNullable:()=>Qde,isNumber:()=>pde,isObject:()=>Ide,isOneOf:()=>wde,isOptional:()=>Bde,isPositive:()=>Pde,isString:()=>sd,isTuple:()=>mde,isUUID4:()=>Ode,isUnknown:()=>bH,isUpperCase:()=>Tde,iso8601RegExp:()=>ov,makeCoercionFn:()=>cc,makeSetter:()=>QH,makeTrait:()=>BH,makeValidator:()=>bt,matchesRegExp:()=>ad,plural:()=>kI,pushError:()=>pt,simpleKeyRegExp:()=>mH,uuid4RegExp:()=>wH});function bt({test:r}){return BH(r)()}function Vr(r){return r===null?\"null\":r===void 0?\"undefined\":r===\"\"?\"an empty string\":JSON.stringify(r)}function RA(r,e){var t,i,n;return typeof e==\"number\"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:\".\"}[${e}]`:mH.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:\"\"}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:\".\"}[${JSON.stringify(e)}]`}function cc(r,e){return t=>{let i=r[e];return r[e]=t,cc(r,e).bind(null,i)}}function QH(r,e){return t=>{r[e]=t}}function kI(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:\".\"}: ${t}`),!1}function gde(r){return bt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Vr(r)})`):!0})}function Xi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return bt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var mH,EH,IH,yH,wH,ov,BH,bH,sd,fde,hde,pde,dde,Cde,mde,Ede,Ide,yde,wde,od,Bde,Qde,bde,Sde,SH,vde,xde,Pde,Dde,kde,Rde,Fde,Nde,ad,Lde,Tde,Ode,Mde,Ude,Kde,Hde,Gde,Yde,jde,lc,qde,av,ls=kge(()=>{mH=/^[a-zA-Z_][a-zA-Z0-9_]*$/,EH=/^#[0-9a-f]{6}$/i,IH=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,yH=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,wH=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,ov=/^(?:[1-9]\\d{3}(-?)(?:(?:0[1-9]|1[0-2])\\1(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])\\1(?:29|30)|(?:0[13578]|1[02])(?:\\1)31|00[1-9]|0[1-9]\\d|[12]\\d{2}|3(?:[0-5]\\d|6[0-5]))|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\\2)29|-?366))T(?:[01]\\d|2[0-3])(:?)[0-5]\\d(?:\\3[0-5]\\d)?(?:Z|[+-][01]\\d(?:\\3[0-5]\\d)?)$/,BH=r=>()=>r;bH=()=>bt({test:(r,e)=>!0});sd=()=>bt({test:(r,e)=>typeof r!=\"string\"?pt(e,`Expected a string (got ${Vr(r)})`):!0});fde=new Map([[\"true\",!0],[\"True\",!0],[\"1\",!0],[1,!0],[\"false\",!1],[\"False\",!1],[\"0\",!1],[0,!1]]),hde=()=>bt({test:(r,e)=>{var t;if(typeof r!=\"boolean\"){if(typeof(e==null?void 0:e.coercions)<\"u\"){if(typeof(e==null?void 0:e.coercion)>\"u\")return pt(e,\"Unbound coercion result\");let i=fde.get(r);if(typeof i<\"u\")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:\".\",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Vr(r)})`)}return!0}}),pde=()=>bt({test:(r,e)=>{var t;if(typeof r!=\"number\"){if(typeof(e==null?void 0:e.coercions)<\"u\"){if(typeof(e==null?void 0:e.coercion)>\"u\")return pt(e,\"Unbound coercion result\");let i;if(typeof r==\"string\"){let n;try{n=JSON.parse(r)}catch{}if(typeof n==\"number\")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<\"u\")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:\".\",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Vr(r)})`)}return!0}}),dde=()=>bt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<\"u\"){if(typeof(e==null?void 0:e.coercion)>\"u\")return pt(e,\"Unbound coercion result\");let i;if(typeof r==\"string\"&&ov.test(r))i=new Date(r);else{let n;if(typeof r==\"string\"){let s;try{s=JSON.parse(r)}catch{}typeof s==\"number\"&&(n=s)}else typeof r==\"number\"&&(n=r);if(typeof n<\"u\")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<\"u\")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:\".\",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Vr(r)})`)}return!0}}),Cde=(r,{delimiter:e}={})=>bt({test:(t,i)=>{var n;if(typeof t==\"string\"&&typeof e<\"u\"&&typeof(i==null?void 0:i.coercions)<\"u\"){if(typeof(i==null?void 0:i.coercion)>\"u\")return pt(i,\"Unbound coercion result\");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:\".\",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Vr(t)})`);let s=!0;for(let o=0,a=t.length;o<a&&(s=r(t[o],Object.assign(Object.assign({},i),{p:RA(i,o),coercion:cc(t,o)}))&&s,!(!s&&(i==null?void 0:i.errors)==null));++o);return s}}),mde=(r,{delimiter:e}={})=>{let t=SH(r.length);return bt({test:(i,n)=>{var s;if(typeof i==\"string\"&&typeof e<\"u\"&&typeof(n==null?void 0:n.coercions)<\"u\"){if(typeof(n==null?void 0:n.coercion)>\"u\")return pt(n,\"Unbound coercion result\");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:\".\",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Vr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;a<l&&a<r.length&&(o=r[a](i[a],Object.assign(Object.assign({},n),{p:RA(n,a),coercion:cc(i,a)}))&&o,!(!o&&(n==null?void 0:n.errors)==null));++a);return o}})},Ede=(r,{keys:e=null}={})=>bt({test:(t,i)=>{if(typeof t!=\"object\"||t===null)return pt(i,`Expected an object (got ${Vr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o<a&&(s||(i==null?void 0:i.errors)!=null);++o){let l=n[o],c=t[l];if(l===\"__proto__\"||l===\"constructor\"){s=pt(Object.assign(Object.assign({},i),{p:RA(i,l)}),\"Unsafe property name\");continue}if(e!==null&&!e(l,i)){s=!1;continue}if(!r(c,Object.assign(Object.assign({},i),{p:RA(i,l),coercion:cc(t,l)}))){s=!1;continue}}return s}}),Ide=(r,{extra:e=null}={})=>{let t=Object.keys(r);return bt({test:(i,n)=>{if(typeof i!=\"object\"||i===null)return pt(n,`Expected an object (got ${Vr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l===\"constructor\"||l===\"__proto__\")a=pt(Object.assign(Object.assign({},n),{p:RA(n,l)}),\"Unsafe property name\");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<\"u\"?a=c(u,Object.assign(Object.assign({},n),{p:RA(n,l),coercion:cc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:RA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:QH(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},yde=r=>bt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),wde=(r,{exclusive:e=!1}={})=>bt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<\"u\"?[]:void 0;for(let c=0,u=r.length;c<u;++c){let g=typeof(i==null?void 0:i.errors)<\"u\"?[]:void 0,f=typeof(i==null?void 0:i.coercions)<\"u\"?[]:void 0;if(r[c](t,Object.assign(Object.assign({},i),{errors:g,coercions:f,p:`${(n=i==null?void 0:i.p)!==null&&n!==void 0?n:\".\"}#${c+1}`}))){if(a.push([`#${c+1}`,f]),!e)break}else l==null||l.push(g[0])}if(a.length===1){let[,c]=a[0];return typeof c<\"u\"&&((s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...c)),!0}return a.length>1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(\", \")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),od=(r,e)=>bt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<\"u\"?cc(o,\"value\"):void 0,l=typeof(i==null?void 0:i.coercions)<\"u\"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<\"u\")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<\"u\"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>\"u\")return pt(i,\"Unbound coercion result\");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:\".\",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Bde=r=>bt({test:(e,t)=>typeof e>\"u\"?!0:r(e,t)}),Qde=r=>bt({test:(e,t)=>e===null?!0:r(e,t)}),bde=r=>bt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Sde=r=>bt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),SH=r=>bt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),vde=({map:r}={})=>bt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;s<o;++s){let a=e[s],l=typeof r<\"u\"?r(a):a;if(i.has(l)){if(n.has(l))continue;pt(t,`Expected to contain unique elements; got a duplicate with ${Vr(e)}`),n.add(l)}else i.add(l)}return n.size===0}}),xde=()=>bt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),Pde=()=>bt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),Dde=r=>bt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),kde=r=>bt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),Rde=(r,e)=>bt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Fde=(r,e)=>bt({test:(t,i)=>t>=r&&t<e?!0:pt(i,`Expected to be in the [${r}; ${e}[ range (got ${t})`)}),Nde=({unsafe:r=!1}={})=>bt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),ad=r=>bt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Lde=()=>bt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),Tde=()=>bt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Ode=()=>bt({test:(r,e)=>wH.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Mde=()=>bt({test:(r,e)=>ov.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),Ude=({alpha:r=!1})=>bt({test:(e,t)=>(r?EH.test(e):IH.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),Kde=()=>bt({test:(r,e)=>yH.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),Hde=(r=bH())=>bt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Vr(e)})`)}return r(i,t)}}),Gde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${kI(s.length,\"property\",\"properties\")} ${s.map(o=>`\"${o}\"`).join(\", \")}`):!0}})},Yde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${kI(s.length,\"property\",\"properties\")} ${s.map(o=>`\"${o}\"`).join(\", \")}`):!0}})},jde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`\"${o}\"`).join(\", \")}`):!0}})};(function(r){r.Forbids=\"Forbids\",r.Requires=\"Requires\"})(lc||(lc={}));qde={[lc.Forbids]:{expect:!1,message:\"forbids using\"},[lc.Requires]:{expect:!0,message:\"requires using\"}},av=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=qde[e];return bt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property \"${r}\" ${o.message} ${kI(u.length,\"property\",\"properties\")} ${u.map(g=>`\"${g}\"`).join(\", \")}`):!0}})}});var YH=w((n$e,GH)=>{\"use strict\";GH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Jg=w((s$e,pv)=>{\"use strict\";var ACe=YH(),jH=r=>{if(r<1)throw new TypeError(\"Expected `concurrency` to be a number from 1 and up\");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=ACe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{t<r?n(a,l,...c):e.push(n.bind(null,a,l,...c))},o=(a,...l)=>new Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};pv.exports=jH;pv.exports.default=jH});var gd=w((a$e,qH)=>{var lCe=\"2.0.0\",cCe=Number.MAX_SAFE_INTEGER||9007199254740991,uCe=16;qH.exports={SEMVER_SPEC_VERSION:lCe,MAX_LENGTH:256,MAX_SAFE_INTEGER:cCe,MAX_SAFE_COMPONENT_LENGTH:uCe}});var fd=w((A$e,JH)=>{var gCe=typeof process==\"object\"&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error(\"SEMVER\",...r):()=>{};JH.exports=gCe});var uc=w((NA,WH)=>{var{MAX_SAFE_COMPONENT_LENGTH:dv}=gd(),fCe=fd();NA=WH.exports={};var hCe=NA.re=[],et=NA.src=[],tt=NA.t={},pCe=0,St=(r,e,t)=>{let i=pCe++;fCe(i,e),tt[r]=i,et[i]=e,hCe[i]=new RegExp(e,t?\"g\":void 0)};St(\"NUMERICIDENTIFIER\",\"0|[1-9]\\\\d*\");St(\"NUMERICIDENTIFIERLOOSE\",\"[0-9]+\");St(\"NONNUMERICIDENTIFIER\",\"\\\\d*[a-zA-Z-][a-zA-Z0-9-]*\");St(\"MAINVERSION\",`(${et[tt.NUMERICIDENTIFIER]})\\\\.(${et[tt.NUMERICIDENTIFIER]})\\\\.(${et[tt.NUMERICIDENTIFIER]})`);St(\"MAINVERSIONLOOSE\",`(${et[tt.NUMERICIDENTIFIERLOOSE]})\\\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})\\\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})`);St(\"PRERELEASEIDENTIFIER\",`(?:${et[tt.NUMERICIDENTIFIER]}|${et[tt.NONNUMERICIDENTIFIER]})`);St(\"PRERELEASEIDENTIFIERLOOSE\",`(?:${et[tt.NUMERICIDENTIFIERLOOSE]}|${et[tt.NONNUMERICIDENTIFIER]})`);St(\"PRERELEASE\",`(?:-(${et[tt.PRERELEASEIDENTIFIER]}(?:\\\\.${et[tt.PRERELEASEIDENTIFIER]})*))`);St(\"PRERELEASELOOSE\",`(?:-?(${et[tt.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${et[tt.PRERELEASEIDENTIFIERLOOSE]})*))`);St(\"BUILDIDENTIFIER\",\"[0-9A-Za-z-]+\");St(\"BUILD\",`(?:\\\\+(${et[tt.BUILDIDENTIFIER]}(?:\\\\.${et[tt.BUILDIDENTIFIER]})*))`);St(\"FULLPLAIN\",`v?${et[tt.MAINVERSION]}${et[tt.PRERELEASE]}?${et[tt.BUILD]}?`);St(\"FULL\",`^${et[tt.FULLPLAIN]}$`);St(\"LOOSEPLAIN\",`[v=\\\\s]*${et[tt.MAINVERSIONLOOSE]}${et[tt.PRERELEASELOOSE]}?${et[tt.BUILD]}?`);St(\"LOOSE\",`^${et[tt.LOOSEPLAIN]}$`);St(\"GTLT\",\"((?:<|>)?=?)\");St(\"XRANGEIDENTIFIERLOOSE\",`${et[tt.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);St(\"XRANGEIDENTIFIER\",`${et[tt.NUMERICIDENTIFIER]}|x|X|\\\\*`);St(\"XRANGEPLAIN\",`[v=\\\\s]*(${et[tt.XRANGEIDENTIFIER]})(?:\\\\.(${et[tt.XRANGEIDENTIFIER]})(?:\\\\.(${et[tt.XRANGEIDENTIFIER]})(?:${et[tt.PRERELEASE]})?${et[tt.BUILD]}?)?)?`);St(\"XRANGEPLAINLOOSE\",`[v=\\\\s]*(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:${et[tt.PRERELEASELOOSE]})?${et[tt.BUILD]}?)?)?`);St(\"XRANGE\",`^${et[tt.GTLT]}\\\\s*${et[tt.XRANGEPLAIN]}$`);St(\"XRANGELOOSE\",`^${et[tt.GTLT]}\\\\s*${et[tt.XRANGEPLAINLOOSE]}$`);St(\"COERCE\",`(^|[^\\\\d])(\\\\d{1,${dv}})(?:\\\\.(\\\\d{1,${dv}}))?(?:\\\\.(\\\\d{1,${dv}}))?(?:$|[^\\\\d])`);St(\"COERCERTL\",et[tt.COERCE],!0);St(\"LONETILDE\",\"(?:~>?)\");St(\"TILDETRIM\",`(\\\\s*)${et[tt.LONETILDE]}\\\\s+`,!0);NA.tildeTrimReplace=\"$1~\";St(\"TILDE\",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAIN]}$`);St(\"TILDELOOSE\",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAINLOOSE]}$`);St(\"LONECARET\",\"(?:\\\\^)\");St(\"CARETTRIM\",`(\\\\s*)${et[tt.LONECARET]}\\\\s+`,!0);NA.caretTrimReplace=\"$1^\";St(\"CARET\",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAIN]}$`);St(\"CARETLOOSE\",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAINLOOSE]}$`);St(\"COMPARATORLOOSE\",`^${et[tt.GTLT]}\\\\s*(${et[tt.LOOSEPLAIN]})$|^$`);St(\"COMPARATOR\",`^${et[tt.GTLT]}\\\\s*(${et[tt.FULLPLAIN]})$|^$`);St(\"COMPARATORTRIM\",`(\\\\s*)${et[tt.GTLT]}\\\\s*(${et[tt.LOOSEPLAIN]}|${et[tt.XRANGEPLAIN]})`,!0);NA.comparatorTrimReplace=\"$1$2$3\";St(\"HYPHENRANGE\",`^\\\\s*(${et[tt.XRANGEPLAIN]})\\\\s+-\\\\s+(${et[tt.XRANGEPLAIN]})\\\\s*$`);St(\"HYPHENRANGELOOSE\",`^\\\\s*(${et[tt.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${et[tt.XRANGEPLAINLOOSE]})\\\\s*$`);St(\"STAR\",\"(<|>)?=?\\\\s*\\\\*\");St(\"GTE0\",\"^\\\\s*>=\\\\s*0.0.0\\\\s*$\");St(\"GTE0PRE\",\"^\\\\s*>=\\\\s*0.0.0-0\\\\s*$\")});var hd=w((l$e,zH)=>{var dCe=[\"includePrerelease\",\"loose\",\"rtl\"],CCe=r=>r?typeof r!=\"object\"?{loose:!0}:dCe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};zH.exports=CCe});var OI=w((c$e,ZH)=>{var VH=/^[0-9]+$/,XH=(r,e)=>{let t=VH.test(r),i=VH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:r<e?-1:1},mCe=(r,e)=>XH(e,r);ZH.exports={compareIdentifiers:XH,rcompareIdentifiers:mCe}});var Ti=w((u$e,tG)=>{var MI=fd(),{MAX_LENGTH:_H,MAX_SAFE_INTEGER:UI}=gd(),{re:$H,t:eG}=uc(),ECe=hd(),{compareIdentifiers:pd}=OI(),Gn=class{constructor(e,t){if(t=ECe(t),e instanceof Gn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!=\"string\")throw new TypeError(`Invalid Version: ${e}`);if(e.length>_H)throw new TypeError(`version is longer than ${_H} characters`);MI(\"SemVer\",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?$H[eG.LOOSE]:$H[eG.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>UI||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>UI||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>UI||this.patch<0)throw new TypeError(\"Invalid patch version\");i[4]?this.prerelease=i[4].split(\".\").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<UI)return s}return n}):this.prerelease=[],this.build=i[5]?i[5].split(\".\"):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(\".\")}`),this.version}toString(){return this.version}compare(e){if(MI(\"SemVer.compare\",this.version,this.options,e),!(e instanceof Gn)){if(typeof e==\"string\"&&e===this.version)return 0;e=new Gn(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof Gn||(e=new Gn(e,this.options)),pd(this.major,e.major)||pd(this.minor,e.minor)||pd(this.patch,e.patch)}comparePre(e){if(e instanceof Gn||(e=new Gn(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let i=this.prerelease[t],n=e.prerelease[t];if(MI(\"prerelease compare\",t,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return pd(i,n)}while(++t)}compareBuild(e){e instanceof Gn||(e=new Gn(e,this.options));let t=0;do{let i=this.build[t],n=e.build[t];if(MI(\"prerelease compare\",t,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return pd(i,n)}while(++t)}inc(e,t){switch(e){case\"premajor\":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(\"pre\",t);break;case\"preminor\":this.prerelease.length=0,this.patch=0,this.minor++,this.inc(\"pre\",t);break;case\"prepatch\":this.prerelease.length=0,this.inc(\"patch\",t),this.inc(\"pre\",t);break;case\"prerelease\":this.prerelease.length===0&&this.inc(\"patch\",t),this.inc(\"pre\",t);break;case\"major\":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case\"minor\":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case\"patch\":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case\"pre\":if(this.prerelease.length===0)this.prerelease=[0];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]==\"number\"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};tG.exports=Gn});var gc=w((g$e,sG)=>{var{MAX_LENGTH:ICe}=gd(),{re:rG,t:iG}=uc(),nG=Ti(),yCe=hd(),wCe=(r,e)=>{if(e=yCe(e),r instanceof nG)return r;if(typeof r!=\"string\"||r.length>ICe||!(e.loose?rG[iG.LOOSE]:rG[iG.FULL]).test(r))return null;try{return new nG(r,e)}catch{return null}};sG.exports=wCe});var aG=w((f$e,oG)=>{var BCe=gc(),QCe=(r,e)=>{let t=BCe(r,e);return t?t.version:null};oG.exports=QCe});var lG=w((h$e,AG)=>{var bCe=gc(),SCe=(r,e)=>{let t=bCe(r.trim().replace(/^[=v]+/,\"\"),e);return t?t.version:null};AG.exports=SCe});var uG=w((p$e,cG)=>{var vCe=Ti(),xCe=(r,e,t,i)=>{typeof t==\"string\"&&(i=t,t=void 0);try{return new vCe(r,t).inc(e,i).version}catch{return null}};cG.exports=xCe});var cs=w((d$e,fG)=>{var gG=Ti(),PCe=(r,e,t)=>new gG(r,t).compare(new gG(e,t));fG.exports=PCe});var KI=w((C$e,hG)=>{var DCe=cs(),kCe=(r,e,t)=>DCe(r,e,t)===0;hG.exports=kCe});var CG=w((m$e,dG)=>{var pG=gc(),RCe=KI(),FCe=(r,e)=>{if(RCe(r,e))return null;{let t=pG(r),i=pG(e),n=t.prerelease.length||i.prerelease.length,s=n?\"pre\":\"\",o=n?\"prerelease\":\"\";for(let a in t)if((a===\"major\"||a===\"minor\"||a===\"patch\")&&t[a]!==i[a])return s+a;return o}};dG.exports=FCe});var EG=w((E$e,mG)=>{var NCe=Ti(),LCe=(r,e)=>new NCe(r,e).major;mG.exports=LCe});var yG=w((I$e,IG)=>{var TCe=Ti(),OCe=(r,e)=>new TCe(r,e).minor;IG.exports=OCe});var BG=w((y$e,wG)=>{var MCe=Ti(),UCe=(r,e)=>new MCe(r,e).patch;wG.exports=UCe});var bG=w((w$e,QG)=>{var KCe=gc(),HCe=(r,e)=>{let t=KCe(r,e);return t&&t.prerelease.length?t.prerelease:null};QG.exports=HCe});var vG=w((B$e,SG)=>{var GCe=cs(),YCe=(r,e,t)=>GCe(e,r,t);SG.exports=YCe});var PG=w((Q$e,xG)=>{var jCe=cs(),qCe=(r,e)=>jCe(r,e,!0);xG.exports=qCe});var HI=w((b$e,kG)=>{var DG=Ti(),JCe=(r,e,t)=>{let i=new DG(r,t),n=new DG(e,t);return i.compare(n)||i.compareBuild(n)};kG.exports=JCe});var FG=w((S$e,RG)=>{var WCe=HI(),zCe=(r,e)=>r.sort((t,i)=>WCe(t,i,e));RG.exports=zCe});var LG=w((v$e,NG)=>{var VCe=HI(),XCe=(r,e)=>r.sort((t,i)=>VCe(i,t,e));NG.exports=XCe});var dd=w((x$e,TG)=>{var ZCe=cs(),_Ce=(r,e,t)=>ZCe(r,e,t)>0;TG.exports=_Ce});var GI=w((P$e,OG)=>{var $Ce=cs(),eme=(r,e,t)=>$Ce(r,e,t)<0;OG.exports=eme});var Cv=w((D$e,MG)=>{var tme=cs(),rme=(r,e,t)=>tme(r,e,t)!==0;MG.exports=rme});var YI=w((k$e,UG)=>{var ime=cs(),nme=(r,e,t)=>ime(r,e,t)>=0;UG.exports=nme});var jI=w((R$e,KG)=>{var sme=cs(),ome=(r,e,t)=>sme(r,e,t)<=0;KG.exports=ome});var mv=w((F$e,HG)=>{var ame=KI(),Ame=Cv(),lme=dd(),cme=YI(),ume=GI(),gme=jI(),fme=(r,e,t,i)=>{switch(e){case\"===\":return typeof r==\"object\"&&(r=r.version),typeof t==\"object\"&&(t=t.version),r===t;case\"!==\":return typeof r==\"object\"&&(r=r.version),typeof t==\"object\"&&(t=t.version),r!==t;case\"\":case\"=\":case\"==\":return ame(r,t,i);case\"!=\":return Ame(r,t,i);case\">\":return lme(r,t,i);case\">=\":return cme(r,t,i);case\"<\":return ume(r,t,i);case\"<=\":return gme(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};HG.exports=fme});var YG=w((N$e,GG)=>{var hme=Ti(),pme=gc(),{re:qI,t:JI}=uc(),dme=(r,e)=>{if(r instanceof hme)return r;if(typeof r==\"number\"&&(r=String(r)),typeof r!=\"string\")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(qI[JI.COERCE]);else{let i;for(;(i=qI[JI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),qI[JI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;qI[JI.COERCERTL].lastIndex=-1}return t===null?null:pme(`${t[2]}.${t[3]||\"0\"}.${t[4]||\"0\"}`,e)};GG.exports=dme});var qG=w((L$e,jG)=>{\"use strict\";jG.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var WI=w((T$e,JG)=>{\"use strict\";JG.exports=Ht;Ht.Node=fc;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach==\"function\")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t<i;t++)e.push(arguments[t]);return e}Ht.prototype.removeNode=function(r){if(r.list!==this)throw new Error(\"removing node which does not belong to this list\");var e=r.next,t=r.prev;return e&&(e.prev=t),t&&(t.next=e),r===this.head&&(this.head=e),r===this.tail&&(this.tail=t),r.list.length--,r.next=null,r.prev=null,r.list=null,e};Ht.prototype.unshiftNode=function(r){if(r!==this.head){r.list&&r.list.removeNode(r);var e=this.head;r.list=this,r.next=e,e&&(e.prev=r),this.head=r,this.tail||(this.tail=r),this.length++}};Ht.prototype.pushNode=function(r){if(r!==this.tail){r.list&&r.list.removeNode(r);var e=this.tail;r.list=this,r.prev=e,e&&(e.next=r),this.tail=r,this.head||(this.head=r),this.length++}};Ht.prototype.push=function(){for(var r=0,e=arguments.length;r<e;r++)mme(this,arguments[r]);return this.length};Ht.prototype.unshift=function(){for(var r=0,e=arguments.length;r<e;r++)Eme(this,arguments[r]);return this.length};Ht.prototype.pop=function(){if(!!this.tail){var r=this.tail.value;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,r}};Ht.prototype.shift=function(){if(!!this.head){var r=this.head.value;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,r}};Ht.prototype.forEach=function(r,e){e=e||this;for(var t=this.head,i=0;t!==null;i++)r.call(e,t.value,i,this),t=t.next};Ht.prototype.forEachReverse=function(r,e){e=e||this;for(var t=this.tail,i=this.length-1;t!==null;i--)r.call(e,t.value,i,this),t=t.prev};Ht.prototype.get=function(r){for(var e=0,t=this.head;t!==null&&e<r;e++)t=t.next;if(e===r&&t!==null)return t.value};Ht.prototype.getReverse=function(r){for(var e=0,t=this.tail;t!==null&&e<r;e++)t=t.prev;if(e===r&&t!==null)return t.value};Ht.prototype.map=function(r,e){e=e||this;for(var t=new Ht,i=this.head;i!==null;)t.push(r.call(e,i.value,this)),i=i.next;return t};Ht.prototype.mapReverse=function(r,e){e=e||this;for(var t=new Ht,i=this.tail;i!==null;)t.push(r.call(e,i.value,this)),i=i.prev;return t};Ht.prototype.reduce=function(r,e){var t,i=this.head;if(arguments.length>1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(e<r||e<0)return t;r<0&&(r=0),e>this.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&i<r;i++)n=n.next;for(;n!==null&&i<e;i++,n=n.next)t.push(n.value);return t};Ht.prototype.sliceReverse=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(e<r||e<0)return t;r<0&&(r=0),e>this.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i<r;i++)n=n.next;for(var s=[],i=0;n&&i<e;i++)s.push(n.value),n=this.removeNode(n);n===null&&(n=this.tail),n!==this.head&&n!==this.tail&&(n=n.prev);for(var i=0;i<t.length;i++)n=Cme(this,n,t[i]);return s};Ht.prototype.reverse=function(){for(var r=this.head,e=this.tail,t=r;t!==null;t=t.prev){var i=t.prev;t.prev=t.next,t.next=i}return this.head=e,this.tail=r,this};function Cme(r,e,t){var i=e===r.head?new fc(t,null,e,r):new fc(t,e,e.next,r);return i.next===null&&(r.tail=i),i.prev===null&&(r.head=i),r.length++,i}function mme(r,e){r.tail=new fc(e,r.tail,null,r),r.head||(r.head=r.tail),r.length++}function Eme(r,e){r.head=new fc(e,null,r.head,r),r.tail||(r.tail=r.head),r.length++}function fc(r,e,t,i){if(!(this instanceof fc))return new fc(r,e,t,i);this.list=i,this.value=r,e?(e.next=this,this.prev=e):this.prev=null,t?(t.prev=this,this.next=t):this.next=null}try{qG()(Ht)}catch{}});var ZG=w((O$e,XG)=>{\"use strict\";var Ime=WI(),hc=Symbol(\"max\"),Sa=Symbol(\"length\"),Wg=Symbol(\"lengthCalculator\"),md=Symbol(\"allowStale\"),pc=Symbol(\"maxAge\"),ba=Symbol(\"dispose\"),WG=Symbol(\"noDisposeOnSet\"),di=Symbol(\"lruList\"),Zs=Symbol(\"cache\"),VG=Symbol(\"updateAgeOnGet\"),Ev=()=>1,yv=class{constructor(e){if(typeof e==\"number\"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!=\"number\"||e.max<0))throw new TypeError(\"max must be a non-negative number\");let t=this[hc]=e.max||1/0,i=e.length||Ev;if(this[Wg]=typeof i!=\"function\"?Ev:i,this[md]=e.stale||!1,e.maxAge&&typeof e.maxAge!=\"number\")throw new TypeError(\"maxAge must be a number\");this[pc]=e.maxAge||0,this[ba]=e.dispose,this[WG]=e.noDisposeOnSet||!1,this[VG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!=\"number\"||e<0)throw new TypeError(\"max must be a non-negative number\");this[hc]=e||1/0,Cd(this)}get max(){return this[hc]}set allowStale(e){this[md]=!!e}get allowStale(){return this[md]}set maxAge(e){if(typeof e!=\"number\")throw new TypeError(\"maxAge must be a non-negative number\");this[pc]=e,Cd(this)}get maxAge(){return this[pc]}set lengthCalculator(e){typeof e!=\"function\"&&(e=Ev),e!==this[Wg]&&(this[Wg]=e,this[Sa]=0,this[di].forEach(t=>{t.length=this[Wg](t.value,t.key),this[Sa]+=t.length})),Cd(this)}get lengthCalculator(){return this[Wg]}get length(){return this[Sa]}get itemCount(){return this[di].length}rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;zG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;zG(this,e,i,t),i=n}}keys(){return this[di].toArray().map(e=>e.key)}values(){return this[di].toArray().map(e=>e.value)}reset(){this[ba]&&this[di]&&this[di].length&&this[di].forEach(e=>this[ba](e.key,e.value)),this[Zs]=new Map,this[di]=new Ime,this[Sa]=0}dump(){return this[di].map(e=>zI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[di]}set(e,t,i){if(i=i||this[pc],i&&typeof i!=\"number\")throw new TypeError(\"maxAge must be a number\");let n=i?Date.now():0,s=this[Wg](t,e);if(this[Zs].has(e)){if(s>this[hc])return zg(this,this[Zs].get(e)),!1;let l=this[Zs].get(e).value;return this[ba]&&(this[WG]||this[ba](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Sa]+=s-l.length,l.length=s,this.get(e),Cd(this),!0}let o=new wv(e,t,s,n,i);return o.length>this[hc]?(this[ba]&&this[ba](e,t),!1):(this[Sa]+=o.length,this[di].unshift(o),this[Zs].set(e,this[di].head),Cd(this),!0)}has(e){if(!this[Zs].has(e))return!1;let t=this[Zs].get(e).value;return!zI(this,t)}get(e){return Iv(this,e,!0)}peek(e){return Iv(this,e,!1)}pop(){let e=this[di].tail;return e?(zg(this,e),e.value):null}del(e){zg(this,this[Zs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Zs].forEach((e,t)=>Iv(this,t,!1))}},Iv=(r,e,t)=>{let i=r[Zs].get(e);if(i){let n=i.value;if(zI(r,n)){if(zg(r,i),!r[md])return}else t&&(r[VG]&&(i.value.now=Date.now()),r[di].unshiftNode(i));return n.value}},zI=(r,e)=>{if(!e||!e.maxAge&&!r[pc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[pc]&&t>r[pc]},Cd=r=>{if(r[Sa]>r[hc])for(let e=r[di].tail;r[Sa]>r[hc]&&e!==null;){let t=e.prev;zg(r,e),e=t}},zg=(r,e)=>{if(e){let t=e.value;r[ba]&&r[ba](t.key,t.value),r[Sa]-=t.length,r[Zs].delete(t.key),r[di].removeNode(e)}},wv=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},zG=(r,e,t,i)=>{let n=t.value;zI(r,n)&&(zg(r,t),r[md]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};XG.exports=yv});var us=w((M$e,tY)=>{var dc=class{constructor(e,t){if(t=wme(t),e instanceof dc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new dc(e.raw,t);if(e instanceof Bv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\\s*\\|\\|\\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!$G(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&vme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(\" \").trim()).join(\"||\").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(\",\")}:${e}`,n=_G.get(i);if(n)return n;let s=this.options.loose,o=s?Oi[Qi.HYPHENRANGELOOSE]:Oi[Qi.HYPHENRANGE];e=e.replace(o,Ome(this.options.includePrerelease)),Gr(\"hyphen replace\",e),e=e.replace(Oi[Qi.COMPARATORTRIM],Qme),Gr(\"comparator trim\",e,Oi[Qi.COMPARATORTRIM]),e=e.replace(Oi[Qi.TILDETRIM],bme),e=e.replace(Oi[Qi.CARETTRIM],Sme),e=e.split(/\\s+/).join(\" \");let a=s?Oi[Qi.COMPARATORLOOSE]:Oi[Qi.COMPARATOR],l=e.split(\" \").map(f=>xme(f,this.options)).join(\" \").split(/\\s+/).map(f=>Tme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Bv(f,this.options)),c=l.length,u=new Map;for(let f of l){if($G(f))return[f];u.set(f.value,f)}u.size>1&&u.has(\"\")&&u.delete(\"\");let g=[...u.values()];return _G.set(i,g),g}intersects(e,t){if(!(e instanceof dc))throw new TypeError(\"a Range is required\");return this.set.some(i=>eY(i,t)&&e.set.some(n=>eY(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e==\"string\")try{e=new Bme(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Mme(this.set[t],e,this.options))return!0;return!1}};tY.exports=dc;var yme=ZG(),_G=new yme({max:1e3}),wme=hd(),Bv=Ed(),Gr=fd(),Bme=Ti(),{re:Oi,t:Qi,comparatorTrimReplace:Qme,tildeTrimReplace:bme,caretTrimReplace:Sme}=uc(),$G=r=>r.value===\"<0.0.0-0\",vme=r=>r.value===\"\",eY=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},xme=(r,e)=>(Gr(\"comp\",r,e),r=kme(r,e),Gr(\"caret\",r),r=Pme(r,e),Gr(\"tildes\",r),r=Fme(r,e),Gr(\"xrange\",r),r=Lme(r,e),Gr(\"stars\",r),r),_i=r=>!r||r.toLowerCase()===\"x\"||r===\"*\",Pme=(r,e)=>r.trim().split(/\\s+/).map(t=>Dme(t,e)).join(\" \"),Dme=(r,e)=>{let t=e.loose?Oi[Qi.TILDELOOSE]:Oi[Qi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Gr(\"tilde\",r,i,n,s,o,a);let l;return _i(n)?l=\"\":_i(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:_i(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Gr(\"replaceTilde pr\",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Gr(\"tilde return\",l),l})},kme=(r,e)=>r.trim().split(/\\s+/).map(t=>Rme(t,e)).join(\" \"),Rme=(r,e)=>{Gr(\"caret\",r,e);let t=e.loose?Oi[Qi.CARETLOOSE]:Oi[Qi.CARET],i=e.includePrerelease?\"-0\":\"\";return r.replace(t,(n,s,o,a,l)=>{Gr(\"caret\",r,n,s,o,a,l);let c;return _i(s)?c=\"\":_i(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:_i(a)?s===\"0\"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Gr(\"replaceCaret pr\",l),s===\"0\"?o===\"0\"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Gr(\"no pr\"),s===\"0\"?o===\"0\"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Gr(\"caret return\",c),c})},Fme=(r,e)=>(Gr(\"replaceXRanges\",r,e),r.split(/\\s+/).map(t=>Nme(t,e)).join(\" \")),Nme=(r,e)=>{r=r.trim();let t=e.loose?Oi[Qi.XRANGELOOSE]:Oi[Qi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Gr(\"xRange\",r,i,n,s,o,a,l);let c=_i(s),u=c||_i(o),g=u||_i(a),f=g;return n===\"=\"&&f&&(n=\"\"),l=e.includePrerelease?\"-0\":\"\",c?n===\">\"||n===\"<\"?i=\"<0.0.0-0\":i=\"*\":n&&f?(u&&(o=0),a=0,n===\">\"?(n=\">=\",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n===\"<=\"&&(n=\"<\",u?s=+s+1:o=+o+1),n===\"<\"&&(l=\"-0\"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Gr(\"xRange return\",i),i})},Lme=(r,e)=>(Gr(\"replaceStars\",r,e),r.trim().replace(Oi[Qi.STAR],\"\")),Tme=(r,e)=>(Gr(\"replaceGTE0\",r,e),r.trim().replace(Oi[e.includePrerelease?Qi.GTE0PRE:Qi.GTE0],\"\")),Ome=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(_i(i)?t=\"\":_i(n)?t=`>=${i}.0.0${r?\"-0\":\"\"}`:_i(s)?t=`>=${i}.${n}.0${r?\"-0\":\"\"}`:o?t=`>=${t}`:t=`>=${t}${r?\"-0\":\"\"}`,_i(c)?l=\"\":_i(u)?l=`<${+c+1}.0.0-0`:_i(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),Mme=(r,e,t)=>{for(let i=0;i<r.length;i++)if(!r[i].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let i=0;i<r.length;i++)if(Gr(r[i].semver),r[i].semver!==Bv.ANY&&r[i].semver.prerelease.length>0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Ed=w((U$e,oY)=>{var Id=Symbol(\"SemVer ANY\"),Vg=class{static get ANY(){return Id}constructor(e,t){if(t=Ume(t),e instanceof Vg){if(e.loose===!!t.loose)return e;e=e.value}bv(\"comparator\",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Id?this.value=\"\":this.value=this.operator+this.semver.version,bv(\"comp\",this)}parse(e){let t=this.options.loose?rY[iY.COMPARATORLOOSE]:rY[iY.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:\"\",this.operator===\"=\"&&(this.operator=\"\"),i[2]?this.semver=new nY(i[2],this.options.loose):this.semver=Id}toString(){return this.value}test(e){if(bv(\"Comparator.test\",e,this.options.loose),this.semver===Id||e===Id)return!0;if(typeof e==\"string\")try{e=new nY(e,this.options)}catch{return!1}return Qv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Vg))throw new TypeError(\"a Comparator is required\");if((!t||typeof t!=\"object\")&&(t={loose:!!t,includePrerelease:!1}),this.operator===\"\")return this.value===\"\"?!0:new sY(e.value,t).test(this.value);if(e.operator===\"\")return e.value===\"\"?!0:new sY(this.value,t).test(e.semver);let i=(this.operator===\">=\"||this.operator===\">\")&&(e.operator===\">=\"||e.operator===\">\"),n=(this.operator===\"<=\"||this.operator===\"<\")&&(e.operator===\"<=\"||e.operator===\"<\"),s=this.semver.version===e.semver.version,o=(this.operator===\">=\"||this.operator===\"<=\")&&(e.operator===\">=\"||e.operator===\"<=\"),a=Qv(this.semver,\"<\",e.semver,t)&&(this.operator===\">=\"||this.operator===\">\")&&(e.operator===\"<=\"||e.operator===\"<\"),l=Qv(this.semver,\">\",e.semver,t)&&(this.operator===\"<=\"||this.operator===\"<\")&&(e.operator===\">=\"||e.operator===\">\");return i||n||s&&o||a||l}};oY.exports=Vg;var Ume=hd(),{re:rY,t:iY}=uc(),Qv=mv(),bv=fd(),nY=Ti(),sY=us()});var yd=w((K$e,aY)=>{var Kme=us(),Hme=(r,e,t)=>{try{e=new Kme(e,t)}catch{return!1}return e.test(r)};aY.exports=Hme});var lY=w((H$e,AY)=>{var Gme=us(),Yme=(r,e)=>new Gme(r,e).set.map(t=>t.map(i=>i.value).join(\" \").trim().split(\" \"));AY.exports=Yme});var uY=w((G$e,cY)=>{var jme=Ti(),qme=us(),Jme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new qme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new jme(i,t))}),i};cY.exports=Jme});var fY=w((Y$e,gY)=>{var Wme=Ti(),zme=us(),Vme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new zme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Wme(i,t))}),i};gY.exports=Vme});var dY=w((j$e,pY)=>{var Sv=Ti(),Xme=us(),hY=dd(),Zme=(r,e)=>{r=new Xme(r,e);let t=new Sv(\"0.0.0\");if(r.test(t)||(t=new Sv(\"0.0.0-0\"),r.test(t)))return t;t=null;for(let i=0;i<r.set.length;++i){let n=r.set[i],s=null;n.forEach(o=>{let a=new Sv(o.semver.version);switch(o.operator){case\">\":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case\"\":case\">=\":(!s||hY(a,s))&&(s=a);break;case\"<\":case\"<=\":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||hY(t,s))&&(t=s)}return t&&r.test(t)?t:null};pY.exports=Zme});var mY=w((q$e,CY)=>{var _me=us(),$me=(r,e)=>{try{return new _me(r,e).range||\"*\"}catch{return null}};CY.exports=$me});var VI=w((J$e,wY)=>{var eEe=Ti(),yY=Ed(),{ANY:tEe}=yY,rEe=us(),iEe=yd(),EY=dd(),IY=GI(),nEe=jI(),sEe=YI(),oEe=(r,e,t,i)=>{r=new eEe(r,i),e=new rEe(e,i);let n,s,o,a,l;switch(t){case\">\":n=EY,s=nEe,o=IY,a=\">\",l=\">=\";break;case\"<\":n=IY,s=sEe,o=EY,a=\"<\",l=\"<=\";break;default:throw new TypeError('Must provide a hilo val of \"<\" or \">\"')}if(iEe(r,e,i))return!1;for(let c=0;c<e.set.length;++c){let u=e.set[c],g=null,f=null;if(u.forEach(h=>{h.semver===tEe&&(h=new yY(\">=0.0.0\")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};wY.exports=oEe});var QY=w((W$e,BY)=>{var aEe=VI(),AEe=(r,e,t)=>aEe(r,e,\">\",t);BY.exports=AEe});var SY=w((z$e,bY)=>{var lEe=VI(),cEe=(r,e,t)=>lEe(r,e,\"<\",t);bY.exports=cEe});var PY=w((V$e,xY)=>{var vY=us(),uEe=(r,e,t)=>(r=new vY(r,t),e=new vY(e,t),r.intersects(e));xY.exports=uEe});var kY=w((X$e,DY)=>{var gEe=yd(),fEe=cs();DY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>fEe(u,g,t));for(let u of o)gEe(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push(\"*\"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(\" || \"),c=typeof e.raw==\"string\"?e.raw:String(e);return l.length<c.length?l:e}});var TY=w((Z$e,LY)=>{var RY=us(),XI=Ed(),{ANY:vv}=XI,wd=yd(),xv=cs(),hEe=(r,e,t={})=>{if(r===e)return!0;r=new RY(r,t),e=new RY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=pEe(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},pEe=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===vv){if(e.length===1&&e[0].semver===vv)return!0;t.includePrerelease?r=[new XI(\">=0.0.0-0\")]:r=[new XI(\">=0.0.0\")]}if(e.length===1&&e[0].semver===vv){if(t.includePrerelease)return!0;e=[new XI(\">=0.0.0\")]}let i=new Set,n,s;for(let h of r)h.operator===\">\"||h.operator===\">=\"?n=FY(n,h,t):h.operator===\"<\"||h.operator===\"<=\"?s=NY(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=xv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==\">=\"||s.operator!==\"<=\"))return null}for(let h of i){if(n&&!wd(h,String(n),t)||s&&!wd(h,String(s),t))return null;for(let p of e)if(!wd(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator===\"<\"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===\">\"||h.operator===\">=\",c=c||h.operator===\"<\"||h.operator===\"<=\",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===\">\"||h.operator===\">=\"){if(a=FY(n,h,t),a===h&&a!==n)return!1}else if(n.operator===\">=\"&&!wd(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator===\"<\"||h.operator===\"<=\"){if(l=NY(s,h,t),l===h&&l!==s)return!1}else if(s.operator===\"<=\"&&!wd(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},FY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===\">\"&&r.operator===\">=\"?e:r},NY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i<0?r:i>0||e.operator===\"<\"&&r.operator===\"<=\"?e:r};LY.exports=hEe});var Xr=w((_$e,OY)=>{var Pv=uc();OY.exports={re:Pv.re,src:Pv.src,tokens:Pv.t,SEMVER_SPEC_VERSION:gd().SEMVER_SPEC_VERSION,SemVer:Ti(),compareIdentifiers:OI().compareIdentifiers,rcompareIdentifiers:OI().rcompareIdentifiers,parse:gc(),valid:aG(),clean:lG(),inc:uG(),diff:CG(),major:EG(),minor:yG(),patch:BG(),prerelease:bG(),compare:cs(),rcompare:vG(),compareLoose:PG(),compareBuild:HI(),sort:FG(),rsort:LG(),gt:dd(),lt:GI(),eq:KI(),neq:Cv(),gte:YI(),lte:jI(),cmp:mv(),coerce:YG(),Comparator:Ed(),Range:us(),satisfies:yd(),toComparators:lY(),maxSatisfying:uY(),minSatisfying:fY(),minVersion:dY(),validRange:mY(),outside:VI(),gtr:QY(),ltr:SY(),intersects:PY(),simplifyRange:kY(),subset:TY()}});var Dv=w(ZI=>{\"use strict\";Object.defineProperty(ZI,\"__esModule\",{value:!0});ZI.VERSION=void 0;ZI.VERSION=\"9.1.0\"});var Gt=w((exports,module)=>{\"use strict\";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i<n;i++)(s||!(i in e))&&(s||(s=Array.prototype.slice.call(e,0,i)),s[i]=e[i]);return r.concat(s||Array.prototype.slice.call(e))};Object.defineProperty(exports,\"__esModule\",{value:!0});exports.toFastProperties=exports.timer=exports.peek=exports.isES2015MapSupported=exports.PRINT_WARNING=exports.PRINT_ERROR=exports.packArray=exports.IDENTITY=exports.NOOP=exports.merge=exports.groupBy=exports.defaults=exports.assignNoOverwrite=exports.assign=exports.zipObject=exports.sortBy=exports.indexOf=exports.some=exports.difference=exports.every=exports.isObject=exports.isRegExp=exports.isArray=exports.partial=exports.uniq=exports.compact=exports.reduce=exports.findAll=exports.find=exports.cloneObj=exports.cloneArr=exports.contains=exports.has=exports.pick=exports.reject=exports.filter=exports.dropRight=exports.drop=exports.isFunction=exports.isUndefined=exports.isString=exports.forEach=exports.last=exports.first=exports.flatten=exports.map=exports.mapValues=exports.values=exports.keys=exports.isEmpty=void 0;exports.upperFirst=void 0;function isEmpty(r){return r&&r.length===0}exports.isEmpty=isEmpty;function keys(r){return r==null?[]:Object.keys(r)}exports.keys=keys;function values(r){for(var e=[],t=Object.keys(r),i=0;i<t.length;i++)e.push(r[t[i]]);return e}exports.values=values;function mapValues(r,e){for(var t=[],i=keys(r),n=0;n<i.length;n++){var s=i[n];t.push(e.call(null,r[s],s))}return t}exports.mapValues=mapValues;function map(r,e){for(var t=[],i=0;i<r.length;i++)t.push(e.call(null,r[i],i));return t}exports.map=map;function flatten(r){for(var e=[],t=0;t<r.length;t++){var i=r[t];Array.isArray(i)?e=e.concat(flatten(i)):e.push(i)}return e}exports.flatten=flatten;function first(r){return isEmpty(r)?void 0:r[0]}exports.first=first;function last(r){var e=r&&r.length;return e?r[e-1]:void 0}exports.last=last;function forEach(r,e){if(Array.isArray(r))for(var t=0;t<r.length;t++)e.call(null,r[t],t);else if(isObject(r))for(var i=keys(r),t=0;t<i.length;t++){var n=i[t],s=r[n];e.call(null,s,n)}else throw Error(\"non exhaustive match\")}exports.forEach=forEach;function isString(r){return typeof r==\"string\"}exports.isString=isString;function isUndefined(r){return r===void 0}exports.isUndefined=isUndefined;function isFunction(r){return r instanceof Function}exports.isFunction=isFunction;function drop(r,e){return e===void 0&&(e=1),r.slice(e,r.length)}exports.drop=drop;function dropRight(r,e){return e===void 0&&(e=1),r.slice(0,r.length-e)}exports.dropRight=dropRight;function filter(r,e){var t=[];if(Array.isArray(r))for(var i=0;i<r.length;i++){var n=r[i];e.call(null,n)&&t.push(n)}return t}exports.filter=filter;function reject(r,e){return filter(r,function(t){return!e(t)})}exports.reject=reject;function pick(r,e){for(var t=Object.keys(r),i={},n=0;n<t.length;n++){var s=t[n],o=r[s];e(o)&&(i[s]=o)}return i}exports.pick=pick;function has(r,e){return isObject(r)?r.hasOwnProperty(e):!1}exports.has=has;function contains(r,e){return find(r,function(t){return t===e})!==void 0}exports.contains=contains;function cloneArr(r){for(var e=[],t=0;t<r.length;t++)e.push(r[t]);return e}exports.cloneArr=cloneArr;function cloneObj(r){var e={};for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t]);return e}exports.cloneObj=cloneObj;function find(r,e){for(var t=0;t<r.length;t++){var i=r[t];if(e.call(null,i))return i}}exports.find=find;function findAll(r,e){for(var t=[],i=0;i<r.length;i++){var n=r[i];e.call(null,n)&&t.push(n)}return t}exports.findAll=findAll;function reduce(r,e,t){for(var i=Array.isArray(r),n=i?r:values(r),s=i?[]:keys(r),o=t,a=0;a<n.length;a++)o=e.call(null,o,n[a],i?a:s[a]);return o}exports.reduce=reduce;function compact(r){return reject(r,function(e){return e==null})}exports.compact=compact;function uniq(r,e){e===void 0&&(e=function(i){return i});var t=[];return reduce(r,function(i,n){var s=e(n);return contains(t,s)?i:(t.push(s),i.concat(n))},[])}exports.uniq=uniq;function partial(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];var i=[null],n=i.concat(e);return Function.bind.apply(r,n)}exports.partial=partial;function isArray(r){return Array.isArray(r)}exports.isArray=isArray;function isRegExp(r){return r instanceof RegExp}exports.isRegExp=isRegExp;function isObject(r){return r instanceof Object}exports.isObject=isObject;function every(r,e){for(var t=0;t<r.length;t++)if(!e(r[t],t))return!1;return!0}exports.every=every;function difference(r,e){return reject(r,function(t){return contains(e,t)})}exports.difference=difference;function some(r,e){for(var t=0;t<r.length;t++)if(e(r[t]))return!0;return!1}exports.some=some;function indexOf(r,e){for(var t=0;t<r.length;t++)if(r[t]===e)return t;return-1}exports.indexOf=indexOf;function sortBy(r,e){var t=cloneArr(r);return t.sort(function(i,n){return e(i)-e(n)}),t}exports.sortBy=sortBy;function zipObject(r,e){if(r.length!==e.length)throw Error(\"can't zipObject with different number of keys and values!\");for(var t={},i=0;i<r.length;i++)t[r[i]]=e[i];return t}exports.zipObject=zipObject;function assign(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];for(var i=0;i<e.length;i++)for(var n=e[i],s=keys(n),o=0;o<s.length;o++){var a=s[o];r[a]=n[a]}return r}exports.assign=assign;function assignNoOverwrite(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];for(var i=0;i<e.length;i++)for(var n=e[i],s=keys(n),o=0;o<s.length;o++){var a=s[o];has(r,a)||(r[a]=n[a])}return r}exports.assignNoOverwrite=assignNoOverwrite;function defaults(){for(var r=[],e=0;e<arguments.length;e++)r[e]=arguments[e];return assignNoOverwrite.apply(void 0,__spreadArray([{}],r,!1))}exports.defaults=defaults;function groupBy(r,e){var t={};return forEach(r,function(i){var n=e(i),s=t[n];s?s.push(i):t[n]=[i]}),t}exports.groupBy=groupBy;function merge(r,e){for(var t=cloneObj(r),i=keys(e),n=0;n<i.length;n++){var s=i[n],o=e[s];t[s]=o}return t}exports.merge=merge;function NOOP(){}exports.NOOP=NOOP;function IDENTITY(r){return r}exports.IDENTITY=IDENTITY;function packArray(r){for(var e=[],t=0;t<r.length;t++){var i=r[t];e.push(i!==void 0?i:void 0)}return e}exports.packArray=packArray;function PRINT_ERROR(r){console&&console.error&&console.error(\"Error: \"+r)}exports.PRINT_ERROR=PRINT_ERROR;function PRINT_WARNING(r){console&&console.warn&&console.warn(\"Warning: \"+r)}exports.PRINT_WARNING=PRINT_WARNING;function isES2015MapSupported(){return typeof Map==\"function\"}exports.isES2015MapSupported=isES2015MapSupported;function peek(r){return r[r.length-1]}exports.peek=peek;function timer(r){var e=new Date().getTime(),t=r(),i=new Date().getTime(),n=i-e;return{time:n,value:t}}exports.timer=timer;function toFastProperties(toBecomeFast){function FakeConstructor(){}FakeConstructor.prototype=toBecomeFast;var fakeInstance=new FakeConstructor;function fakeAccess(){return typeof fakeInstance.bar}return fakeAccess(),fakeAccess(),toBecomeFast;eval(toBecomeFast)}exports.toFastProperties=toFastProperties;function upperFirst(r){if(!r)return r;var e=getCharacterFromCodePointAt(r,0);return e.toUpperCase()+r.substring(e.length)}exports.upperFirst=upperFirst;var surrogatePairPattern=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;function getCharacterFromCodePointAt(r,e){var t=r.substring(e,e+1);return surrogatePairPattern.test(t)?t:r[e]}});var $I=w((MY,_I)=>{(function(r,e){typeof define==\"function\"&&define.amd?define([],e):typeof _I==\"object\"&&_I.exports?_I.exports=e():r.regexpToAst=e()})(typeof self<\"u\"?self:MY,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar(\"/\");var C=this.disjunction();this.consumeChar(\"/\");for(var y={type:\"Flags\",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case\"g\":o(y,\"global\");break;case\"i\":o(y,\"ignoreCase\");break;case\"m\":o(y,\"multiLine\");break;case\"u\":o(y,\"unicode\");break;case\"y\":o(y,\"sticky\");break}if(this.idx!==this.input.length)throw Error(\"Redundant input: \"+this.input.substring(this.idx));return{type:\"Pattern\",flags:y,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()===\"|\";)this.consumeChar(\"|\"),p.push(this.alternative());return{type:\"Disjunction\",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:\"Alternative\",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case\"^\":return{type:\"StartAnchor\",loc:this.loc(p)};case\"$\":return{type:\"EndAnchor\",loc:this.loc(p)};case\"\\\\\":switch(this.popChar()){case\"b\":return{type:\"WordBoundary\",loc:this.loc(p)};case\"B\":return{type:\"NonWordBoundary\",loc:this.loc(p)}}throw Error(\"Invalid Assertion Escape\");case\"(\":this.consumeChar(\"?\");var C;switch(this.popChar()){case\"=\":C=\"Lookahead\";break;case\"!\":C=\"NegativeLookahead\";break}a(C);var y=this.disjunction();return this.consumeChar(\")\"),{type:C,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,y=this.idx;switch(this.popChar()){case\"*\":C={atLeast:0,atMost:1/0};break;case\"+\":C={atLeast:1,atMost:1/0};break;case\"?\":C={atLeast:0,atMost:1};break;case\"{\":var B=this.integerIncludingZero();switch(this.popChar()){case\"}\":C={atLeast:B,atMost:B};break;case\",\":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar(\"}\");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)===\"?\"?(this.consumeChar(\"?\"),C.greedy=!1):C.greedy=!0,C.type=\"Quantifier\",C.loc=this.loc(y),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case\".\":p=this.dotAll();break;case\"\\\\\":p=this.atomEscape();break;case\"[\":p=this.characterClass();break;case\"(\":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar(\".\"),{type:\"Set\",complement:!0,value:[n(`\n`),n(\"\\r\"),n(\"\\u2028\"),n(\"\\u2029\")]}},r.prototype.atomEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"1\":case\"2\":case\"3\":case\"4\":case\"5\":case\"6\":case\"7\":case\"8\":case\"9\":return this.decimalEscapeAtom();case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:\"GroupBackReference\",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case\"d\":p=u;break;case\"D\":p=u,C=!0;break;case\"s\":p=f;break;case\"S\":p=f,C=!0;break;case\"w\":p=g;break;case\"W\":p=g,C=!0;break}return a(p),{type:\"Set\",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case\"f\":p=n(\"\\f\");break;case\"n\":p=n(`\n`);break;case\"r\":p=n(\"\\r\");break;case\"t\":p=n(\"\t\");break;case\"v\":p=n(\"\\v\");break}return a(p),{type:\"Character\",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar(\"c\");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error(\"Invalid \");var C=p.toUpperCase().charCodeAt(0)-64;return{type:\"Character\",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar(\"0\"),{type:\"Character\",value:n(\"\\0\")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar(\"x\"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar(\"u\"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:\"Character\",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"\\\\\":case\"]\":throw Error(\"TBD\");default:var p=this.popChar();return{type:\"Character\",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar(\"[\"),this.peekChar(0)===\"^\"&&(this.consumeChar(\"^\"),C=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type===\"Character\";if(B&&this.isRangeDash()){this.consumeChar(\"-\");var v=this.classAtom(),D=v.type===\"Character\";if(D){if(v.value<y.value)throw Error(\"Range out of order in character class\");p.push({from:y.value,to:v.value})}else s(y.value,p),p.push(n(\"-\")),s(v.value,p)}else s(y.value,p)}return this.consumeChar(\"]\"),{type:\"Set\",complement:C,value:p}},r.prototype.classAtom=function(){switch(this.peekChar()){case\"]\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":throw Error(\"TBD\");case\"\\\\\":return this.classEscape();default:return this.classPatternCharacterAtom()}},r.prototype.classEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"b\":return this.consumeChar(\"b\"),{type:\"Character\",value:n(\"\\b\")};case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.group=function(){var p=!0;switch(this.consumeChar(\"(\"),this.peekChar(0)){case\"?\":this.consumeChar(\"?\"),this.consumeChar(\":\"),p=!1;break;default:this.groupIdx++;break}var C=this.disjunction();this.consumeChar(\")\");var y={type:\"Group\",capturing:p,value:C};return p&&(y.idx=this.groupIdx),y},r.prototype.positiveInteger=function(){var p=this.popChar();if(i.test(p)===!1)throw Error(\"Expecting a positive integer\");for(;t.test(this.peekChar(0));)p+=this.popChar();return parseInt(p,10)},r.prototype.integerIncludingZero=function(){var p=this.popChar();if(t.test(p)===!1)throw Error(\"Expecting an integer\");for(;t.test(this.peekChar(0));)p+=this.popChar();return parseInt(p,10)},r.prototype.patternCharacter=function(){var p=this.popChar();switch(p){case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":throw Error(\"TBD\");default:return{type:\"Character\",value:n(p)}}},r.prototype.isRegExpFlag=function(){switch(this.peekChar(0)){case\"g\":case\"i\":case\"m\":case\"u\":case\"y\":return!0;default:return!1}},r.prototype.isRangeDash=function(){return this.peekChar()===\"-\"&&this.isClassAtom(1)},r.prototype.isDigit=function(){return t.test(this.peekChar(0))},r.prototype.isClassAtom=function(p){switch(p===void 0&&(p=0),this.peekChar(p)){case\"]\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},r.prototype.isTerm=function(){return this.isAtom()||this.isAssertion()},r.prototype.isAtom=function(){if(this.isPatternCharacter())return!0;switch(this.peekChar(0)){case\".\":case\"\\\\\":case\"[\":case\"(\":return!0;default:return!1}},r.prototype.isAssertion=function(){switch(this.peekChar(0)){case\"^\":case\"$\":return!0;case\"\\\\\":switch(this.peekChar(1)){case\"b\":case\"B\":return!0;default:return!1}case\"(\":return this.peekChar(1)===\"?\"&&(this.peekChar(2)===\"=\"||this.peekChar(2)===\"!\");default:return!1}},r.prototype.isQuantifier=function(){var p=this.saveState();try{return this.quantifier(!0)!==void 0}catch{return!1}finally{this.restoreState(p)}},r.prototype.isPatternCharacter=function(){switch(this.peekChar()){case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":case\"/\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},r.prototype.parseHexDigits=function(p){for(var C=\"\",y=0;y<p;y++){var B=this.popChar();if(e.test(B)===!1)throw Error(\"Expecting a HexDecimal digits\");C+=B}var v=parseInt(C,16);return{type:\"Character\",value:v}},r.prototype.peekChar=function(p){return p===void 0&&(p=0),this.input[this.idx+p]},r.prototype.popChar=function(){var p=this.peekChar(0);return this.consumeChar(),p},r.prototype.consumeChar=function(p){if(p!==void 0&&this.input[this.idx]!==p)throw Error(\"Expected: '\"+p+\"' but found: '\"+this.input[this.idx]+\"' at offset: \"+this.idx);if(this.idx>=this.input.length)throw Error(\"Unexpected end of input\");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.push(p)}function o(p,C){if(p[C]===!0)throw\"duplicate flag \"+C;p[C]=!0}function a(p){if(p===void 0)throw Error(\"Internal Error - Should never get here!\")}function l(){throw Error(\"Internal Error - Should never get here!\")}var c,u=[];for(c=n(\"0\");c<=n(\"9\");c++)u.push(c);var g=[n(\"_\")].concat(u);for(c=n(\"a\");c<=n(\"z\");c++)g.push(c);for(c=n(\"A\");c<=n(\"Z\");c++)g.push(c);var f=[n(\" \"),n(\"\\f\"),n(`\n`),n(\"\\r\"),n(\"\t\"),n(\"\\v\"),n(\"\t\"),n(\"\\xA0\"),n(\"\\u1680\"),n(\"\\u2000\"),n(\"\\u2001\"),n(\"\\u2002\"),n(\"\\u2003\"),n(\"\\u2004\"),n(\"\\u2005\"),n(\"\\u2006\"),n(\"\\u2007\"),n(\"\\u2008\"),n(\"\\u2009\"),n(\"\\u200A\"),n(\"\\u2028\"),n(\"\\u2029\"),n(\"\\u202F\"),n(\"\\u205F\"),n(\"\\u3000\"),n(\"\\uFEFF\")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var y=p[C];p.hasOwnProperty(C)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case\"Pattern\":this.visitPattern(p);break;case\"Flags\":this.visitFlags(p);break;case\"Disjunction\":this.visitDisjunction(p);break;case\"Alternative\":this.visitAlternative(p);break;case\"StartAnchor\":this.visitStartAnchor(p);break;case\"EndAnchor\":this.visitEndAnchor(p);break;case\"WordBoundary\":this.visitWordBoundary(p);break;case\"NonWordBoundary\":this.visitNonWordBoundary(p);break;case\"Lookahead\":this.visitLookahead(p);break;case\"NegativeLookahead\":this.visitNegativeLookahead(p);break;case\"Character\":this.visitCharacter(p);break;case\"Set\":this.visitSet(p);break;case\"Group\":this.visitGroup(p);break;case\"GroupBackReference\":this.visitGroupBackReference(p);break;case\"Quantifier\":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:\"0.5.0\"}})});var ty=w(Xg=>{\"use strict\";Object.defineProperty(Xg,\"__esModule\",{value:!0});Xg.clearRegExpParserCache=Xg.getRegExpAst=void 0;var dEe=$I(),ey={},CEe=new dEe.RegExpParser;function mEe(r){var e=r.toString();if(ey.hasOwnProperty(e))return ey[e];var t=CEe.pattern(e);return ey[e]=t,t}Xg.getRegExpAst=mEe;function EEe(){ey={}}Xg.clearRegExpParserCache=EEe});var YY=w(dn=>{\"use strict\";var IEe=dn&&dn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dn,\"__esModule\",{value:!0});dn.canMatchCharCode=dn.firstCharOptimizedIndices=dn.getOptimizedStartCodesIndices=dn.failedOptimizationPrefixMsg=void 0;var KY=$I(),gs=Gt(),HY=ty(),va=Rv(),GY=\"Complement Sets are not supported for first char optimization\";dn.failedOptimizationPrefixMsg=`Unable to use \"first char\" lexer optimizations:\n`;function yEe(r,e){e===void 0&&(e=!1);try{var t=(0,HY.getRegExpAst)(r),i=iy(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===GY)e&&(0,gs.PRINT_WARNING)(\"\"+dn.failedOptimizationPrefixMsg+(\"\tUnable to optimize: < \"+r.toString()+` >\n`)+`\tComplement Sets cannot be automatically optimized.\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n=\"\";e&&(n=`\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,gs.PRINT_ERROR)(dn.failedOptimizationPrefixMsg+`\n`+(\"\tFailed parsing: < \"+r.toString()+` >\n`)+(\"\tUsing the regexp-to-ast library version: \"+KY.VERSION+`\n`)+\"\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\"+n)}}return[]}dn.getOptimizedStartCodesIndices=yEe;function iy(r,e,t){switch(r.type){case\"Disjunction\":for(var i=0;i<r.value.length;i++)iy(r.value[i],e,t);break;case\"Alternative\":for(var n=r.value,i=0;i<n.length;i++){var s=n[i];switch(s.type){case\"EndAnchor\":case\"GroupBackReference\":case\"Lookahead\":case\"NegativeLookahead\":case\"StartAnchor\":case\"WordBoundary\":case\"NonWordBoundary\":continue}var o=s;switch(o.type){case\"Character\":ry(o.value,e,t);break;case\"Set\":if(o.complement===!0)throw Error(GY);(0,gs.forEach)(o.value,function(c){if(typeof c==\"number\")ry(c,e,t);else{var u=c;if(t===!0)for(var g=u.from;g<=u.to;g++)ry(g,e,t);else{for(var g=u.from;g<=u.to&&g<va.minOptimizationVal;g++)ry(g,e,t);if(u.to>=va.minOptimizationVal)for(var f=u.from>=va.minOptimizationVal?u.from:va.minOptimizationVal,h=u.to,p=(0,va.charCodeToOptimizedIndex)(f),C=(0,va.charCodeToOptimizedIndex)(h),y=p;y<=C;y++)e[y]=y}}});break;case\"Group\":iy(o.value,e,t);break;default:throw Error(\"Non Exhaustive Match\")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type===\"Group\"&&kv(o)===!1||o.type!==\"Group\"&&a===!1)break}break;default:throw Error(\"non exhaustive match!\")}return(0,gs.values)(e)}dn.firstCharOptimizedIndices=iy;function ry(r,e,t){var i=(0,va.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&wEe(r,e)}function wEe(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,va.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,va.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function UY(r,e){return(0,gs.find)(r.value,function(t){if(typeof t==\"number\")return(0,gs.contains)(e,t);var i=t;return(0,gs.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function kv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,gs.isArray)(r.value)?(0,gs.every)(r.value,kv):kv(r.value):!1}var BEe=function(r){IEe(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case\"Lookahead\":this.visitLookahead(t);return;case\"NegativeLookahead\":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,gs.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?UY(t,this.targetCharCodes)===void 0&&(this.found=!0):UY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(KY.BaseRegExpVisitor);function QEe(r,e){if(e instanceof RegExp){var t=(0,HY.getRegExpAst)(e),i=new BEe(r);return i.visit(t),i.found}else return(0,gs.find)(e,function(n){return(0,gs.contains)(r,n.charCodeAt(0))})!==void 0}dn.canMatchCharCode=QEe});var Rv=w(Ve=>{\"use strict\";var jY=Ve&&Ve.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ve,\"__esModule\",{value:!0});Ve.charCodeToOptimizedIndex=Ve.minOptimizationVal=Ve.buildLineBreakIssueMessage=Ve.LineTerminatorOptimizedTester=Ve.isShortPattern=Ve.isCustomPattern=Ve.cloneEmptyGroups=Ve.performWarningRuntimeChecks=Ve.performRuntimeChecks=Ve.addStickyFlag=Ve.addStartOfInput=Ve.findUnreachablePatterns=Ve.findModesThatDoNotExist=Ve.findInvalidGroupType=Ve.findDuplicatePatterns=Ve.findUnsupportedFlags=Ve.findStartOfInputAnchor=Ve.findEmptyMatchRegExps=Ve.findEndOfInputAnchor=Ve.findInvalidPatterns=Ve.findMissingPatterns=Ve.validatePatterns=Ve.analyzeTokenTypes=Ve.enableSticky=Ve.disableSticky=Ve.SUPPORT_STICKY=Ve.MODES=Ve.DEFAULT_MODE=void 0;var qY=$I(),ir=Bd(),xe=Gt(),Zg=YY(),JY=ty(),Do=\"PATTERN\";Ve.DEFAULT_MODE=\"defaultMode\";Ve.MODES=\"modes\";Ve.SUPPORT_STICKY=typeof new RegExp(\"(?:)\").sticky==\"boolean\";function bEe(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=bEe;function SEe(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=SEe;function vEe(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:\"full\",lineTerminatorCharacters:[\"\\r\",`\n`],tracer:function(v,D){return D()}});var t=e.tracer;t(\"initCharCodeToOptimizedIndexMap\",function(){OEe()});var i;t(\"Reject Lexer.NA\",function(){i=(0,xe.reject)(r,function(v){return v[Do]===ir.Lexer.NA})});var n=!1,s;t(\"Transform Patterns\",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[Do];if((0,xe.isRegExp)(D)){var L=D.source;return L.length===1&&L!==\"^\"&&L!==\"$\"&&L!==\".\"&&!D.ignoreCase?L:L.length===2&&L[0]===\"\\\\\"&&!(0,xe.contains)([\"d\",\"D\",\"s\",\"S\",\"t\",\"r\",\"n\",\"t\",\"0\",\"c\",\"b\",\"B\",\"f\",\"v\",\"w\",\"W\"],L[1])?L[1]:e.useSticky?Lv(D):Nv(D)}else{if((0,xe.isFunction)(D))return n=!0,{exec:D};if((0,xe.has)(D,\"exec\"))return n=!0,D;if(typeof D==\"string\"){if(D.length===1)return D;var H=D.replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\"),j=new RegExp(H);return e.useSticky?Lv(j):Nv(j)}else throw Error(\"non exhaustive match\")}})});var o,a,l,c,u;t(\"misc mapping\",function(){o=(0,xe.map)(i,function(v){return v.tokenTypeIdx}),a=(0,xe.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,xe.isString)(D))return D;if((0,xe.isUndefined)(D))return!1;throw Error(\"non exhaustive match\")}}),l=(0,xe.map)(i,function(v){var D=v.LONGER_ALT;if(D){var L=(0,xe.isArray)(D)?(0,xe.map)(D,function(H){return(0,xe.indexOf)(i,H)}):[(0,xe.indexOf)(i,D)];return L}}),c=(0,xe.map)(i,function(v){return v.PUSH_MODE}),u=(0,xe.map)(i,function(v){return(0,xe.has)(v,\"POP_MODE\")})});var g;t(\"Line Terminator Handling\",function(){var v=oj(e.lineTerminatorCharacters);g=(0,xe.map)(i,function(D){return!1}),e.positionTracking!==\"onlyOffset\"&&(g=(0,xe.map)(i,function(D){if((0,xe.has)(D,\"LINE_BREAKS\"))return D.LINE_BREAKS;if(nj(D,v)===!1)return(0,Zg.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t(\"Misc Mapping #2\",function(){f=(0,xe.map)(i,Ov),h=(0,xe.map)(s,ij),p=(0,xe.reduce)(i,function(v,D){var L=D.GROUP;return(0,xe.isString)(L)&&L!==ir.Lexer.SKIPPED&&(v[L]=[]),v},{}),C=(0,xe.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var y=!0,B=[];return e.safeMode||t(\"First Char Optimization\",function(){B=(0,xe.reduce)(i,function(v,D,L){if(typeof D.PATTERN==\"string\"){var H=D.PATTERN.charCodeAt(0),j=Tv(H);Fv(v,j,C[L])}else if((0,xe.isArray)(D.START_CHARS_HINT)){var $;(0,xe.forEach)(D.START_CHARS_HINT,function(W){var _=typeof W==\"string\"?W.charCodeAt(0):W,A=Tv(_);$!==A&&($=A,Fv(v,A,C[L]))})}else if((0,xe.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,xe.PRINT_ERROR)(\"\"+Zg.failedOptimizationPrefixMsg+(\"\tUnable to analyze < \"+D.PATTERN.toString()+` > pattern.\n`)+`\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,Zg.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,xe.isEmpty)(V)&&(y=!1),(0,xe.forEach)(V,function(W){Fv(v,W,C[L])})}else e.ensureOptimizations&&(0,xe.PRINT_ERROR)(\"\"+Zg.failedOptimizationPrefixMsg+(\"\tTokenType: <\"+D.name+`> is using a custom token pattern without providing <start_chars_hint> parameter.\n`)+`\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t(\"ArrayPacking\",function(){B=(0,xe.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}Ve.analyzeTokenTypes=vEe;function xEe(r,e){var t=[],i=WY(r);t=t.concat(i.errors);var n=zY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(PEe(s)),t=t.concat(ej(s)),t=t.concat(tj(s,e)),t=t.concat(rj(s)),t}Ve.validatePatterns=xEe;function PEe(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[Do])});return e=e.concat(VY(t)),e=e.concat(ZY(t)),e=e.concat(_Y(t)),e=e.concat($Y(t)),e=e.concat(XY(t)),e}function WY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,Do)}),t=(0,xe.map)(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- missing static 'PATTERN' property\",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findMissingPatterns=WY;function zY(r){var e=(0,xe.filter)(r,function(n){var s=n[Do];return!(0,xe.isRegExp)(s)&&!(0,xe.isFunction)(s)&&!(0,xe.has)(s,\"exec\")&&!(0,xe.isString)(s)}),t=(0,xe.map)(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findInvalidPatterns=zY;var DEe=/[^\\\\][\\$]/;function VY(r){var e=function(n){jY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(qY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[Do];try{var o=(0,JY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return DEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error:\n\tToken Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findEndOfInputAnchor=VY;function XY(r){var e=(0,xe.filter)(r,function(i){var n=i[Do];return n.test(\"\")}),t=(0,xe.map)(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'PATTERN' must not match an empty string\",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ve.findEmptyMatchRegExps=XY;var kEe=/[^\\\\[][\\^]|^\\^/;function ZY(r){var e=function(n){jY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(qY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[Do];try{var o=(0,JY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return kEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error:\n\tToken Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findStartOfInputAnchor=ZY;function _Y(r){var e=(0,xe.filter)(r,function(i){var n=i[Do];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,xe.map)(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ve.findUnsupportedFlags=_Y;function $Y(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,xe.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,xe.compact)(t);var i=(0,xe.filter)(t,function(s){return s.length>1}),n=(0,xe.map)(i,function(s){var o=(0,xe.map)(s,function(l){return l.name}),a=(0,xe.first)(s).PATTERN;return{message:\"The same RegExp pattern ->\"+a+\"<-\"+(\"has been used in all of the following Token Types: \"+o.join(\", \")+\" <-\"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ve.findDuplicatePatterns=$Y;function ej(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,\"GROUP\"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,xe.isString)(n)}),t=(0,xe.map)(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ve.findInvalidGroupType=ej;function tj(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,xe.contains)(e,n.PUSH_MODE)}),i=(0,xe.map)(t,function(n){var s=\"Token Type: ->\"+n.name+\"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\"+n.PUSH_MODE+\"<-which does not exist\";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ve.findModesThatDoNotExist=tj;function rj(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,xe.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,xe.isRegExp)(o)&&FEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,xe.forEach)(r,function(i,n){(0,xe.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n<a&&REe(o,i.PATTERN)){var c=\"Token: ->\"+l.name+`<- can never be matched.\n`+(\"Because it appears AFTER the Token Type ->\"+i.name+\"<-\")+`in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ve.findUnreachablePatterns=rj;function REe(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,xe.isFunction)(e))return e(r,0,[],{});if((0,xe.has)(e,\"exec\"))return e.exec(r,0,[],{});if(typeof e==\"string\")return e===r;throw Error(\"non exhaustive match\")}}function FEe(r){var e=[\".\",\"\\\\\",\"[\",\"]\",\"|\",\"^\",\"$\",\"(\",\")\",\"?\",\"*\",\"+\",\"{\"];return(0,xe.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Nv(r){var e=r.ignoreCase?\"i\":\"\";return new RegExp(\"^(?:\"+r.source+\")\",e)}Ve.addStartOfInput=Nv;function Lv(r){var e=r.ignoreCase?\"iy\":\"y\";return new RegExp(\"\"+r.source,e)}Ve.addStickyFlag=Lv;function NEe(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+Ve.DEFAULT_MODE+`> property in its definition\n`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,xe.has)(r,Ve.MODES)||i.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+Ve.MODES+`> property in its definition\n`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,xe.has)(r,Ve.MODES)&&(0,xe.has)(r,Ve.DEFAULT_MODE)&&!(0,xe.has)(r.modes,r.defaultMode)&&i.push({message:\"A MultiMode Lexer cannot be initialized with a \"+Ve.DEFAULT_MODE+\": <\"+r.defaultMode+`>which does not exist\n`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,xe.has)(r,Ve.MODES)&&(0,xe.forEach)(r.modes,function(n,s){(0,xe.forEach)(n,function(o,a){(0,xe.isUndefined)(o)&&i.push({message:\"A Lexer cannot be initialized using an undefined Token Type. Mode:\"+(\"<\"+s+\"> at index: <\"+a+`>\n`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ve.performRuntimeChecks=NEe;function LEe(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe.mapValues)(r.modes,function(l){return l}))),o=(0,xe.reject)(s,function(l){return l[Do]===ir.Lexer.NA}),a=oj(t);return e&&(0,xe.forEach)(o,function(l){var c=nj(l,a);if(c!==!1){var u=sj(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,xe.has)(l,\"LINE_BREAKS\")?l.LINE_BREAKS===!0&&(n=!0):(0,Zg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ve.performWarningRuntimeChecks=LEe;function TEe(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,function(i){var n=r[i];if((0,xe.isArray)(n))e[i]=[];else throw Error(\"non exhaustive match\")}),e}Ve.cloneEmptyGroups=TEe;function Ov(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.isFunction)(e))return!0;if((0,xe.has)(e,\"exec\"))return!0;if((0,xe.isString)(e))return!1;throw Error(\"non exhaustive match\")}Ve.isCustomPattern=Ov;function ij(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=ij;Ve.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t<e;t++){var i=r.charCodeAt(t);if(i===10)return this.lastIndex=t+1,!0;if(i===13)return r.charCodeAt(t+1)===10?this.lastIndex=t+2:this.lastIndex=t+1,!0}return!1},lastIndex:0};function nj(r,e){if((0,xe.has)(r,\"LINE_BREAKS\"))return!1;if((0,xe.isRegExp)(r.PATTERN)){try{(0,Zg.canMatchCharCode)(e,r.PATTERN)}catch(t){return{issue:ir.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:t.message}}return!1}else{if((0,xe.isString)(r.PATTERN))return!1;if(Ov(r))return{issue:ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error(\"non exhaustive match\")}}function sj(r,e){if(e.issue===ir.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern.\n`+(\"\tThe problem is in the <\"+r.name+`> Token Type\n`)+(\"\t Root cause: \"+e.errMsg+`.\n`)+\"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the <line_breaks> option.\n`+(\"\tThe problem is in the <\"+r.name+`> Token Type\n`)+\"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\";throw Error(\"non exhaustive match\")}Ve.buildLineBreakIssueMessage=sj;function oj(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Fv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ve.minOptimizationVal=256;var ny=[];function Tv(r){return r<Ve.minOptimizationVal?r:ny[r]}Ve.charCodeToOptimizedIndex=Tv;function OEe(){if((0,xe.isEmpty)(ny)){ny=new Array(65536);for(var r=0;r<65536;r++)ny[r]=r>255?255+~~(r/255):r}}});var _g=w(Nt=>{\"use strict\";Object.defineProperty(Nt,\"__esModule\",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var Zr=Gt();function MEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=MEe;function UEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=UEe;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function KEe(r){var e=aj(r);Aj(e),cj(e),lj(e),(0,Zr.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=KEe;function aj(r){for(var e=(0,Zr.cloneArr)(r),t=r,i=!0;i;){t=(0,Zr.compact)((0,Zr.flatten)((0,Zr.map)(t,function(s){return s.CATEGORIES})));var n=(0,Zr.difference)(t,e);e=e.concat(n),(0,Zr.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=aj;function Aj(r){(0,Zr.forEach)(r,function(e){uj(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),Mv(e)&&!(0,Zr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Mv(e)||(e.CATEGORIES=[]),gj(e)||(e.categoryMatches=[]),fj(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=Aj;function lj(r){(0,Zr.forEach)(r,function(e){e.categoryMatches=[],(0,Zr.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=lj;function cj(r){(0,Zr.forEach)(r,function(e){Uv([],e)})}Nt.assignCategoriesMapProp=cj;function Uv(r,e){(0,Zr.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,Zr.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,Zr.contains)(i,t)||Uv(i,t)})}Nt.singleAssignCategoriesToksMap=Uv;function uj(r){return(0,Zr.has)(r,\"tokenTypeIdx\")}Nt.hasShortKeyProperty=uj;function Mv(r){return(0,Zr.has)(r,\"CATEGORIES\")}Nt.hasCategoriesProperty=Mv;function gj(r){return(0,Zr.has)(r,\"categoryMatches\")}Nt.hasExtendingTokensTypesProperty=gj;function fj(r){return(0,Zr.has)(r,\"categoryMatchesMap\")}Nt.hasExtendingTokensTypesMapProperty=fj;function HEe(r){return(0,Zr.has)(r,\"tokenTypeIdx\")}Nt.isTokenType=HEe});var Kv=w(sy=>{\"use strict\";Object.defineProperty(sy,\"__esModule\",{value:!0});sy.defaultLexerErrorProvider=void 0;sy.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return\"Unable to pop Lexer Mode after encountering Token ->\"+r.image+\"<- The Mode Stack is empty\"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return\"unexpected character: ->\"+r.charAt(e)+\"<- at offset: \"+e+\",\"+(\" skipped \"+t+\" characters.\")}}});var Bd=w(Cc=>{\"use strict\";Object.defineProperty(Cc,\"__esModule\",{value:!0});Cc.Lexer=Cc.LexerDefinitionErrorType=void 0;var _s=Rv(),nr=Gt(),GEe=_g(),YEe=Kv(),jEe=ty(),qEe;(function(r){r[r.MISSING_PATTERN=0]=\"MISSING_PATTERN\",r[r.INVALID_PATTERN=1]=\"INVALID_PATTERN\",r[r.EOI_ANCHOR_FOUND=2]=\"EOI_ANCHOR_FOUND\",r[r.UNSUPPORTED_FLAGS_FOUND=3]=\"UNSUPPORTED_FLAGS_FOUND\",r[r.DUPLICATE_PATTERNS_FOUND=4]=\"DUPLICATE_PATTERNS_FOUND\",r[r.INVALID_GROUP_TYPE_FOUND=5]=\"INVALID_GROUP_TYPE_FOUND\",r[r.PUSH_MODE_DOES_NOT_EXIST=6]=\"PUSH_MODE_DOES_NOT_EXIST\",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]=\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]=\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]=\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]=\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\",r[r.SOI_ANCHOR_FOUND=11]=\"SOI_ANCHOR_FOUND\",r[r.EMPTY_MATCH_PATTERN=12]=\"EMPTY_MATCH_PATTERN\",r[r.NO_LINE_BREAKS_FLAGS=13]=\"NO_LINE_BREAKS_FLAGS\",r[r.UNREACHABLE_PATTERN=14]=\"UNREACHABLE_PATTERN\",r[r.IDENTIFY_TERMINATOR=15]=\"IDENTIFY_TERMINATOR\",r[r.CUSTOM_LINE_BREAK=16]=\"CUSTOM_LINE_BREAK\"})(qEe=Cc.LexerDefinitionErrorType||(Cc.LexerDefinitionErrorType={}));var Qd={deferDefinitionErrorsHandling:!1,positionTracking:\"full\",lineTerminatorsPattern:/\\n|\\r\\n?/g,lineTerminatorCharacters:[`\n`,\"\\r\"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:YEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Qd);var JEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=Qd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t==\"boolean\")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(Qd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n==\"number\"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT(\"Lexer Constructor\",function(){var s,o=!0;i.TRACE_INIT(\"Lexer Config handling\",function(){if(i.config.lineTerminatorsPattern===Qd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=_s.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Qd.lineTerminatorCharacters)throw Error(`Error: Missing <lineTerminatorCharacters> property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[_s.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[_s.DEFAULT_MODE]=_s.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT(\"performRuntimeChecks\",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,_s.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT(\"performWarningRuntimeChecks\",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,_s.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT(\"Mode: <\"+g+\"> processing\",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT(\"validatePatterns\",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,_s.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,GEe.augmentTokenTypes)(u);var f;i.TRACE_INIT(\"analyzeTokenTypes\",function(){f=(0,_s.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`-----------------------\n`);throw new Error(`Errors detected in definition of Lexer:\n`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT(\"Choosing sub-methods implementations\",function(){if(_s.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid <positionTracking> config option: \"'+i.config.positionTracking+'\"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT(\"Failed Optimization Warnings\",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error(\"Lexer Modes: < \"+u.join(\", \")+` > cannot be optimized.\n\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT(\"clearRegExpParserCache\",function(){(0,jEe.clearRegExpParserCache)()}),i.TRACE_INIT(\"toFastProperties\",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`-----------------------\n`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer:\n`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,y,B,v,D,L=e,H=L.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),_=[],A=this.trackStartLines?1:void 0,Ae=this.trackStartLines?1:void 0,ge=(0,_s.cloneEmptyGroups)(this.emptyGroups),re=this.trackStartLines,O=this.config.lineTerminatorsPattern,F=0,ue=[],pe=[],ke=[],Fe=[];Object.freeze(Fe);var Ne=void 0;function oe(){return ue}function le(pr){var Ii=(0,_s.charCodeToOptimizedIndex)(pr),rs=pe[Ii];return rs===void 0?Fe:rs}var Be=function(pr){if(ke.length===1&&pr.tokenType.PUSH_MODE===void 0){var Ii=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(pr);_.push({offset:pr.startOffset,line:pr.startLine!==void 0?pr.startLine:void 0,column:pr.startColumn!==void 0?pr.startColumn:void 0,length:pr.image.length,message:Ii})}else{ke.pop();var rs=(0,nr.last)(ke);ue=i.patternIdxToConfig[rs],pe=i.charCodeToPatternIdxToConfig[rs],F=ue.length;var ga=i.canModeBeOptimized[rs]&&i.config.safeMode===!1;pe&&ga?Ne=le:Ne=oe}};function fe(pr){ke.push(pr),pe=this.charCodeToPatternIdxToConfig[pr],ue=this.patternIdxToConfig[pr],F=ue.length,F=ue.length;var Ii=this.canModeBeOptimized[pr]&&this.config.safeMode===!1;pe&&Ii?Ne=le:Ne=oe}fe.call(this,t);for(var ae;j<H;){c=null;var qe=L.charCodeAt(j),ne=Ne(qe),Y=ne.length;for(n=0;n<Y;n++){ae=ne[n];var he=ae.pattern;u=null;var ie=ae.short;if(ie!==!1?qe===ie&&(c=he):ae.isCustom===!0?(D=he.exec(L,j,W,ge),D!==null?(c=D[0],D.payload!==void 0&&(u=D.payload)):c=null):(this.updateLastIndex(he,j),c=this.match(he,e,j)),c!==null){if(l=ae.longerAlt,l!==void 0){var de=l.length;for(o=0;o<de;o++){var _e=ue[l[o]],Pt=_e.pattern;if(g=null,_e.isCustom===!0?(D=Pt.exec(L,j,W,ge),D!==null?(a=D[0],D.payload!==void 0&&(g=D.payload)):a=null):(this.updateLastIndex(Pt,j),a=this.match(Pt,e,j)),a&&a.length>c.length){c=a,u=g,ae=_e;break}}}break}}if(c!==null){if(f=c.length,h=ae.group,h!==void 0&&(p=ae.tokenTypeIdx,C=this.createTokenInstance(c,j,p,ae.tokenType,A,Ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,Ae=this.computeNewColumn(Ae,f),re===!0&&ae.canLineTerminator===!0){var It=0,Or=void 0,ii=void 0;O.lastIndex=0;do Or=O.test(c),Or===!0&&(ii=O.lastIndex-1,It++);while(Or===!0);It!==0&&(A=A+It,Ae=f-ii,this.updateTokenEndLineColumnLocation(C,h,ii,It,A,Ae,f))}this.handleModes(ae,Be,fe,C)}else{for(var gi=j,hr=A,fi=Ae,ni=!1;!ni&&j<H;)for(B=L.charCodeAt(j),e=this.chopInput(e,1),j++,s=0;s<F;s++){var Us=ue[s],he=Us.pattern,ie=Us.short;if(ie!==!1?L.charCodeAt(j)===ie&&(ni=!0):Us.isCustom===!0?ni=he.exec(L,j,W,ge)!==null:(this.updateLastIndex(he,j),ni=he.exec(e)!==null),ni===!0)break}y=j-gi,v=this.config.errorMessageProvider.buildUnexpectedCharactersMessage(L,gi,y,hr,fi),_.push({offset:gi,line:hr,column:fi,length:y,message:v})}}return this.hasCustom||(W.length=$),{tokens:W,groups:ge,errors:_}},r.prototype.handleModes=function(e,t,i,n){if(e.pop===!0){var s=e.push;t(n),s!==void 0&&i.call(this,s)}else e.push!==void 0&&i.call(this,e.push)},r.prototype.chopInput=function(e,t){return e.substring(t)},r.prototype.updateLastIndex=function(e,t){e.lastIndex=t},r.prototype.updateTokenEndLineColumnLocation=function(e,t,i,n,s,o,a){var l,c;t!==void 0&&(l=i===a-1,c=l?-1:0,n===1&&l===!0||(e.endLine=s+c,e.endColumn=o-1+-c))},r.prototype.computeNewColumn=function(e,t){return e+t},r.prototype.createTokenInstance=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return null},r.prototype.createOffsetOnlyToken=function(e,t,i,n){return{image:e,startOffset:t,tokenTypeIdx:i,tokenType:n}},r.prototype.createStartOnlyToken=function(e,t,i,n,s,o){return{image:e,startOffset:t,startLine:s,startColumn:o,tokenTypeIdx:i,tokenType:n}},r.prototype.createFullToken=function(e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:t+a-1,startLine:s,endLine:s,startColumn:o,endColumn:o+a-1,tokenTypeIdx:i,tokenType:n}},r.prototype.addToken=function(e,t,i){return 666},r.prototype.addTokenUsingPush=function(e,t,i){return e.push(i),t},r.prototype.addTokenUsingMemberAccess=function(e,t,i){return e[t]=i,t++,t},r.prototype.handlePayload=function(e,t){},r.prototype.handlePayloadNoCustom=function(e,t){},r.prototype.handlePayloadWithCustom=function(e,t){t!==null&&(e.payload=t)},r.prototype.match=function(e,t,i){return null},r.prototype.matchWithTest=function(e,t,i){var n=e.test(t);return n===!0?t.substring(i,e.lastIndex):null},r.prototype.matchWithExec=function(e,t){var i=e.exec(t);return i!==null?i[0]:i},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(\"\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(i+\"--> <\"+e+\">\");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&a(i+\"<-- <\"+e+\"> time: \"+s+\"ms\"),this.traceInitIndent--,o}else return t()},r.SKIPPED=\"This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\",r.NA=/NOT_APPLICABLE/,r}();Cc.Lexer=JEe});var LA=w(bi=>{\"use strict\";Object.defineProperty(bi,\"__esModule\",{value:!0});bi.tokenMatcher=bi.createTokenInstance=bi.EOF=bi.createToken=bi.hasTokenLabel=bi.tokenName=bi.tokenLabel=void 0;var $s=Gt(),WEe=Bd(),Hv=_g();function zEe(r){return wj(r)?r.LABEL:r.name}bi.tokenLabel=zEe;function VEe(r){return r.name}bi.tokenName=VEe;function wj(r){return(0,$s.isString)(r.LABEL)&&r.LABEL!==\"\"}bi.hasTokenLabel=wj;var XEe=\"parent\",hj=\"categories\",pj=\"label\",dj=\"group\",Cj=\"push_mode\",mj=\"pop_mode\",Ej=\"longer_alt\",Ij=\"line_breaks\",yj=\"start_chars_hint\";function Bj(r){return ZEe(r)}bi.createToken=Bj;function ZEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,$s.isUndefined)(e)||(t.PATTERN=e),(0,$s.has)(r,XEe))throw`The parent property is no longer supported.\nSee: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,$s.has)(r,hj)&&(t.CATEGORIES=r[hj]),(0,Hv.augmentTokenTypes)([t]),(0,$s.has)(r,pj)&&(t.LABEL=r[pj]),(0,$s.has)(r,dj)&&(t.GROUP=r[dj]),(0,$s.has)(r,mj)&&(t.POP_MODE=r[mj]),(0,$s.has)(r,Cj)&&(t.PUSH_MODE=r[Cj]),(0,$s.has)(r,Ej)&&(t.LONGER_ALT=r[Ej]),(0,$s.has)(r,Ij)&&(t.LINE_BREAKS=r[Ij]),(0,$s.has)(r,yj)&&(t.START_CHARS_HINT=r[yj]),t}bi.EOF=Bj({name:\"EOF\",pattern:WEe.Lexer.NA});(0,Hv.augmentTokenTypes)([bi.EOF]);function _Ee(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}bi.createTokenInstance=_Ee;function $Ee(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}bi.tokenMatcher=$Ee});var Cn=w(zt=>{\"use strict\";var xa=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,\"__esModule\",{value:!0});zt.serializeProduction=zt.serializeGrammar=zt.Terminal=zt.Alternation=zt.RepetitionWithSeparator=zt.Repetition=zt.RepetitionMandatoryWithSeparator=zt.RepetitionMandatory=zt.Option=zt.Alternative=zt.Rule=zt.NonTerminal=zt.AbstractProduction=void 0;var Ar=Gt(),eIe=LA(),ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,\"definition\",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,Ar.forEach)(this.definition,function(t){t.accept(e)})},r}();zt.AbstractProduction=ko;var Qj=function(r){xa(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,\"definition\",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(ko);zt.NonTerminal=Qj;var bj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText=\"\",(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Rule=bj;var Sj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Alternative=Sj;var vj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Option=vj;var xj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionMandatory=xj;var Pj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionMandatoryWithSeparator=Pj;var Dj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Repetition=Dj;var kj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionWithSeparator=kj;var Rj=function(r){xa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,\"definition\",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(ko);zt.Alternation=Rj;var oy=function(){function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();zt.Terminal=oy;function tIe(r){return(0,Ar.map)(r,bd)}zt.serializeGrammar=tIe;function bd(r){function e(s){return(0,Ar.map)(s,bd)}if(r instanceof Qj){var t={type:\"NonTerminal\",name:r.nonTerminalName,idx:r.idx};return(0,Ar.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof Sj)return{type:\"Alternative\",definition:e(r.definition)};if(r instanceof vj)return{type:\"Option\",idx:r.idx,definition:e(r.definition)};if(r instanceof xj)return{type:\"RepetitionMandatory\",idx:r.idx,definition:e(r.definition)};if(r instanceof Pj)return{type:\"RepetitionMandatoryWithSeparator\",idx:r.idx,separator:bd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof kj)return{type:\"RepetitionWithSeparator\",idx:r.idx,separator:bd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Dj)return{type:\"Repetition\",idx:r.idx,definition:e(r.definition)};if(r instanceof Rj)return{type:\"Alternation\",idx:r.idx,definition:e(r.definition)};if(r instanceof oy){var i={type:\"Terminal\",name:r.terminalType.name,label:(0,eIe.tokenLabel)(r.terminalType),idx:r.idx};(0,Ar.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,Ar.isRegExp)(n)?n.source:n),i}else{if(r instanceof bj)return{type:\"Rule\",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error(\"non exhaustive match\")}}}zt.serializeProduction=bd});var Ay=w(ay=>{\"use strict\";Object.defineProperty(ay,\"__esModule\",{value:!0});ay.RestWalker=void 0;var Gv=Gt(),mn=Cn(),rIe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,Gv.forEach)(e.definition,function(n,s){var o=(0,Gv.drop)(e.definition,s+1);if(n instanceof mn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof mn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof mn.Alternative)i.walkFlat(n,o,t);else if(n instanceof mn.Option)i.walkOption(n,o,t);else if(n instanceof mn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof mn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof mn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof mn.Repetition)i.walkMany(n,o,t);else if(n instanceof mn.Alternation)i.walkOr(n,o,t);else throw Error(\"non exhaustive match\")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new mn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=Fj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new mn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=Fj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,Gv.forEach)(e.definition,function(o){var a=new mn.Alternative({definition:[o]});n.walk(a,s)})},r}();ay.RestWalker=rIe;function Fj(r,e,t){var i=[new mn.Option({definition:[new mn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var $g=w(ly=>{\"use strict\";Object.defineProperty(ly,\"__esModule\",{value:!0});ly.GAstVisitor=void 0;var Ro=Cn(),iIe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Ro.NonTerminal:return this.visitNonTerminal(t);case Ro.Alternative:return this.visitAlternative(t);case Ro.Option:return this.visitOption(t);case Ro.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Ro.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Ro.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Ro.Repetition:return this.visitRepetition(t);case Ro.Alternation:return this.visitAlternation(t);case Ro.Terminal:return this.visitTerminal(t);case Ro.Rule:return this.visitRule(t);default:throw Error(\"non exhaustive match\")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();ly.GAstVisitor=iIe});var vd=w(Mi=>{\"use strict\";var nIe=Mi&&Mi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Mi,\"__esModule\",{value:!0});Mi.collectMethods=Mi.DslMethodsCollectorVisitor=Mi.getProductionDslName=Mi.isBranchingProd=Mi.isOptionalProd=Mi.isSequenceProd=void 0;var Sd=Gt(),Qr=Cn(),sIe=$g();function oIe(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Mi.isSequenceProd=oIe;function Yv(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,Sd.some)(r.definition,function(i){return Yv(i,e)}):r instanceof Qr.NonTerminal&&(0,Sd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,Sd.every)(r.definition,function(i){return Yv(i,e)})):!1}Mi.isOptionalProd=Yv;function aIe(r){return r instanceof Qr.Alternation}Mi.isBranchingProd=aIe;function AIe(r){if(r instanceof Qr.NonTerminal)return\"SUBRULE\";if(r instanceof Qr.Option)return\"OPTION\";if(r instanceof Qr.Alternation)return\"OR\";if(r instanceof Qr.RepetitionMandatory)return\"AT_LEAST_ONE\";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return\"AT_LEAST_ONE_SEP\";if(r instanceof Qr.RepetitionWithSeparator)return\"MANY_SEP\";if(r instanceof Qr.Repetition)return\"MANY\";if(r instanceof Qr.Terminal)return\"CONSUME\";throw Error(\"non exhaustive match\")}Mi.getProductionDslName=AIe;var Nj=function(r){nIe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator=\"-\",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+\"Terminal\";(0,Sd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+\"Terminal\";(0,Sd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(sIe.GAstVisitor);Mi.DslMethodsCollectorVisitor=Nj;var cy=new Nj;function lIe(r){cy.reset(),r.accept(cy);var e=cy.dslMethods;return cy.reset(),e}Mi.collectMethods=lIe});var qv=w(Fo=>{\"use strict\";Object.defineProperty(Fo,\"__esModule\",{value:!0});Fo.firstForTerminal=Fo.firstForBranching=Fo.firstForSequence=Fo.first=void 0;var uy=Gt(),Lj=Cn(),jv=vd();function gy(r){if(r instanceof Lj.NonTerminal)return gy(r.referencedRule);if(r instanceof Lj.Terminal)return Mj(r);if((0,jv.isSequenceProd)(r))return Tj(r);if((0,jv.isBranchingProd)(r))return Oj(r);throw Error(\"non exhaustive match\")}Fo.first=gy;function Tj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,jv.isOptionalProd)(s),e=e.concat(gy(s)),i=i+1,n=t.length>i;return(0,uy.uniq)(e)}Fo.firstForSequence=Tj;function Oj(r){var e=(0,uy.map)(r.definition,function(t){return gy(t)});return(0,uy.uniq)((0,uy.flatten)(e))}Fo.firstForBranching=Oj;function Mj(r){return[r.terminalType]}Fo.firstForTerminal=Mj});var Jv=w(fy=>{\"use strict\";Object.defineProperty(fy,\"__esModule\",{value:!0});fy.IN=void 0;fy.IN=\"_~IN~_\"});var Yj=w(fs=>{\"use strict\";var cIe=fs&&fs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(fs,\"__esModule\",{value:!0});fs.buildInProdFollowPrefix=fs.buildBetweenProdsFollowPrefix=fs.computeAllProdsFollows=fs.ResyncFollowsWalker=void 0;var uIe=Ay(),gIe=qv(),Uj=Gt(),Kj=Jv(),fIe=Cn(),Hj=function(r){cIe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=Gj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new fIe.Alternative({definition:o}),l=(0,gIe.first)(a);this.follows[s]=l},e}(uIe.RestWalker);fs.ResyncFollowsWalker=Hj;function hIe(r){var e={};return(0,Uj.forEach)(r,function(t){var i=new Hj(t).startWalking();(0,Uj.assign)(e,i)}),e}fs.computeAllProdsFollows=hIe;function Gj(r,e){return r.name+e+Kj.IN}fs.buildBetweenProdsFollowPrefix=Gj;function pIe(r){var e=r.terminalType.name;return e+r.idx+Kj.IN}fs.buildInProdFollowPrefix=pIe});var xd=w(Pa=>{\"use strict\";Object.defineProperty(Pa,\"__esModule\",{value:!0});Pa.defaultGrammarValidatorErrorProvider=Pa.defaultGrammarResolverErrorProvider=Pa.defaultParserErrorProvider=void 0;var ef=LA(),dIe=Gt(),eo=Gt(),Wv=Cn(),jj=vd();Pa.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,ef.hasTokenLabel)(e),o=s?\"--> \"+(0,ef.tokenLabel)(e)+\" <--\":\"token of type --> \"+e.name+\" <--\",a=\"Expecting \"+o+\" but found --> '\"+t.image+\"' <--\";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return\"Redundant input, expecting EOF but found: \"+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o=\"Expecting: \",a=(0,eo.first)(t).image,l=`\nbut found: '`+a+\"'\";if(n)return o+n+l;var c=(0,eo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,eo.map)(c,function(h){return\"[\"+(0,eo.map)(h,function(p){return(0,ef.tokenLabel)(p)}).join(\", \")+\"]\"}),g=(0,eo.map)(u,function(h,p){return\"  \"+(p+1)+\". \"+h}),f=`one of these possible Token sequences:\n`+g.join(`\n`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s=\"Expecting: \",o=(0,eo.first)(t).image,a=`\nbut found: '`+o+\"'\";if(i)return s+i+a;var l=(0,eo.map)(e,function(u){return\"[\"+(0,eo.map)(u,function(g){return(0,ef.tokenLabel)(g)}).join(\",\")+\"]\"}),c=`expecting at least one iteration which starts with one of these possible Token sequences::\n  `+(\"<\"+l.join(\" ,\")+\">\");return s+c+a}};Object.freeze(Pa.defaultParserErrorProvider);Pa.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t=\"Invalid grammar, reference to a rule which is not defined: ->\"+e.nonTerminalName+`<-\ninside top level rule: ->`+r.name+\"<-\";return t}};Pa.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Wv.Terminal?u.terminalType.name:u instanceof Wv.NonTerminal?u.nonTerminalName:\"\"}var i=r.name,n=(0,eo.first)(e),s=n.idx,o=(0,jj.getProductionDslName)(n),a=t(n),l=s>0,c=\"->\"+o+(l?s:\"\")+\"<- \"+(a?\"with argument: ->\"+a+\"<-\":\"\")+`\n                  appears more than once (`+e.length+\" times) in the top level rule: ->\"+i+`<-.                  \n                  For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n                  `;return c=c.replace(/[ \\t]+/g,\" \"),c=c.replace(/\\s\\s+/g,`\n`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar.\n`+(\"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\"+r.name+`>.\n`)+`To resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,eo.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(\", \"),t=r.alternation.idx===0?\"\":r.alternation.idx,i=\"Ambiguous alternatives: <\"+r.ambiguityIndices.join(\" ,\")+`> due to common lookahead prefix\n`+(\"in <OR\"+t+\"> inside <\"+r.topLevelRule.name+`> Rule,\n`)+(\"<\"+e+`> may appears as a prefix path in all these alternatives.\n`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,eo.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(\", \"),t=r.alternation.idx===0?\"\":r.alternation.idx,i=\"Ambiguous Alternatives Detected: <\"+r.ambiguityIndices.join(\" ,\")+\"> in <OR\"+t+\">\"+(\" inside <\"+r.topLevelRule.name+`> Rule,\n`)+(\"<\"+e+`> may appears as a prefix path in all these alternatives.\n`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,jj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t=\"The repetition <\"+e+\"> within Rule <\"+r.topLevelRule.name+`> can never consume any tokens.\nThis could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return\"deprecated\"},buildEmptyAlternationError:function(r){var e=\"Ambiguous empty alternative: <\"+(r.emptyChoiceIdx+1)+\">\"+(\" in <OR\"+r.alternation.idx+\"> inside <\"+r.topLevelRule.name+`> Rule.\n`)+\"Only the last alternative may be an empty alternative.\";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives:\n`+(\"<OR\"+r.alternation.idx+\"> inside <\"+r.topLevelRule.name+`> Rule.\n has `+(r.alternation.definition.length+1)+\" alternatives.\");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=dIe.map(r.leftRecursionPath,function(s){return s.name}),i=e+\" --> \"+t.concat([e]).join(\" --> \"),n=`Left Recursion found in grammar.\n`+(\"rule: <\"+e+`> can be invoked from itself (directly or indirectly)\n`)+(`without consuming any Tokens. The grammar path that causes this is: \n `+i+`\n`)+` To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return\"deprecated\"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Wv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t=\"Duplicate definition, rule: ->\"+e+\"<- is already defined in the grammar: ->\"+r.grammarName+\"<-\";return t}}});var Wj=w(TA=>{\"use strict\";var CIe=TA&&TA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(TA,\"__esModule\",{value:!0});TA.GastRefResolverVisitor=TA.resolveGrammar=void 0;var mIe=Yn(),qj=Gt(),EIe=$g();function IIe(r,e){var t=new Jj(r,e);return t.resolveRefs(),t.errors}TA.resolveGrammar=IIe;var Jj=function(r){CIe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,qj.forEach)((0,qj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:mIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(EIe.GAstVisitor);TA.GastRefResolverVisitor=Jj});var Dd=w(Nr=>{\"use strict\";var mc=Nr&&Nr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Nr,\"__esModule\",{value:!0});Nr.nextPossibleTokensAfter=Nr.possiblePathsFrom=Nr.NextTerminalAfterAtLeastOneSepWalker=Nr.NextTerminalAfterAtLeastOneWalker=Nr.NextTerminalAfterManySepWalker=Nr.NextTerminalAfterManyWalker=Nr.AbstractNextTerminalAfterProductionWalker=Nr.NextAfterTokenWalker=Nr.AbstractNextPossibleTokensWalker=void 0;var zj=Ay(),Ut=Gt(),yIe=qv(),kt=Cn(),Vj=function(r){mc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName=\"\",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error(\"The path does not start with the walker's top Rule!\");return this.ruleStack=(0,Ut.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Ut.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Ut.isEmpty)(this.ruleStack)?(this.nextProductionName=\"\",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(zj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Vj;var wIe=function(r){mc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName=\"\",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,yIe.first)(o),this.found=!0}},e}(Vj);Nr.NextAfterTokenWalker=wIe;var Pd=function(r){mc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(zj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=Pd;var BIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterManyWalker=BIe;var QIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterManySepWalker=QIe;var bIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterAtLeastOneWalker=bIe;var SIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Ut.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterAtLeastOneSepWalker=SIe;function Xj(r,e,t){t===void 0&&(t=[]),t=(0,Ut.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Ut.drop)(r,n+1))}function o(c){var u=Xj(s(c),e,t);return i.concat(u)}for(;t.length<e&&n<r.length;){var a=r[n];if(a instanceof kt.Alternative)return o(a.definition);if(a instanceof kt.NonTerminal)return o(a.definition);if(a instanceof kt.Option)i=o(a.definition);else if(a instanceof kt.RepetitionMandatory){var l=a.definition.concat([new kt.Repetition({definition:a.definition})]);return o(l)}else if(a instanceof kt.RepetitionMandatoryWithSeparator){var l=[new kt.Alternative({definition:a.definition}),new kt.Repetition({definition:[new kt.Terminal({terminalType:a.separator})].concat(a.definition)})];return o(l)}else if(a instanceof kt.RepetitionWithSeparator){var l=a.definition.concat([new kt.Repetition({definition:[new kt.Terminal({terminalType:a.separator})].concat(a.definition)})]);i=o(l)}else if(a instanceof kt.Repetition){var l=a.definition.concat([new kt.Repetition({definition:a.definition})]);i=o(l)}else{if(a instanceof kt.Alternation)return(0,Ut.forEach)(a.definition,function(c){(0,Ut.isEmpty)(c.definition)===!1&&(i=o(c.definition))}),i;if(a instanceof kt.Terminal)t.push(a.terminalType);else throw Error(\"non exhaustive match\")}n++}return i.push({partialPath:t,suffixDef:(0,Ut.drop)(r,n)}),i}Nr.possiblePathsFrom=Xj;function vIe(r,e,t,i){var n=\"EXIT_NONE_TERMINAL\",s=[n],o=\"EXIT_ALTERNATIVE\",a=!1,l=e.length,c=l-i-1,u=[],g=[];for(g.push({idx:-1,def:r,ruleStack:[],occurrenceStack:[]});!(0,Ut.isEmpty)(g);){var f=g.pop();if(f===o){a&&(0,Ut.last)(g).idx<=c&&g.pop();continue}var h=f.def,p=f.idx,C=f.ruleStack,y=f.occurrenceStack;if(!(0,Ut.isEmpty)(h)){var B=h[0];if(B===n){var v={idx:p,def:(0,Ut.drop)(h),ruleStack:(0,Ut.dropRight)(C),occurrenceStack:(0,Ut.dropRight)(y)};g.push(v)}else if(B instanceof kt.Terminal)if(p<l-1){var D=p+1,L=e[D];if(t(L,B.terminalType)){var v={idx:D,def:(0,Ut.drop)(h),ruleStack:C,occurrenceStack:y};g.push(v)}}else if(p===l-1)u.push({nextTokenType:B.terminalType,nextTokenOccurrence:B.idx,ruleStack:C,occurrenceStack:y}),a=!0;else throw Error(\"non exhaustive match\");else if(B instanceof kt.NonTerminal){var H=(0,Ut.cloneArr)(C);H.push(B.nonTerminalName);var j=(0,Ut.cloneArr)(y);j.push(B.idx);var v={idx:p,def:B.definition.concat(s,(0,Ut.drop)(h)),ruleStack:H,occurrenceStack:j};g.push(v)}else if(B instanceof kt.Option){var $={idx:p,def:(0,Ut.drop)(h),ruleStack:C,occurrenceStack:y};g.push($),g.push(o);var V={idx:p,def:B.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(V)}else if(B instanceof kt.RepetitionMandatory){var W=new kt.Repetition({definition:B.definition,idx:B.idx}),_=B.definition.concat([W],(0,Ut.drop)(h)),v={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(v)}else if(B instanceof kt.RepetitionMandatoryWithSeparator){var A=new kt.Terminal({terminalType:B.separator}),W=new kt.Repetition({definition:[A].concat(B.definition),idx:B.idx}),_=B.definition.concat([W],(0,Ut.drop)(h)),v={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(v)}else if(B instanceof kt.RepetitionWithSeparator){var $={idx:p,def:(0,Ut.drop)(h),ruleStack:C,occurrenceStack:y};g.push($),g.push(o);var A=new kt.Terminal({terminalType:B.separator}),Ae=new kt.Repetition({definition:[A].concat(B.definition),idx:B.idx}),_=B.definition.concat([Ae],(0,Ut.drop)(h)),V={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(V)}else if(B instanceof kt.Repetition){var $={idx:p,def:(0,Ut.drop)(h),ruleStack:C,occurrenceStack:y};g.push($),g.push(o);var Ae=new kt.Repetition({definition:B.definition,idx:B.idx}),_=B.definition.concat([Ae],(0,Ut.drop)(h)),V={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(V)}else if(B instanceof kt.Alternation)for(var ge=B.definition.length-1;ge>=0;ge--){var re=B.definition[ge],O={idx:p,def:re.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:p,def:B.definition.concat((0,Ut.drop)(h)),ruleStack:C,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(xIe(B,p,C,y));else throw Error(\"non exhaustive match\")}}return u}Nr.nextPossibleTokensAfter=vIe;function xIe(r,e,t,i){var n=(0,Ut.cloneArr)(t);n.push(r.name);var s=(0,Ut.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var kd=w(Zt=>{\"use strict\";var $j=Zt&&Zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Zt,\"__esModule\",{value:!0});Zt.areTokenCategoriesNotUsed=Zt.isStrictPrefixOfPath=Zt.containsPath=Zt.getLookaheadPathsForOptionalProd=Zt.getLookaheadPathsForOr=Zt.lookAheadSequenceFromAlternatives=Zt.buildSingleAlternativeLookaheadFunction=Zt.buildAlternativesLookAheadFunc=Zt.buildLookaheadFuncForOptionalProd=Zt.buildLookaheadFuncForOr=Zt.getProdType=Zt.PROD_TYPE=void 0;var sr=Gt(),Zj=Dd(),PIe=Ay(),hy=_g(),OA=Cn(),DIe=$g(),oi;(function(r){r[r.OPTION=0]=\"OPTION\",r[r.REPETITION=1]=\"REPETITION\",r[r.REPETITION_MANDATORY=2]=\"REPETITION_MANDATORY\",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]=\"REPETITION_MANDATORY_WITH_SEPARATOR\",r[r.REPETITION_WITH_SEPARATOR=4]=\"REPETITION_WITH_SEPARATOR\",r[r.ALTERNATION=5]=\"ALTERNATION\"})(oi=Zt.PROD_TYPE||(Zt.PROD_TYPE={}));function kIe(r){if(r instanceof OA.Option)return oi.OPTION;if(r instanceof OA.Repetition)return oi.REPETITION;if(r instanceof OA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof OA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof OA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof OA.Alternation)return oi.ALTERNATION;throw Error(\"non exhaustive match\")}Zt.getProdType=kIe;function RIe(r,e,t,i,n,s){var o=tq(r,e,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o,i,a,n)}Zt.buildLookaheadFuncForOr=RIe;function FIe(r,e,t,i,n,s){var o=rq(r,e,n,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o[0],a,i)}Zt.buildLookaheadFuncForOptionalProd=FIe;function NIe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u<n;u++){var g=r[u],f=g.length,h=c[u];if(h!==void 0&&h.call(this)===!1)continue;e:for(var p=0;p<f;p++){for(var C=g[p],y=C.length,B=0;B<y;B++){var v=this.LA(B+1);if(t(v,C[B])===!1)continue e}return u}}};if(s&&!i){var o=(0,sr.map)(r,function(l){return(0,sr.flatten)(l)}),a=(0,sr.reduce)(o,function(l,c,u){return(0,sr.forEach)(c,function(g){(0,sr.has)(l,g.tokenTypeIdx)||(l[g.tokenTypeIdx]=u),(0,sr.forEach)(g.categoryMatches,function(f){(0,sr.has)(l,f)||(l[f]=u)})}),l},[]);return function(){var l=this.LA(1);return a[l.tokenTypeIdx]}}else return function(){for(var l=0;l<n;l++){var c=r[l],u=c.length;e:for(var g=0;g<u;g++){for(var f=c[g],h=f.length,p=0;p<h;p++){var C=this.LA(p+1);if(t(C,f[p])===!1)continue e}return l}}}}Zt.buildAlternativesLookAheadFunc=NIe;function LIe(r,e,t){var i=(0,sr.every)(r,function(c){return c.length===1}),n=r.length;if(i&&!t){var s=(0,sr.flatten)(r);if(s.length===1&&(0,sr.isEmpty)(s[0].categoryMatches)){var o=s[0],a=o.tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===a}}else{var l=(0,sr.reduce)(s,function(c,u,g){return c[u.tokenTypeIdx]=!0,(0,sr.forEach)(u.categoryMatches,function(f){c[f]=!0}),c},[]);return function(){var c=this.LA(1);return l[c.tokenTypeIdx]===!0}}}else return function(){e:for(var c=0;c<n;c++){for(var u=r[c],g=u.length,f=0;f<g;f++){var h=this.LA(f+1);if(e(h,u[f])===!1)continue e}return!0}return!1}}Zt.buildSingleAlternativeLookaheadFunction=LIe;var TIe=function(r){$j(e,r);function e(t,i,n){var s=r.call(this)||this;return s.topProd=t,s.targetOccurrence=i,s.targetProdType=n,s}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.restDef},e.prototype.checkIsTarget=function(t,i,n,s){return t.idx===this.targetOccurrence&&this.targetProdType===i?(this.restDef=n.concat(s),!0):!1},e.prototype.walkOption=function(t,i,n){this.checkIsTarget(t,oi.OPTION,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkAtLeastOne=function(t,i,n){this.checkIsTarget(t,oi.REPETITION_MANDATORY,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkAtLeastOneSep=function(t,i,n){this.checkIsTarget(t,oi.REPETITION_MANDATORY_WITH_SEPARATOR,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkMany=function(t,i,n){this.checkIsTarget(t,oi.REPETITION,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkManySep=function(t,i,n){this.checkIsTarget(t,oi.REPETITION_WITH_SEPARATOR,i,n)||r.prototype.walkOption.call(this,t,i,n)},e}(PIe.RestWalker),eq=function(r){$j(e,r);function e(t,i,n){var s=r.call(this)||this;return s.targetOccurrence=t,s.targetProdType=i,s.targetRef=n,s.result=[],s}return e.prototype.checkIsTarget=function(t,i){t.idx===this.targetOccurrence&&this.targetProdType===i&&(this.targetRef===void 0||t===this.targetRef)&&(this.result=t.definition)},e.prototype.visitOption=function(t){this.checkIsTarget(t,oi.OPTION)},e.prototype.visitRepetition=function(t){this.checkIsTarget(t,oi.REPETITION)},e.prototype.visitRepetitionMandatory=function(t){this.checkIsTarget(t,oi.REPETITION_MANDATORY)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.checkIsTarget(t,oi.REPETITION_MANDATORY_WITH_SEPARATOR)},e.prototype.visitRepetitionWithSeparator=function(t){this.checkIsTarget(t,oi.REPETITION_WITH_SEPARATOR)},e.prototype.visitAlternation=function(t){this.checkIsTarget(t,oi.ALTERNATION)},e}(DIe.GAstVisitor);function _j(r){for(var e=new Array(r),t=0;t<r;t++)e[t]=[];return e}function zv(r){for(var e=[\"\"],t=0;t<r.length;t++){for(var i=r[t],n=[],s=0;s<e.length;s++){var o=e[s];n.push(o+\"_\"+i.tokenTypeIdx);for(var a=0;a<i.categoryMatches.length;a++){var l=\"_\"+i.categoryMatches[a];n.push(o+l)}}e=n}return e}function OIe(r,e,t){for(var i=0;i<r.length;i++)if(i!==t)for(var n=r[i],s=0;s<e.length;s++){var o=e[s];if(n[o]===!0)return!1}return!0}function Vv(r,e){for(var t=(0,sr.map)(r,function(u){return(0,Zj.possiblePathsFrom)([u],1)}),i=_j(t.length),n=(0,sr.map)(t,function(u){var g={};return(0,sr.forEach)(u,function(f){var h=zv(f.partialPath);(0,sr.forEach)(h,function(p){g[p]=!0})}),g}),s=t,o=1;o<=e;o++){var a=s;s=_j(a.length);for(var l=function(u){for(var g=a[u],f=0;f<g.length;f++){var h=g[f].partialPath,p=g[f].suffixDef,C=zv(h),y=OIe(n,C,u);if(y||(0,sr.isEmpty)(p)||h.length===e){var B=i[u];if(iq(B,h)===!1){B.push(h);for(var v=0;v<C.length;v++){var D=C[v];n[u][D]=!0}}}else{var L=(0,Zj.possiblePathsFrom)(p,o+1,h);s[u]=s[u].concat(L),(0,sr.forEach)(L,function(H){var j=zv(H.partialPath);(0,sr.forEach)(j,function($){n[u][$]=!0})})}}},c=0;c<a.length;c++)l(c)}return i}Zt.lookAheadSequenceFromAlternatives=Vv;function tq(r,e,t,i){var n=new eq(r,oi.ALTERNATION,i);return e.accept(n),Vv(n.result,t)}Zt.getLookaheadPathsForOr=tq;function rq(r,e,t,i){var n=new eq(r,t);e.accept(n);var s=n.result,o=new TIe(e,r,t),a=o.startWalking(),l=new OA.Alternative({definition:s}),c=new OA.Alternative({definition:a});return Vv([l,c],i)}Zt.getLookaheadPathsForOptionalProd=rq;function iq(r,e){e:for(var t=0;t<r.length;t++){var i=r[t];if(i.length===e.length){for(var n=0;n<i.length;n++){var s=e[n],o=i[n],a=s===o||o.categoryMatchesMap[s.tokenTypeIdx]!==void 0;if(a===!1)continue e}return!0}}return!1}Zt.containsPath=iq;function MIe(r,e){return r.length<e.length&&(0,sr.every)(r,function(t,i){var n=e[i];return t===n||n.categoryMatchesMap[t.tokenTypeIdx]})}Zt.isStrictPrefixOfPath=MIe;function Xv(r){return(0,sr.every)(r,function(e){return(0,sr.every)(e,function(t){return(0,sr.every)(t,function(i){return(0,sr.isEmpty)(i.categoryMatches)})})})}Zt.areTokenCategoriesNotUsed=Xv});var rx=w(Vt=>{\"use strict\";var Zv=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,\"__esModule\",{value:!0});Vt.checkPrefixAlternativesAmbiguities=Vt.validateSomeNonEmptyLookaheadPath=Vt.validateTooManyAlts=Vt.RepetionCollector=Vt.validateAmbiguousAlternationAlternatives=Vt.validateEmptyOrAlternative=Vt.getFirstNoneTerminal=Vt.validateNoLeftRecursion=Vt.validateRuleIsOverridden=Vt.validateRuleDoesNotAlreadyExist=Vt.OccurrenceValidationCollector=Vt.identifyProductionForDuplicates=Vt.validateGrammar=void 0;var er=Gt(),br=Gt(),No=Yn(),_v=vd(),tf=kd(),UIe=Dd(),to=Cn(),$v=$g();function KIe(r,e,t,i,n){var s=er.map(r,function(h){return HIe(h,i)}),o=er.map(r,function(h){return ex(h,h,i)}),a=[],l=[],c=[];(0,br.every)(o,br.isEmpty)&&(a=(0,br.map)(r,function(h){return Aq(h,i)}),l=(0,br.map)(r,function(h){return lq(h,e,i)}),c=gq(r,e,i));var u=jIe(r,t,i),g=(0,br.map)(r,function(h){return uq(h,i)}),f=(0,br.map)(r,function(h){return aq(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}Vt.validateGrammar=KIe;function HIe(r,e){var t=new oq;r.accept(t);var i=t.allProductions,n=er.groupBy(i,nq),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,_v.getProductionDslName)(l),g={message:c,type:No.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=sq(l);return f&&(g.parameter=f),g});return o}function nq(r){return(0,_v.getProductionDslName)(r)+\"_#_\"+r.idx+\"_#_\"+sq(r)}Vt.identifyProductionForDuplicates=nq;function sq(r){return r instanceof to.Terminal?r.terminalType.name:r instanceof to.NonTerminal?r.nonTerminalName:\"\"}var oq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.OccurrenceValidationCollector=oq;function aq(r,e,t,i){var n=[],s=(0,br.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:No.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Vt.validateRuleDoesNotAlreadyExist=aq;function GIe(r,e,t){var i=[],n;return er.contains(e,r)||(n=\"Invalid rule override, rule: ->\"+r+\"<- cannot be overridden in the grammar: ->\"+t+\"<-as it is not defined in any of the super grammars \",i.push({message:n,type:No.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Vt.validateRuleIsOverridden=GIe;function ex(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Rd(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:No.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),ex(r,u,t,g)});return n.concat(er.flatten(c))}Vt.validateNoLeftRecursion=ex;function Rd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof to.NonTerminal)e.push(t.referencedRule);else if(t instanceof to.Alternative||t instanceof to.Option||t instanceof to.RepetitionMandatory||t instanceof to.RepetitionMandatoryWithSeparator||t instanceof to.RepetitionWithSeparator||t instanceof to.Repetition)e=e.concat(Rd(t.definition));else if(t instanceof to.Alternation)e=er.flatten(er.map(t.definition,function(o){return Rd(o.definition)}));else if(!(t instanceof to.Terminal))throw Error(\"non exhaustive match\");var i=(0,_v.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(Rd(s))}else return e}Vt.getFirstNoneTerminal=Rd;var tx=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}($v.GAstVisitor);function Aq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,UIe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:No.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}Vt.validateEmptyOrAlternative=Aq;function lq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,br.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,tf.getLookaheadPathsForOr)(l,r,c,a),g=YIe(u,a,r,t),f=fq(u,a,r,t);return o.concat(g,f)},[]);return s}Vt.validateAmbiguousAlternationAlternatives=lq;var cq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.RepetionCollector=cq;function uq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:No.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Vt.validateTooManyAlts=uq;function gq(r,e,t){var i=[];return(0,br.forEach)(r,function(n){var s=new cq;n.accept(s);var o=s.allProductions;(0,br.forEach)(o,function(a){var l=(0,tf.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,tf.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,br.isEmpty)((0,br.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:No.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Vt.validateSomeNonEmptyLookaheadPath=gq;function YIe(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,br.forEach)(l,function(u){var g=[c];(0,br.forEach)(r,function(f,h){c!==h&&(0,tf.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,tf.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,br.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:No.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function fq(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(o,a,l){var c=(0,br.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,br.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,br.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx<l&&(0,tf.isStrictPrefixOfPath)(f.path,c)}),g=(0,br.map)(u,function(f){var h=[f.idx+1,l+1],p=e.idx===0?\"\":e.idx,C=i.buildAlternationPrefixAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:h,prefixPath:f.path});return{message:C,type:No.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,ruleName:t.name,occurrence:p,alternatives:h}});n=n.concat(g)}}),n}Vt.checkPrefixAlternativesAmbiguities=fq;function jIe(r,e,t){var i=[],n=(0,br.map)(e,function(s){return s.name});return(0,br.forEach)(r,function(s){var o=s.name;if((0,br.contains)(n,o)){var a=t.buildNamespaceConflictError(s);i.push({message:a,type:No.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:o})}}),i}});var pq=w(rf=>{\"use strict\";Object.defineProperty(rf,\"__esModule\",{value:!0});rf.validateGrammar=rf.resolveGrammar=void 0;var ix=Gt(),qIe=Wj(),JIe=rx(),hq=xd();function WIe(r){r=(0,ix.defaults)(r,{errMsgProvider:hq.defaultGrammarResolverErrorProvider});var e={};return(0,ix.forEach)(r.rules,function(t){e[t.name]=t}),(0,qIe.resolveGrammar)(e,r.errMsgProvider)}rf.resolveGrammar=WIe;function zIe(r){return r=(0,ix.defaults)(r,{errMsgProvider:hq.defaultGrammarValidatorErrorProvider}),(0,JIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}rf.validateGrammar=zIe});var nf=w(En=>{\"use strict\";var Fd=En&&En.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(En,\"__esModule\",{value:!0});En.EarlyExitException=En.NotAllInputParsedException=En.NoViableAltException=En.MismatchedTokenException=En.isRecognitionException=void 0;var VIe=Gt(),dq=\"MismatchedTokenException\",Cq=\"NoViableAltException\",mq=\"EarlyExitException\",Eq=\"NotAllInputParsedException\",Iq=[dq,Cq,mq,Eq];Object.freeze(Iq);function XIe(r){return(0,VIe.contains)(Iq,r.name)}En.isRecognitionException=XIe;var py=function(r){Fd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),ZIe=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=dq,s}return e}(py);En.MismatchedTokenException=ZIe;var _Ie=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Cq,s}return e}(py);En.NoViableAltException=_Ie;var $Ie=function(r){Fd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=Eq,n}return e}(py);En.NotAllInputParsedException=$Ie;var eye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=mq,s}return e}(py);En.EarlyExitException=eye});var sx=w(Ui=>{\"use strict\";Object.defineProperty(Ui,\"__esModule\",{value:!0});Ui.attemptInRepetitionRecovery=Ui.Recoverable=Ui.InRuleRecoveryException=Ui.IN_RULE_RECOVERY_EXCEPTION=Ui.EOF_FOLLOW_KEY=void 0;var dy=LA(),hs=Gt(),tye=nf(),rye=Jv(),iye=Yn();Ui.EOF_FOLLOW_KEY={};Ui.IN_RULE_RECOVERY_EXCEPTION=\"InRuleRecoveryException\";function nx(r){this.name=Ui.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ui.InRuleRecoveryException=nx;nx.prototype=Error.prototype;var nye=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,hs.has)(e,\"recoveryEnabled\")?e.recoveryEnabled:iye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=yq)},r.prototype.getTokenToInsert=function(e){var t=(0,dy.createTokenInstance)(e,\"\",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new tye.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,hs.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new nx(\"sad sad panda\")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,hs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,hs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,hs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,hs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ui.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,hs.map)(t,function(n,s){return s===0?Ui.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,hs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,hs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ui.EOF_FOLLOW_KEY)return[dy.EOF];var t=e.ruleName+e.idxInCallingRule+rye.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,dy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,hs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,hs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,hs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ui.Recoverable=nye;function yq(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=dy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Ui.attemptInRepetitionRecovery=yq});var Cy=w(Jt=>{\"use strict\";Object.defineProperty(Jt,\"__esModule\",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.OPTION_IDX=2<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.MANY_IDX=3<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.AT_LEAST_ONE_IDX=4<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.MANY_SEP_IDX=5<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.AT_LEAST_ONE_SEP_IDX=6<<Jt.BITS_FOR_OCCURRENCE_IDX;function sye(r,e,t){return t|e|r}Jt.getKeyForAutomaticLookahead=sye;var Bet=32-Jt.BITS_FOR_ALT_IDX});var Bq=w(my=>{\"use strict\";Object.defineProperty(my,\"__esModule\",{value:!0});my.LooksAhead=void 0;var Da=kd(),ro=Gt(),wq=Yn(),ka=Cy(),Ec=vd(),oye=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,ro.has)(e,\"dynamicTokensEnabled\")?e.dynamicTokensEnabled:wq.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,ro.has)(e,\"maxLookahead\")?e.maxLookahead:wq.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,ro.isES2015MapSupported)()?new Map:[],(0,ro.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,ro.forEach)(e,function(i){t.TRACE_INIT(i.name+\" Rule Lookahead\",function(){var n=(0,Ec.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,ro.forEach)(s,function(g){var f=g.idx===0?\"\":g.idx;t.TRACE_INIT(\"\"+(0,Ec.getProductionDslName)(g)+f,function(){var h=(0,Da.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,ka.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],ka.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,ro.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,ka.MANY_IDX,Da.PROD_TYPE.REPETITION,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,ka.OPTION_IDX,Da.PROD_TYPE.OPTION,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,ka.AT_LEAST_ONE_IDX,Da.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,ka.AT_LEAST_ONE_SEP_IDX,Da.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,ka.MANY_SEP_IDX,Da.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Ec.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(\"\"+o+(t===0?\"\":t),function(){var l=(0,Da.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,ka.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Da.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Da.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,ka.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();my.LooksAhead=oye});var Qq=w(Lo=>{\"use strict\";Object.defineProperty(Lo,\"__esModule\",{value:!0});Lo.addNoneTerminalToCst=Lo.addTerminalToCst=Lo.setNodeLocationFull=Lo.setNodeLocationOnlyOffset=void 0;function aye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset<e.endOffset&&(r.endOffset=e.endOffset)}Lo.setNodeLocationOnlyOffset=aye;function Aye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.startColumn=e.startColumn,r.startLine=e.startLine,r.endOffset=e.endOffset,r.endColumn=e.endColumn,r.endLine=e.endLine):r.endOffset<e.endOffset&&(r.endOffset=e.endOffset,r.endColumn=e.endColumn,r.endLine=e.endLine)}Lo.setNodeLocationFull=Aye;function lye(r,e,t){r.children[t]===void 0?r.children[t]=[e]:r.children[t].push(e)}Lo.addTerminalToCst=lye;function cye(r,e,t){r.children[e]===void 0?r.children[e]=[t]:r.children[e].push(t)}Lo.addNoneTerminalToCst=cye});var ox=w(MA=>{\"use strict\";Object.defineProperty(MA,\"__esModule\",{value:!0});MA.defineNameProp=MA.functionName=MA.classNameFromInstance=void 0;var uye=Gt();function gye(r){return Sq(r.constructor)}MA.classNameFromInstance=gye;var bq=\"name\";function Sq(r){var e=r.name;return e||\"anonymous\"}MA.functionName=Sq;function fye(r,e){var t=Object.getOwnPropertyDescriptor(r,bq);return(0,uye.isUndefined)(t)||t.configurable?(Object.defineProperty(r,bq,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}MA.defineNameProp=fye});var kq=w(Si=>{\"use strict\";Object.defineProperty(Si,\"__esModule\",{value:!0});Si.validateRedundantMethods=Si.validateMissingCstMethods=Si.validateVisitor=Si.CstVisitorDefinitionError=Si.createBaseVisitorConstructorWithDefaults=Si.createBaseSemanticVisitorConstructor=Si.defaultVisit=void 0;var ps=Gt(),Nd=ox();function vq(r,e){for(var t=(0,ps.keys)(r),i=t.length,n=0;n<i;n++)for(var s=t[n],o=r[s],a=o.length,l=0;l<a;l++){var c=o[l];c.tokenTypeIdx===void 0&&this[c.name](c.children,e)}}Si.defaultVisit=vq;function hye(r,e){var t=function(){};(0,Nd.defineNameProp)(t,r+\"BaseSemantics\");var i={visit:function(n,s){if((0,ps.isArray)(n)&&(n=n[0]),!(0,ps.isUndefined)(n))return this[n.name](n.children,s)},validateVisitor:function(){var n=xq(this,e);if(!(0,ps.isEmpty)(n)){var s=(0,ps.map)(n,function(o){return o.msg});throw Error(\"Errors Detected in CST Visitor <\"+(0,Nd.functionName)(this.constructor)+`>:\n\t`+(\"\"+s.join(`\n\n`).replace(/\\n/g,`\n\t`)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Si.createBaseSemanticVisitorConstructor=hye;function pye(r,e,t){var i=function(){};(0,Nd.defineNameProp)(i,r+\"BaseSemanticsWithDefaults\");var n=Object.create(t.prototype);return(0,ps.forEach)(e,function(s){n[s]=vq}),i.prototype=n,i.prototype.constructor=i,i}Si.createBaseVisitorConstructorWithDefaults=pye;var ax;(function(r){r[r.REDUNDANT_METHOD=0]=\"REDUNDANT_METHOD\",r[r.MISSING_METHOD=1]=\"MISSING_METHOD\"})(ax=Si.CstVisitorDefinitionError||(Si.CstVisitorDefinitionError={}));function xq(r,e){var t=Pq(r,e),i=Dq(r,e);return t.concat(i)}Si.validateVisitor=xq;function Pq(r,e){var t=(0,ps.map)(e,function(i){if(!(0,ps.isFunction)(r[i]))return{msg:\"Missing visitor method: <\"+i+\"> on \"+(0,Nd.functionName)(r.constructor)+\" CST Visitor.\",type:ax.MISSING_METHOD,methodName:i}});return(0,ps.compact)(t)}Si.validateMissingCstMethods=Pq;var dye=[\"constructor\",\"visit\",\"validateVisitor\"];function Dq(r,e){var t=[];for(var i in r)(0,ps.isFunction)(r[i])&&!(0,ps.contains)(dye,i)&&!(0,ps.contains)(e,i)&&t.push({msg:\"Redundant visitor method: <\"+i+\"> on \"+(0,Nd.functionName)(r.constructor)+` CST Visitor\nThere is no Grammar Rule corresponding to this method's name.\n`,type:ax.REDUNDANT_METHOD,methodName:i});return t}Si.validateRedundantMethods=Dq});var Fq=w(Ey=>{\"use strict\";Object.defineProperty(Ey,\"__esModule\",{value:!0});Ey.TreeBuilder=void 0;var sf=Qq(),_r=Gt(),Rq=kq(),Cye=Yn(),mye=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,_r.has)(e,\"nodeLocationTracking\")?e.nodeLocationTracking:Cye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=_r.NOOP,this.cstFinallyStateUpdate=_r.NOOP,this.cstPostTerminal=_r.NOOP,this.cstPostNonTerminal=_r.NOOP,this.cstPostRule=_r.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationFull,this.setNodeLocationFromNode=sf.setNodeLocationFull,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=sf.setNodeLocationOnlyOffset,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=_r.NOOP;else throw Error('Invalid <nodeLocationTracking> config option: \"'+e.nodeLocationTracking+'\"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,_r.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Rq.createBaseSemanticVisitorConstructor)(this.className,(0,_r.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,_r.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Rq.createBaseVisitorConstructorWithDefaults)(this.className,(0,_r.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();Ey.TreeBuilder=mye});var Lq=w(Iy=>{\"use strict\";Object.defineProperty(Iy,\"__esModule\",{value:!0});Iy.LexerAdapter=void 0;var Nq=Yn(),Eye=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,\"input\",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error(\"Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.\");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Nq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?Nq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();Iy.LexerAdapter=Eye});var Oq=w(yy=>{\"use strict\";Object.defineProperty(yy,\"__esModule\",{value:!0});yy.RecognizerApi=void 0;var Tq=Gt(),Iye=nf(),Ax=Yn(),yye=xd(),wye=rx(),Bye=Cn(),Qye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG),(0,Tq.contains)(this.definedRulesNames,e)){var n=yye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Ax.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,wye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,Iye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,Bye.serializeGrammar)((0,Tq.values)(this.gastProductionsCache))},r}();yy.RecognizerApi=Qye});var Hq=w(By=>{\"use strict\";Object.defineProperty(By,\"__esModule\",{value:!0});By.RecognizerEngine=void 0;var Pr=Gt(),jn=Cy(),wy=nf(),Mq=kd(),of=Dd(),Uq=Yn(),bye=sx(),Kq=LA(),Ld=_g(),Sye=ox(),vye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,Sye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Ld.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Pr.has)(t,\"serializedGrammar\"))throw Error(`The Parser's configuration can no longer contain a <serializedGrammar> property.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\n\tFor Further details.`);if((0,Pr.isArray)(e)){if((0,Pr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty.\n\tNote that the first argument for the parser constructor\n\tis no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset==\"number\")throw Error(`The Parser constructor no longer accepts a token vector as the first argument.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\n\tFor Further details.`)}if((0,Pr.isArray)(e))this.tokensMap=(0,Pr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Pr.has)(e,\"modes\")&&(0,Pr.every)((0,Pr.flatten)((0,Pr.values)(e.modes)),Ld.isTokenType)){var i=(0,Pr.flatten)((0,Pr.values)(e.modes)),n=(0,Pr.uniq)(i);this.tokensMap=(0,Pr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Pr.isObject)(e))this.tokensMap=(0,Pr.cloneObj)(e);else throw new Error(\"<tokensDictionary> argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition\");this.tokensMap.EOF=Kq.EOF;var s=(0,Pr.every)((0,Pr.values)(e),function(o){return(0,Pr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Ld.tokenStructuredMatcherNoCategories:Ld.tokenStructuredMatcher,(0,Ld.augmentTokenTypes)((0,Pr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error(\"Grammar rule <\"+e+`> may not be defined after the 'performSelfAnalysis' method has been called'\nMake sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Pr.has)(i,\"resyncEnabled\")?i.resyncEnabled:Uq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,\"recoveryValueFunc\")?i.recoveryValueFunc:Uq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<<jn.BITS_FOR_METHOD_TYPE+jn.BITS_FOR_OCCURRENCE_IDX;this.ruleShortNameIdx++,this.shortRuleNameToFull[o]=e,this.fullRuleNameToShort[e]=o;function a(u){try{if(this.outputCst===!0){t.apply(this,u);var g=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(g),g}else return t.apply(this,u)}catch(f){return this.invokeRuleCatch(f,n,s)}finally{this.ruleFinallyStateUpdate()}}var l=function(u,g){return u===void 0&&(u=0),this.ruleInvocationStateUpdate(o,e,u),a.call(this,g)},c=\"ruleName\";return l[c]=e,l.originalGrammarAction=t,l},r.prototype.invokeRuleCatch=function(e,t,i){var n=this.RULE_STACK.length===1,s=t&&!this.isBackTracking()&&this.recoveryEnabled;if((0,wy.isRecognitionException)(e)){var o=e;if(s){var a=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(a))if(o.resyncedTokens=this.reSyncTo(a),this.outputCst){var l=this.CST_STACK[this.CST_STACK.length-1];return l.recoveredNode=!0,l}else return i();else{if(this.outputCst){var l=this.CST_STACK[this.CST_STACK.length-1];l.recoveredNode=!0,o.partialCstResult=l}throw o}}else{if(n)return this.moveToTerminatedState(),i();throw o}}else throw e},r.prototype.optionInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(jn.OPTION_IDX,t);return this.optionInternalLogic(e,t,i)},r.prototype.optionInternalLogic=function(e,t,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(e.DEF!==void 0){if(o=e.DEF,a=e.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=e;if(s.call(this)===!0)return o.call(this)},r.prototype.atLeastOneInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(jn.AT_LEAST_ONE_IDX,e);return this.atLeastOneInternalLogic(e,t,i)},r.prototype.atLeastOneInternalLogic=function(e,t,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(t.DEF!==void 0){if(o=t.DEF,a=t.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=t;if(s.call(this)===!0)for(var c=this.doSingleRepetition(o);s.call(this)===!0&&c===!0;)c=this.doSingleRepetition(o);else throw this.raiseEarlyExitException(e,Mq.PROD_TYPE.REPETITION_MANDATORY,t.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,t],s,jn.AT_LEAST_ONE_IDX,e,of.NextTerminalAfterAtLeastOneWalker)},r.prototype.atLeastOneSepFirstInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(jn.AT_LEAST_ONE_SEP_IDX,e);this.atLeastOneSepFirstInternalLogic(e,t,i)},r.prototype.atLeastOneSepFirstInternalLogic=function(e,t,i){var n=this,s=t.DEF,o=t.SEP,a=this.getLaFuncFromCache(i);if(a.call(this)===!0){s.call(this);for(var l=function(){return n.tokenMatcher(n.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),s.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,l,s,of.NextTerminalAfterAtLeastOneSepWalker],l,jn.AT_LEAST_ONE_SEP_IDX,e,of.NextTerminalAfterAtLeastOneSepWalker)}else throw this.raiseEarlyExitException(e,Mq.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,t.ERR_MSG)},r.prototype.manyInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(jn.MANY_IDX,e);return this.manyInternalLogic(e,t,i)},r.prototype.manyInternalLogic=function(e,t,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(t.DEF!==void 0){if(o=t.DEF,a=t.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=t;for(var c=!0;s.call(this)===!0&&c===!0;)c=this.doSingleRepetition(o);this.attemptInRepetitionRecovery(this.manyInternal,[e,t],s,jn.MANY_IDX,e,of.NextTerminalAfterManyWalker,c)},r.prototype.manySepFirstInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(jn.MANY_SEP_IDX,e);this.manySepFirstInternalLogic(e,t,i)},r.prototype.manySepFirstInternalLogic=function(e,t,i){var n=this,s=t.DEF,o=t.SEP,a=this.getLaFuncFromCache(i);if(a.call(this)===!0){s.call(this);for(var l=function(){return n.tokenMatcher(n.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),s.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,l,s,of.NextTerminalAfterManySepWalker],l,jn.MANY_SEP_IDX,e,of.NextTerminalAfterManySepWalker)}},r.prototype.repetitionSepSecondInternal=function(e,t,i,n,s){for(;i();)this.CONSUME(t),n.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,t,i,n,s],i,jn.AT_LEAST_ONE_SEP_IDX,e,s)},r.prototype.doSingleRepetition=function(e){var t=this.getLexerPosition();e.call(this);var i=this.getLexerPosition();return i>t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(jn.OR_IDX,t),n=(0,Pr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new wy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,wy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new wy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name===\"MismatchedTokenException\"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===bye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Pr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Kq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();By.RecognizerEngine=vye});var Yq=w(Qy=>{\"use strict\";Object.defineProperty(Qy,\"__esModule\",{value:!0});Qy.ErrorHandler=void 0;var lx=nf(),cx=Gt(),Gq=kd(),xye=Yn(),Pye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,cx.has)(e,\"errorMessageProvider\")?e.errorMessageProvider:xye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,lx.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,cx.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error(\"Trying to save an Error which is not a RecognitionException\")},Object.defineProperty(r.prototype,\"errors\",{get:function(){return(0,cx.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,Gq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new lx.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,Gq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new lx.NoViableAltException(c,this.LA(1),l))},r}();Qy.ErrorHandler=Pye});var Jq=w(by=>{\"use strict\";Object.defineProperty(by,\"__esModule\",{value:!0});by.ContentAssist=void 0;var jq=Dd(),qq=Gt(),Dye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,qq.isUndefined)(i))throw Error(\"Rule ->\"+e+\"<- does not exist in this grammar.\");return(0,jq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,qq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new jq.NextAfterTokenWalker(n,e).startWalking();return s},r}();by.ContentAssist=Dye});var eJ=w(xy=>{\"use strict\";Object.defineProperty(xy,\"__esModule\",{value:!0});xy.GastRecorder=void 0;var In=Gt(),To=Cn(),kye=Bd(),Xq=_g(),Zq=LA(),Rye=Yn(),Fye=Cy(),vy={description:\"This Object indicates the Parser is during Recording Phase\"};Object.freeze(vy);var Wq=!0,zq=Math.pow(2,Fye.BITS_FOR_OCCURRENCE_IDX)-1,_q=(0,Zq.createToken)({name:\"RECORDING_PHASE_TOKEN\",pattern:kye.Lexer.NA});(0,Xq.augmentTokenTypes)([_q]);var $q=(0,Zq.createTokenInstance)(_q,`This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze($q);var Nye={name:`This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Lye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT(\"Enable Recording\",function(){for(var t=function(n){var s=n>0?n:\"\";e[\"CONSUME\"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e[\"SUBRULE\"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e[\"OPTION\"+s]=function(o){return this.optionInternalRecord(o,n)},e[\"OR\"+s]=function(o){return this.orInternalRecord(o,n)},e[\"MANY\"+s]=function(o){this.manyInternalRecord(n,o)},e[\"MANY_SEP\"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e[\"AT_LEAST_ONE\"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e[\"AT_LEAST_ONE_SEP\"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT(\"Deleting Recording methods\",function(){for(var t=0;t<10;t++){var i=t>0?t:\"\";delete e[\"CONSUME\"+i],delete e[\"SUBRULE\"+i],delete e[\"OPTION\"+i],delete e[\"OR\"+i],delete e[\"MANY\"+i],delete e[\"MANY_SEP\"+i],delete e[\"AT_LEAST_ONE\"+i],delete e[\"AT_LEAST_ONE_SEP\"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Rye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new To.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+`\n\t This error was thrown during the \"grammar recording phase\" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Td.call(this,To.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Td.call(this,To.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Td.call(this,To.RepetitionMandatoryWithSeparator,t,e,Wq)},r.prototype.manyInternalRecord=function(e,t){Td.call(this,To.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Td.call(this,To.RepetitionWithSeparator,t,e,Wq)},r.prototype.orInternalRecord=function(e,t){return Tye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(Sy(t),!e||(0,In.has)(e,\"ruleName\")===!1){var n=new Error(\"<SUBRULE\"+Vq(t)+\"> argument is invalid\"+(\" expecting a Parser method reference but got: <\"+JSON.stringify(e)+\">\")+(`\n inside top level rule: <`+this.recordingProdStack[0].name+\">\"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,In.peek)(this.recordingProdStack),o=e.ruleName,a=new To.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Nye:vy},r.prototype.consumeInternalRecord=function(e,t,i){if(Sy(t),!(0,Xq.hasShortKeyProperty)(e)){var n=new Error(\"<CONSUME\"+Vq(t)+\"> argument is invalid\"+(\" expecting a TokenType reference but got: <\"+JSON.stringify(e)+\">\")+(`\n inside top level rule: <`+this.recordingProdStack[0].name+\">\"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,In.peek)(this.recordingProdStack),o=new To.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),$q},r}();xy.GastRecorder=Lye;function Td(r,e,t,i){i===void 0&&(i=!1),Sy(t);var n=(0,In.peek)(this.recordingProdStack),s=(0,In.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,In.has)(e,\"MAX_LOOKAHEAD\")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),vy}function Tye(r,e){var t=this;Sy(e);var i=(0,In.peek)(this.recordingProdStack),n=(0,In.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new To.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,In.has)(r,\"MAX_LOOKAHEAD\")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,In.some)(s,function(l){return(0,In.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,In.forEach)(s,function(l){var c=new To.Alternative({definition:[]});o.definition.push(c),(0,In.has)(l,\"IGNORE_AMBIGUITIES\")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,In.has)(l,\"GATE\")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),vy}function Vq(r){return r===0?\"\":\"\"+r}function Sy(r){if(r<0||r>zq){var e=new Error(\"Invalid DSL Method idx value: <\"+r+`>\n\t`+(\"Idx value must be a none negative value smaller than \"+(zq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var rJ=w(Py=>{\"use strict\";Object.defineProperty(Py,\"__esModule\",{value:!0});Py.PerformanceTracer=void 0;var tJ=Gt(),Oye=Yn(),Mye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,tJ.has)(e,\"traceInitPerf\")){var t=e.traceInitPerf,i=typeof t==\"number\";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Oye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(\"\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(i+\"--> <\"+e+\">\");var n=(0,tJ.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&a(i+\"<-- <\"+e+\"> time: \"+s+\"ms\"),this.traceInitIndent--,o}else return t()},r}();Py.PerformanceTracer=Mye});var iJ=w(Dy=>{\"use strict\";Object.defineProperty(Dy,\"__esModule\",{value:!0});Dy.applyMixins=void 0;function Uye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!==\"constructor\"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Dy.applyMixins=Uye});var Yn=w(dr=>{\"use strict\";var oJ=dr&&dr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dr,\"__esModule\",{value:!0});dr.EmbeddedActionsParser=dr.CstParser=dr.Parser=dr.EMPTY_ALT=dr.ParserDefinitionErrorType=dr.DEFAULT_RULE_CONFIG=dr.DEFAULT_PARSER_CONFIG=dr.END_OF_FILE=void 0;var $i=Gt(),Kye=Yj(),nJ=LA(),aJ=xd(),sJ=pq(),Hye=sx(),Gye=Bq(),Yye=Fq(),jye=Lq(),qye=Oq(),Jye=Hq(),Wye=Yq(),zye=Jq(),Vye=eJ(),Xye=rJ(),Zye=iJ();dr.END_OF_FILE=(0,nJ.createTokenInstance)(nJ.EOF,\"\",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(dr.END_OF_FILE);dr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:aJ.defaultParserErrorProvider,nodeLocationTracking:\"none\",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var _ye;(function(r){r[r.INVALID_RULE_NAME=0]=\"INVALID_RULE_NAME\",r[r.DUPLICATE_RULE_NAME=1]=\"DUPLICATE_RULE_NAME\",r[r.INVALID_RULE_OVERRIDE=2]=\"INVALID_RULE_OVERRIDE\",r[r.DUPLICATE_PRODUCTIONS=3]=\"DUPLICATE_PRODUCTIONS\",r[r.UNRESOLVED_SUBRULE_REF=4]=\"UNRESOLVED_SUBRULE_REF\",r[r.LEFT_RECURSION=5]=\"LEFT_RECURSION\",r[r.NONE_LAST_EMPTY_ALT=6]=\"NONE_LAST_EMPTY_ALT\",r[r.AMBIGUOUS_ALTS=7]=\"AMBIGUOUS_ALTS\",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]=\"CONFLICT_TOKENS_RULES_NAMESPACE\",r[r.INVALID_TOKEN_NAME=9]=\"INVALID_TOKEN_NAME\",r[r.NO_NON_EMPTY_LOOKAHEAD=10]=\"NO_NON_EMPTY_LOOKAHEAD\",r[r.AMBIGUOUS_PREFIX_ALTS=11]=\"AMBIGUOUS_PREFIX_ALTS\",r[r.TOO_MANY_ALTS=12]=\"TOO_MANY_ALTS\"})(_ye=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function $ye(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=$ye;var ky=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,$i.has)(t,\"ignoredIssues\"))throw new Error(`The <ignoredIssues> IParserConfig property has been deprecated.\n\tPlease use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\n\tSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\n\tFor further details.`);this.skipValidations=(0,$i.has)(t,\"skipValidations\")?t.skipValidations:dr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\t\\nUse the **instance** method with the same name instead.\")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT(\"performSelfAnalysis\",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT(\"toFastProps\",function(){(0,$i.toFastProperties)(e)}),e.TRACE_INIT(\"Grammar Recording\",function(){try{e.enableRecording(),(0,$i.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+\" Rule\",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT(\"Grammar Resolving\",function(){n=(0,sJ.resolveGrammar)({rules:(0,$i.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT(\"Grammar Validations\",function(){if((0,$i.isEmpty)(n)&&e.skipValidations===!1){var s=(0,sJ.validateGrammar)({rules:(0,$i.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,$i.values)(e.tokensMap),errMsgProvider:aJ.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,$i.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT(\"computeAllProdsFollows\",function(){var s=(0,Kye.computeAllProdsFollows)((0,$i.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT(\"ComputeLookaheadFunctions\",function(){e.preComputeLookaheadFunctions((0,$i.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,$i.isEmpty)(e.definitionErrors))throw t=(0,$i.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected:\n `+t.join(`\n-------------------------------\n`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();dr.Parser=ky;(0,Zye.applyMixins)(ky,[Hye.Recoverable,Gye.LooksAhead,Yye.TreeBuilder,jye.LexerAdapter,Jye.RecognizerEngine,qye.RecognizerApi,Wye.ErrorHandler,zye.ContentAssist,Vye.GastRecorder,Xye.PerformanceTracer]);var ewe=function(r){oJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,$i.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(ky);dr.CstParser=ewe;var twe=function(r){oJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,$i.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(ky);dr.EmbeddedActionsParser=twe});var lJ=w(Ry=>{\"use strict\";Object.defineProperty(Ry,\"__esModule\",{value:!0});Ry.createSyntaxDiagramsCode=void 0;var AJ=Dv();function rwe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?\"https://unpkg.com/chevrotain@\"+AJ.VERSION+\"/diagrams/\":i,s=t.css,o=s===void 0?\"https://unpkg.com/chevrotain@\"+AJ.VERSION+\"/diagrams/diagrams.css\":s,a=`\n<!-- This is a generated file -->\n<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<style>\n  body {\n    background-color: hsl(30, 20%, 95%)\n  }\n</style>\n\n`,l=`\n<link rel='stylesheet' href='`+o+`'>\n`,c=`\n<script src='`+n+`vendor/railroad-diagrams.js'><\\/script>\n<script src='`+n+`src/diagrams_builder.js'><\\/script>\n<script src='`+n+`src/diagrams_behavior.js'><\\/script>\n<script src='`+n+`src/main.js'><\\/script>\n`,u=`\n<div id=\"diagrams\" align=\"center\"></div>    \n`,g=`\n<script>\n    window.serializedGrammar = `+JSON.stringify(r,null,\"  \")+`;\n<\\/script>\n`,f=`\n<script>\n    var diagramsDiv = document.getElementById(\"diagrams\");\n    main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\n<\\/script>\n`;return a+l+c+u+g+f}Ry.createSyntaxDiagramsCode=rwe});var gJ=w(We=>{\"use strict\";Object.defineProperty(We,\"__esModule\",{value:!0});We.Parser=We.createSyntaxDiagramsCode=We.clearCache=We.GAstVisitor=We.serializeProduction=We.serializeGrammar=We.Terminal=We.Rule=We.RepetitionWithSeparator=We.RepetitionMandatoryWithSeparator=We.RepetitionMandatory=We.Repetition=We.Option=We.NonTerminal=We.Alternative=We.Alternation=We.defaultLexerErrorProvider=We.NoViableAltException=We.NotAllInputParsedException=We.MismatchedTokenException=We.isRecognitionException=We.EarlyExitException=We.defaultParserErrorProvider=We.tokenName=We.tokenMatcher=We.tokenLabel=We.EOF=We.createTokenInstance=We.createToken=We.LexerDefinitionErrorType=We.Lexer=We.EMPTY_ALT=We.ParserDefinitionErrorType=We.EmbeddedActionsParser=We.CstParser=We.VERSION=void 0;var iwe=Dv();Object.defineProperty(We,\"VERSION\",{enumerable:!0,get:function(){return iwe.VERSION}});var Fy=Yn();Object.defineProperty(We,\"CstParser\",{enumerable:!0,get:function(){return Fy.CstParser}});Object.defineProperty(We,\"EmbeddedActionsParser\",{enumerable:!0,get:function(){return Fy.EmbeddedActionsParser}});Object.defineProperty(We,\"ParserDefinitionErrorType\",{enumerable:!0,get:function(){return Fy.ParserDefinitionErrorType}});Object.defineProperty(We,\"EMPTY_ALT\",{enumerable:!0,get:function(){return Fy.EMPTY_ALT}});var cJ=Bd();Object.defineProperty(We,\"Lexer\",{enumerable:!0,get:function(){return cJ.Lexer}});Object.defineProperty(We,\"LexerDefinitionErrorType\",{enumerable:!0,get:function(){return cJ.LexerDefinitionErrorType}});var af=LA();Object.defineProperty(We,\"createToken\",{enumerable:!0,get:function(){return af.createToken}});Object.defineProperty(We,\"createTokenInstance\",{enumerable:!0,get:function(){return af.createTokenInstance}});Object.defineProperty(We,\"EOF\",{enumerable:!0,get:function(){return af.EOF}});Object.defineProperty(We,\"tokenLabel\",{enumerable:!0,get:function(){return af.tokenLabel}});Object.defineProperty(We,\"tokenMatcher\",{enumerable:!0,get:function(){return af.tokenMatcher}});Object.defineProperty(We,\"tokenName\",{enumerable:!0,get:function(){return af.tokenName}});var nwe=xd();Object.defineProperty(We,\"defaultParserErrorProvider\",{enumerable:!0,get:function(){return nwe.defaultParserErrorProvider}});var Od=nf();Object.defineProperty(We,\"EarlyExitException\",{enumerable:!0,get:function(){return Od.EarlyExitException}});Object.defineProperty(We,\"isRecognitionException\",{enumerable:!0,get:function(){return Od.isRecognitionException}});Object.defineProperty(We,\"MismatchedTokenException\",{enumerable:!0,get:function(){return Od.MismatchedTokenException}});Object.defineProperty(We,\"NotAllInputParsedException\",{enumerable:!0,get:function(){return Od.NotAllInputParsedException}});Object.defineProperty(We,\"NoViableAltException\",{enumerable:!0,get:function(){return Od.NoViableAltException}});var swe=Kv();Object.defineProperty(We,\"defaultLexerErrorProvider\",{enumerable:!0,get:function(){return swe.defaultLexerErrorProvider}});var Oo=Cn();Object.defineProperty(We,\"Alternation\",{enumerable:!0,get:function(){return Oo.Alternation}});Object.defineProperty(We,\"Alternative\",{enumerable:!0,get:function(){return Oo.Alternative}});Object.defineProperty(We,\"NonTerminal\",{enumerable:!0,get:function(){return Oo.NonTerminal}});Object.defineProperty(We,\"Option\",{enumerable:!0,get:function(){return Oo.Option}});Object.defineProperty(We,\"Repetition\",{enumerable:!0,get:function(){return Oo.Repetition}});Object.defineProperty(We,\"RepetitionMandatory\",{enumerable:!0,get:function(){return Oo.RepetitionMandatory}});Object.defineProperty(We,\"RepetitionMandatoryWithSeparator\",{enumerable:!0,get:function(){return Oo.RepetitionMandatoryWithSeparator}});Object.defineProperty(We,\"RepetitionWithSeparator\",{enumerable:!0,get:function(){return Oo.RepetitionWithSeparator}});Object.defineProperty(We,\"Rule\",{enumerable:!0,get:function(){return Oo.Rule}});Object.defineProperty(We,\"Terminal\",{enumerable:!0,get:function(){return Oo.Terminal}});var uJ=Cn();Object.defineProperty(We,\"serializeGrammar\",{enumerable:!0,get:function(){return uJ.serializeGrammar}});Object.defineProperty(We,\"serializeProduction\",{enumerable:!0,get:function(){return uJ.serializeProduction}});var owe=$g();Object.defineProperty(We,\"GAstVisitor\",{enumerable:!0,get:function(){return owe.GAstVisitor}});function awe(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API.\n\t It performs no action other than printing this message.\n\t Please avoid using it as it will be completely removed in the future`)}We.clearCache=awe;var Awe=lJ();Object.defineProperty(We,\"createSyntaxDiagramsCode\",{enumerable:!0,get:function(){return Awe.createSyntaxDiagramsCode}});var lwe=function(){function r(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\t\nSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return r}();We.Parser=lwe});var pJ=w((Get,hJ)=>{var Ny=gJ(),Ra=Ny.createToken,fJ=Ny.tokenMatcher,ux=Ny.Lexer,cwe=Ny.EmbeddedActionsParser;hJ.exports=r=>{let e=Ra({name:\"LogicalOperator\",pattern:ux.NA}),t=Ra({name:\"Or\",pattern:/\\|/,categories:e}),i=Ra({name:\"Xor\",pattern:/\\^/,categories:e}),n=Ra({name:\"And\",pattern:/&/,categories:e}),s=Ra({name:\"Not\",pattern:/!/}),o=Ra({name:\"LParen\",pattern:/\\(/}),a=Ra({name:\"RParen\",pattern:/\\)/}),l=Ra({name:\"Query\",pattern:r}),u=[Ra({name:\"WhiteSpace\",pattern:/\\s+/,group:ux.SKIPPED}),t,i,n,o,a,s,e,l],g=new ux(u);class f extends cwe{constructor(p){super(u),this.RULE(\"expression\",()=>this.SUBRULE(this.logicalExpression)),this.RULE(\"logicalExpression\",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let B=y,v=this.CONSUME(e),D=this.SUBRULE2(this.atomicExpression);fJ(v,t)?y=L=>B(L)||D(L):fJ(v,i)?y=L=>!!(B(L)^D(L)):y=L=>B(L)&&D(L)}),y}),this.RULE(\"atomicExpression\",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:C}=this.CONSUME(l);return y=>y(C)}},{ALT:()=>{this.CONSUME(s);let C=this.SUBRULE(this.atomicExpression);return y=>!C(y)}}])),this.RULE(\"parenthesisExpression\",()=>{let C;return this.CONSUME(o),C=this.SUBRULE(this.expression),this.CONSUME(a),C}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var dJ=w(Ly=>{var uwe=pJ();Ly.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=uwe(r),i=new t;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};Ly.parse=Ly.makeParser()});var mJ=w((jet,CJ)=>{\"use strict\";CJ.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var gx=w((qet,IJ)=>{var Md=mJ(),EJ={};for(let r of Object.keys(Md))EJ[Md[r]]=r;var st={rgb:{channels:3,labels:\"rgb\"},hsl:{channels:3,labels:\"hsl\"},hsv:{channels:3,labels:\"hsv\"},hwb:{channels:3,labels:\"hwb\"},cmyk:{channels:4,labels:\"cmyk\"},xyz:{channels:3,labels:\"xyz\"},lab:{channels:3,labels:\"lab\"},lch:{channels:3,labels:\"lch\"},hex:{channels:1,labels:[\"hex\"]},keyword:{channels:1,labels:[\"keyword\"]},ansi16:{channels:1,labels:[\"ansi16\"]},ansi256:{channels:1,labels:[\"ansi256\"]},hcg:{channels:3,labels:[\"h\",\"c\",\"g\"]},apple:{channels:3,labels:[\"r16\",\"g16\",\"b16\"]},gray:{channels:1,labels:[\"gray\"]}};IJ.exports=st;for(let r of Object.keys(st)){if(!(\"channels\"in st[r]))throw new Error(\"missing channels property: \"+r);if(!(\"labels\"in st[r]))throw new Error(\"missing channel labels property: \"+r);if(st[r].labels.length!==st[r].channels)throw new Error(\"channel and label counts mismatch: \"+r);let{channels:e,labels:t}=st[r];delete st[r].channels,delete st[r].labels,Object.defineProperty(st[r],\"channels\",{value:e}),Object.defineProperty(st[r],\"labels\",{value:t})}st.rgb.hsl=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(e,t,i),s=Math.max(e,t,i),o=s-n,a,l;s===n?a=0:e===s?a=(t-i)/o:t===s?a=2+(i-e)/o:i===s&&(a=4+(e-t)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};st.rgb.hsv=function(r){let e,t,i,n,s,o=r[0]/255,a=r[1]/255,l=r[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),t=g(a),i=g(l),o===c?n=i-t:a===c?n=1/3+e-i:l===c&&(n=2/3+t-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};st.rgb.hwb=function(r){let e=r[0],t=r[1],i=r[2],n=st.rgb.hsl(r)[0],s=1/255*Math.min(e,Math.min(t,i));return i=1-1/255*Math.max(e,Math.max(t,i)),[n,s*100,i*100]};st.rgb.cmyk=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(1-e,1-t,1-i),s=(1-e-n)/(1-n)||0,o=(1-t-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function gwe(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}st.rgb.keyword=function(r){let e=EJ[r];if(e)return e;let t=1/0,i;for(let n of Object.keys(Md)){let s=Md[n],o=gwe(r,s);o<t&&(t=o,i=n)}return i};st.keyword.rgb=function(r){return Md[r]};st.rgb.xyz=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+t*.3576+i*.1805,s=e*.2126+t*.7152+i*.0722,o=e*.0193+t*.1192+i*.9505;return[n*100,s*100,o*100]};st.rgb.lab=function(r){let e=st.rgb.xyz(r),t=e[0],i=e[1],n=e[2];t/=95.047,i/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(t-i),a=200*(i-n);return[s,o,a]};st.hsl.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n,s,o;if(t===0)return o=i*255,[o,o,o];i<.5?n=i*(1+t):n=i+t-i*t;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};st.hsl.hsv=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=t,s=Math.max(i,.01);i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+t)/2,a=i===0?2*n/(s+n):2*t/(i+t);return[e,a*100,o*100]};st.hsv.rgb=function(r){let e=r[0]/60,t=r[1]/100,i=r[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-t),a=255*i*(1-t*s),l=255*i*(1-t*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};st.hsv.hsl=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=Math.max(i,.01),s,o;o=(2-t)*i;let a=(2-t)*n;return s=t*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};st.hwb.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n=t+i,s;n>1&&(t/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!==0&&(s=1-s);let l=t+s*(a-t),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=t;break;case 1:c=l,u=a,g=t;break;case 2:c=t,u=a,g=l;break;case 3:c=t,u=l,g=a;break;case 4:c=l,u=t,g=a;break;case 5:c=a,u=t,g=l;break}return[c*255,u*255,g*255]};st.cmyk.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n=r[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,t*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};st.xyz.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n,s,o;return n=e*3.2406+t*-1.5372+i*-.4986,s=e*-.9689+t*1.8758+i*.0415,o=e*.0557+t*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};st.xyz.lab=function(r){let e=r[0],t=r[1],i=r[2];e/=95.047,t/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*t-16,s=500*(e-t),o=200*(t-i);return[n,s,o]};st.lab.xyz=function(r){let e=r[0],t=r[1],i=r[2],n,s,o;s=(e+16)/116,n=t/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};st.lab.lch=function(r){let e=r[0],t=r[1],i=r[2],n;n=Math.atan2(i,t)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(t*t+i*i);return[e,o,n]};st.lch.lab=function(r){let e=r[0],t=r[1],n=r[2]/360*2*Math.PI,s=t*Math.cos(n),o=t*Math.sin(n);return[e,s,o]};st.rgb.ansi16=function(r,e=null){let[t,i,n]=r,s=e===null?st.rgb.hsv(r)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(t/255));return s===2&&(o+=60),o};st.hsv.ansi16=function(r){return st.rgb.ansi16(st.hsv.rgb(r),r[2])};st.rgb.ansi256=function(r){let e=r[0],t=r[1],i=r[2];return e===t&&t===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(i/255*5)};st.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(r>50)+1)*.5,i=(e&1)*t*255,n=(e>>1&1)*t*255,s=(e>>2&1)*t*255;return[i,n,s]};st.ansi256.rgb=function(r){if(r>=232){let s=(r-232)*10+8;return[s,s,s]}r-=16;let e,t=Math.floor(r/36)/5*255,i=Math.floor((e=r%36)/6)/5*255,n=e%6/5*255;return[t,i,n]};st.rgb.hex=function(r){let t=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return\"000000\".substring(t.length)+t};st.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split(\"\").map(a=>a+a).join(\"\"));let i=parseInt(t,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};st.rgb.hcg=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.max(Math.max(e,t),i),s=Math.min(Math.min(e,t),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(t-i)/o%6:n===t?l=2+(i-e)/o:l=4+(e-t)/o,l/=6,l%=1,[l*360,o*100,a*100]};st.hsl.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=t<.5?2*e*t:2*e*(1-t),n=0;return i<1&&(n=(t-.5*i)/(1-i)),[r[0],i*100,n*100]};st.hsv.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=e*t,n=0;return i<1&&(n=(t-i)/(1-i)),[r[0],i*100,n*100]};st.hcg.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100;if(t===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-t)*i,[(t*n[0]+l)*255,(t*n[1]+l)*255,(t*n[2]+l)*255]};st.hcg.hsv=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e),n=0;return i>0&&(n=e/i),[r[0],n*100,i*100]};st.hcg.hsl=function(r){let e=r[1]/100,i=r[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[r[0],n*100,i*100]};st.hcg.hwb=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e);return[r[0],(i-e)*100,(1-i)*100]};st.hwb.hcg=function(r){let e=r[1]/100,i=1-r[2]/100,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[r[0],n*100,s*100]};st.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};st.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};st.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};st.gray.hsl=function(r){return[0,0,r[0]]};st.gray.hsv=st.gray.hsl;st.gray.hwb=function(r){return[0,100,r[0]]};st.gray.cmyk=function(r){return[0,0,0,r[0]]};st.gray.lab=function(r){return[r[0],0,0]};st.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return\"000000\".substring(i.length)+i};st.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var wJ=w((Jet,yJ)=>{var Ty=gx();function fwe(){let r={},e=Object.keys(Ty);for(let t=e.length,i=0;i<t;i++)r[e[i]]={distance:-1,parent:null};return r}function hwe(r){let e=fwe(),t=[r];for(e[r].distance=0;t.length;){let i=t.pop(),n=Object.keys(Ty[i]);for(let s=n.length,o=0;o<s;o++){let a=n[o],l=e[a];l.distance===-1&&(l.distance=e[i].distance+1,l.parent=i,t.unshift(a))}}return e}function pwe(r,e){return function(t){return e(r(t))}}function dwe(r,e){let t=[e[r].parent,r],i=Ty[e[r].parent][r],n=e[r].parent;for(;e[n].parent;)t.unshift(e[n].parent),i=pwe(Ty[e[n].parent][n],i),n=e[n].parent;return i.conversion=t,i}yJ.exports=function(r){let e=hwe(r),t={},i=Object.keys(e);for(let n=i.length,s=0;s<n;s++){let o=i[s];e[o].parent!==null&&(t[o]=dwe(o,e))}return t}});var QJ=w((Wet,BJ)=>{var fx=gx(),Cwe=wJ(),Af={},mwe=Object.keys(fx);function Ewe(r){let e=function(...t){let i=t[0];return i==null?i:(i.length>1&&(t=i),r(t))};return\"conversion\"in r&&(e.conversion=r.conversion),e}function Iwe(r){let e=function(...t){let i=t[0];if(i==null)return i;i.length>1&&(t=i);let n=r(t);if(typeof n==\"object\")for(let s=n.length,o=0;o<s;o++)n[o]=Math.round(n[o]);return n};return\"conversion\"in r&&(e.conversion=r.conversion),e}mwe.forEach(r=>{Af[r]={},Object.defineProperty(Af[r],\"channels\",{value:fx[r].channels}),Object.defineProperty(Af[r],\"labels\",{value:fx[r].labels});let e=Cwe(r);Object.keys(e).forEach(i=>{let n=e[i];Af[r][i]=Iwe(n),Af[r][i].raw=Ewe(n)})});BJ.exports=Af});var DJ=w((zet,PJ)=>{\"use strict\";var bJ=(r,e)=>(...t)=>`\\x1B[${r(...t)+e}m`,SJ=(r,e)=>(...t)=>{let i=r(...t);return`\\x1B[${38+e};5;${i}m`},vJ=(r,e)=>(...t)=>{let i=r(...t);return`\\x1B[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Oy=r=>r,xJ=(r,e,t)=>[r,e,t],lf=(r,e,t)=>{Object.defineProperty(r,e,{get:()=>{let i=t();return Object.defineProperty(r,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},hx,cf=(r,e,t,i)=>{hx===void 0&&(hx=QJ());let n=i?10:0,s={};for(let[o,a]of Object.entries(hx)){let l=o===\"ansi16\"?\"ansi\":o;o===e?s[l]=r(t,n):typeof a==\"object\"&&(s[l]=r(a[e],n))}return s};function ywe(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`\\x1B[${s[0]}m`,close:`\\x1B[${s[1]}m`},i[n]=e[n],r.set(s[0],s[1]);Object.defineProperty(e,t,{value:i,enumerable:!1})}return Object.defineProperty(e,\"codes\",{value:r,enumerable:!1}),e.color.close=\"\\x1B[39m\",e.bgColor.close=\"\\x1B[49m\",lf(e.color,\"ansi\",()=>cf(bJ,\"ansi16\",Oy,!1)),lf(e.color,\"ansi256\",()=>cf(SJ,\"ansi256\",Oy,!1)),lf(e.color,\"ansi16m\",()=>cf(vJ,\"rgb\",xJ,!1)),lf(e.bgColor,\"ansi\",()=>cf(bJ,\"ansi16\",Oy,!0)),lf(e.bgColor,\"ansi256\",()=>cf(SJ,\"ansi256\",Oy,!0)),lf(e.bgColor,\"ansi16m\",()=>cf(vJ,\"rgb\",xJ,!0)),e}Object.defineProperty(PJ,\"exports\",{enumerable:!0,get:ywe})});var RJ=w((Vet,kJ)=>{\"use strict\";kJ.exports=(r,e=process.argv)=>{let t=r.startsWith(\"-\")?\"\":r.length===1?\"-\":\"--\",i=e.indexOf(t+r),n=e.indexOf(\"--\");return i!==-1&&(n===-1||i<n)}});var LJ=w((Xet,NJ)=>{\"use strict\";var wwe=J(\"os\"),FJ=J(\"tty\"),ds=RJ(),{env:ai}=process,UA;ds(\"no-color\")||ds(\"no-colors\")||ds(\"color=false\")||ds(\"color=never\")?UA=0:(ds(\"color\")||ds(\"colors\")||ds(\"color=true\")||ds(\"color=always\"))&&(UA=1);\"FORCE_COLOR\"in ai&&(ai.FORCE_COLOR===\"true\"?UA=1:ai.FORCE_COLOR===\"false\"?UA=0:UA=ai.FORCE_COLOR.length===0?1:Math.min(parseInt(ai.FORCE_COLOR,10),3));function px(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function dx(r,e){if(UA===0)return 0;if(ds(\"color=16m\")||ds(\"color=full\")||ds(\"color=truecolor\"))return 3;if(ds(\"color=256\"))return 2;if(r&&!e&&UA===void 0)return 0;let t=UA||0;if(ai.TERM===\"dumb\")return t;if(process.platform===\"win32\"){let i=wwe.release().split(\".\");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if(\"CI\"in ai)return[\"TRAVIS\",\"CIRCLECI\",\"APPVEYOR\",\"GITLAB_CI\"].some(i=>i in ai)||ai.CI_NAME===\"codeship\"?1:t;if(\"TEAMCITY_VERSION\"in ai)return/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(ai.TEAMCITY_VERSION)?1:0;if(\"GITHUB_ACTIONS\"in ai)return 1;if(ai.COLORTERM===\"truecolor\")return 3;if(\"TERM_PROGRAM\"in ai){let i=parseInt((ai.TERM_PROGRAM_VERSION||\"\").split(\".\")[0],10);switch(ai.TERM_PROGRAM){case\"iTerm.app\":return i>=3?3:2;case\"Apple_Terminal\":return 2}}return/-256(color)?$/i.test(ai.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ai.TERM)||\"COLORTERM\"in ai?1:t}function Bwe(r){let e=dx(r,r&&r.isTTY);return px(e)}NJ.exports={supportsColor:Bwe,stdout:px(dx(!0,FJ.isatty(1))),stderr:px(dx(!0,FJ.isatty(2)))}});var OJ=w((Zet,TJ)=>{\"use strict\";var Qwe=(r,e,t)=>{let i=r.indexOf(e);if(i===-1)return r;let n=e.length,s=0,o=\"\";do o+=r.substr(s,i-s)+e+t,s=i+n,i=r.indexOf(e,s);while(i!==-1);return o+=r.substr(s),o},bwe=(r,e,t,i)=>{let n=0,s=\"\";do{let o=r[i-1]===\"\\r\";s+=r.substr(n,(o?i-1:i)-n)+e+(o?`\\r\n`:`\n`)+t,n=i+1,i=r.indexOf(`\n`,n)}while(i!==-1);return s+=r.substr(n),s};TJ.exports={stringReplaceAll:Qwe,stringEncaseCRLFWithFirstIndex:bwe}});var GJ=w((_et,HJ)=>{\"use strict\";var Swe=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,MJ=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,vwe=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,xwe=/\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.)|([^\\\\])/gi,Pwe=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function KJ(r){let e=r[0]===\"u\",t=r[1]===\"{\";return e&&!t&&r.length===5||r[0]===\"x\"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&t?String.fromCodePoint(parseInt(r.slice(2,-1),16)):Pwe.get(r)||r}function Dwe(r,e){let t=[],i=e.trim().split(/\\s*,\\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))t.push(o);else if(n=s.match(vwe))t.push(n[2].replace(xwe,(a,l,c)=>l?KJ(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function kwe(r){MJ.lastIndex=0;let e=[],t;for(;(t=MJ.exec(r))!==null;){let i=t[1];if(t[2]){let n=Dwe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function UJ(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n.inverse?null:s.slice(1);let i=r;for(let[n,s]of Object.entries(t))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}HJ.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(Swe,(s,o,a,l,c,u)=>{if(o)n.push(KJ(o));else if(l){let g=n.join(\"\");n=[],i.push(t.length===0?g:UJ(r,t)(g)),t.push({inverse:a,styles:kwe(l)})}else if(c){if(t.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");i.push(UJ(r,t)(n.join(\"\"))),n=[],t.pop()}else n.push(u)}),i.push(n.join(\"\")),t.length>0){let s=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?\"\":\"s\"} (\\`}\\`)`;throw new Error(s)}return i.join(\"\")}});var wx=w(($et,JJ)=>{\"use strict\";var Ud=DJ(),{stdout:mx,stderr:Ex}=LJ(),{stringReplaceAll:Rwe,stringEncaseCRLFWithFirstIndex:Fwe}=OJ(),YJ=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],uf=Object.create(null),Nwe=(r,e={})=>{if(e.level>3||e.level<0)throw new Error(\"The `level` option should be an integer from 0 to 3\");let t=mx?mx.level:0;r.level=e.level===void 0?t:e.level},Ix=class{constructor(e){return jJ(e)}},jJ=r=>{let e={};return Nwe(e,r),e.template=(...t)=>Owe(e.template,...t),Object.setPrototypeOf(e,My.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error(\"`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.\")},e.template.Instance=Ix,e.template};function My(r){return jJ(r)}for(let[r,e]of Object.entries(Ud))uf[r]={get(){let t=Uy(this,yx(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:t}),t}};uf.visible={get(){let r=Uy(this,this._styler,!0);return Object.defineProperty(this,\"visible\",{value:r}),r}};var qJ=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let r of qJ)uf[r]={get(){let{level:e}=this;return function(...t){let i=yx(Ud.color[YJ[e]][r](...t),Ud.color.close,this._styler);return Uy(this,i,this._isEmpty)}}};for(let r of qJ){let e=\"bg\"+r[0].toUpperCase()+r.slice(1);uf[e]={get(){let{level:t}=this;return function(...i){let n=yx(Ud.bgColor[YJ[t]][r](...i),Ud.bgColor.close,this._styler);return Uy(this,n,this._isEmpty)}}}}var Lwe=Object.defineProperties(()=>{},{...uf,level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}}),yx=(r,e,t)=>{let i,n;return t===void 0?(i=r,n=e):(i=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:i,closeAll:n,parent:t}},Uy=(r,e,t)=>{let i=(...n)=>Twe(i,n.length===1?\"\"+n[0]:n.join(\" \"));return i.__proto__=Lwe,i._generator=r,i._styler=e,i._isEmpty=t,i},Twe=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?\"\":e;let t=r._styler;if(t===void 0)return e;let{openAll:i,closeAll:n}=t;if(e.indexOf(\"\\x1B\")!==-1)for(;t!==void 0;)e=Rwe(e,t.close,t.open),t=t.parent;let s=e.indexOf(`\n`);return s!==-1&&(e=Fwe(e,n,i,s)),i+e+n},Cx,Owe=(r,...e)=>{let[t]=e;if(!Array.isArray(t))return e.join(\" \");let i=e.slice(1),n=[t.raw[0]];for(let s=1;s<t.length;s++)n.push(String(i[s-1]).replace(/[{}\\\\]/g,\"\\\\$&\"),String(t.raw[s]));return Cx===void 0&&(Cx=GJ()),Cx(r,n.join(\"\"))};Object.defineProperties(My.prototype,uf);var Kd=My();Kd.supportsColor=mx;Kd.stderr=My({level:Ex?Ex.level:0});Kd.stderr.supportsColor=Ex;Kd.Level={None:0,Basic:1,Ansi256:2,TrueColor:3,0:\"None\",1:\"Basic\",2:\"Ansi256\",3:\"TrueColor\"};JJ.exports=Kd});var Ky=w(Cs=>{\"use strict\";Cs.isInteger=r=>typeof r==\"number\"?Number.isInteger(r):typeof r==\"string\"&&r.trim()!==\"\"?Number.isInteger(Number(r)):!1;Cs.find=(r,e)=>r.nodes.find(t=>t.type===e);Cs.exceedsLimit=(r,e,t=1,i)=>i===!1||!Cs.isInteger(r)||!Cs.isInteger(e)?!1:(Number(e)-Number(r))/Number(t)>=i;Cs.escapeNode=(r,e=0,t)=>{let i=r.nodes[e];!i||(t&&i.type===t||i.type===\"open\"||i.type===\"close\")&&i.escaped!==!0&&(i.value=\"\\\\\"+i.value,i.escaped=!0)};Cs.encloseBrace=r=>r.type!==\"brace\"?!1:r.commas>>0+r.ranges>>0===0?(r.invalid=!0,!0):!1;Cs.isInvalidBrace=r=>r.type!==\"brace\"?!1:r.invalid===!0||r.dollar?!0:r.commas>>0+r.ranges>>0===0||r.open!==!0||r.close!==!0?(r.invalid=!0,!0):!1;Cs.isOpenOrClose=r=>r.type===\"open\"||r.type===\"close\"?!0:r.open===!0||r.close===!0;Cs.reduce=r=>r.reduce((e,t)=>(t.type===\"text\"&&e.push(t.value),t.type===\"range\"&&(t.type=\"text\"),e),[]);Cs.flatten=(...r)=>{let e=[],t=i=>{for(let n=0;n<i.length;n++){let s=i[n];Array.isArray(s)?t(s,e):s!==void 0&&e.push(s)}return e};return t(r),e}});var Hy=w((ttt,zJ)=>{\"use strict\";var WJ=Ky();zJ.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&WJ.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=\"\";if(i.value)return(s||o)&&WJ.isOpenOrClose(i)?\"\\\\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=t(l);return a};return t(r)}});var XJ=w((rtt,VJ)=>{\"use strict\";VJ.exports=function(r){return typeof r==\"number\"?r-r===0:typeof r==\"string\"&&r.trim()!==\"\"?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var s3=w((itt,n3)=>{\"use strict\";var ZJ=XJ(),Ic=(r,e,t)=>{if(ZJ(r)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(e===void 0||r===e)return String(r);if(ZJ(e)===!1)throw new TypeError(\"toRegexRange: expected the second argument to be a number.\");let i={relaxZeros:!0,...t};typeof i.strictZeros==\"boolean\"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=r+\":\"+e+\"=\"+n+s+o+a;if(Ic.cache.hasOwnProperty(l))return Ic.cache[l].result;let c=Math.min(r,e),u=Math.max(r,e);if(Math.abs(c-u)===1){let C=r+\"|\"+e;return i.capture?`(${C})`:i.wrap===!1?C:`(?:${C})`}let g=i3(r)||i3(e),f={min:r,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let C=u<0?Math.abs(u):1;p=_J(C,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=_J(c,u,f,i)),f.negatives=p,f.positives=h,f.result=Mwe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Ic.cache[l]=f,f.result};function Mwe(r,e,t){let i=Bx(r,e,\"-\",!1,t)||[],n=Bx(e,r,\"\",!1,t)||[],s=Bx(r,e,\"-?\",!0,t)||[];return i.concat(s).concat(n).join(\"|\")}function Uwe(r,e){let t=1,i=1,n=e3(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=e3(r,t);for(n=t3(e+1,i)-1;r<n&&n<=e;)s.add(n),i+=1,n=t3(e+1,i)-1;return s=[...s],s.sort(Gwe),s}function Kwe(r,e,t){if(r===e)return{pattern:r,count:[],digits:0};let i=Hwe(r,e),n=i.length,s=\"\",o=0;for(let a=0;a<n;a++){let[l,c]=i[a];l===c?s+=l:l!==\"0\"||c!==\"9\"?s+=Ywe(l,c,t):o++}return o&&(s+=t.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:s,count:[o],digits:n}}function _J(r,e,t,i){let n=Uwe(r,e),s=[],o=r,a;for(let l=0;l<n.length;l++){let c=n[l],u=Kwe(String(o),String(c),i),g=\"\";if(!t.isPadded&&a&&a.pattern===u.pattern){a.count.length>1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+r3(a.count),o=c+1;continue}t.isPadded&&(g=jwe(c,t,i)),u.string=g+u.pattern+r3(u.count),s.push(u),o=c+1,a=u}return s}function Bx(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!$J(e,\"string\",a)&&s.push(t+a),i&&$J(e,\"string\",a)&&s.push(t+a)}return s}function Hwe(r,e){let t=[];for(let i=0;i<r.length;i++)t.push([r[i],e[i]]);return t}function Gwe(r,e){return r>e?1:e>r?-1:0}function $J(r,e,t){return r.some(i=>i[e]===t)}function e3(r,e){return Number(String(r).slice(0,-e)+\"9\".repeat(e))}function t3(r,e){return r-r%Math.pow(10,e)}function r3(r){let[e=0,t=\"\"]=r;return t||e>1?`{${e+(t?\",\"+t:\"\")}}`:\"\"}function Ywe(r,e,t){return`[${r}${e-r===1?\"\":\"-\"}${e}]`}function i3(r){return/^-?(0+)\\d/.test(r)}function jwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-String(r).length),n=t.relaxZeros!==!1;switch(i){case 0:return\"\";case 1:return n?\"0?\":\"0\";case 2:return n?\"0{0,2}\":\"00\";default:return n?`0{0,${i}}`:`0{${i}}`}}Ic.cache={};Ic.clearCache=()=>Ic.cache={};n3.exports=Ic});var Sx=w((ntt,f3)=>{\"use strict\";var qwe=J(\"util\"),A3=s3(),o3=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r),Jwe=r=>e=>r===!0?Number(e):String(e),Qx=r=>typeof r==\"number\"||typeof r==\"string\"&&r!==\"\",Hd=r=>Number.isInteger(+r),bx=r=>{let e=`${r}`,t=-1;if(e[0]===\"-\"&&(e=e.slice(1)),e===\"0\")return!1;for(;e[++t]===\"0\";);return t>0},Wwe=(r,e,t)=>typeof r==\"string\"||typeof e==\"string\"?!0:t.stringify===!0,zwe=(r,e,t)=>{if(e>0){let i=r[0]===\"-\"?\"-\":\"\";i&&(r=r.slice(1)),r=i+r.padStart(i?e-1:e,\"0\")}return t===!1?String(r):r},a3=(r,e)=>{let t=r[0]===\"-\"?\"-\":\"\";for(t&&(r=r.slice(1),e--);r.length<e;)r=\"0\"+r;return t?\"-\"+r:r},Vwe=(r,e)=>{r.negatives.sort((o,a)=>o<a?-1:o>a?1:0),r.positives.sort((o,a)=>o<a?-1:o>a?1:0);let t=e.capture?\"\":\"?:\",i=\"\",n=\"\",s;return r.positives.length&&(i=r.positives.join(\"|\")),r.negatives.length&&(n=`-(${t}${r.negatives.join(\"|\")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${t}${s})`:s},l3=(r,e,t,i)=>{if(t)return A3(r,e,{wrap:!1,...i});let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},c3=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?\"\":\"?:\";return i?`(${n}${r.join(\"|\")})`:r.join(\"|\")}return A3(r,e,t)},u3=(...r)=>new RangeError(\"Invalid range arguments: \"+qwe.inspect(...r)),g3=(r,e,t)=>{if(t.strictRanges===!0)throw u3([r,e]);return[]},Xwe=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step \"${r}\" to be a number`);return[]},Zwe=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw u3([r,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(r),l=String(e),c=String(t);t=Math.max(Math.abs(t),1);let u=bx(a)||bx(l)||bx(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Wwe(r,e,i)===!1,h=i.transform||Jwe(f);if(i.toRegex&&t===1)return l3(a3(r,g),a3(e,g),!0,i);let p={negatives:[],positives:[]},C=v=>p[v<0?\"negatives\":\"positives\"].push(Math.abs(v)),y=[],B=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&t>1?C(n):y.push(zwe(h(n,B),g,f)),n=o?n-t:n+t,B++;return i.toRegex===!0?t>1?Vwe(p,i):c3(y,null,{wrap:!1,...i}):y},_we=(r,e,t=1,i={})=>{if(!Hd(r)&&r.length>1||!Hd(e)&&e.length>1)return g3(r,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${r}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&t===1)return l3(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-t:s+t,g++;return i.toRegex===!0?c3(u,null,{wrap:!1,options:i}):u},Gy=(r,e,t,i={})=>{if(e==null&&Qx(r))return[r];if(!Qx(r)||!Qx(e))return g3(r,e,i);if(typeof t==\"function\")return Gy(r,e,1,{transform:t});if(o3(t))return Gy(r,e,0,t);let n={...i};return n.capture===!0&&(n.wrap=!0),t=t||n.step||1,Hd(t)?Hd(r)&&Hd(e)?Zwe(r,e,t,n):_we(r,e,Math.max(Math.abs(t),1),n):t!=null&&!o3(t)?Xwe(t,n):Gy(r,e,1,t)};f3.exports=Gy});var d3=w((stt,p3)=>{\"use strict\";var $we=Sx(),h3=Ky(),eBe=(r,e={})=>{let t=(i,n={})=>{let s=h3.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?\"\\\\\":\"\",c=\"\";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type===\"open\")return a?l+i.value:\"(\";if(i.type===\"close\")return a?l+i.value:\")\";if(i.type===\"comma\")return i.prev.type===\"comma\"?\"\":a?i.value:\"|\";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=h3.reduce(i.nodes),g=$we(...u,{...e,wrap:!1,toRegex:!0});if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=t(u,i);return c};return t(r)};p3.exports=eBe});var E3=w((ott,m3)=>{\"use strict\";var tBe=Sx(),C3=Hy(),gf=Ky(),yc=(r=\"\",e=\"\",t=!1)=>{let i=[];if(r=[].concat(r),e=[].concat(e),!e.length)return r;if(!r.length)return t?gf.flatten(e).map(n=>`{${n}}`):e;for(let n of r)if(Array.isArray(n))for(let s of n)i.push(yc(s,e,t));else for(let s of e)t===!0&&typeof s==\"string\"&&(s=`{${s}}`),i.push(Array.isArray(s)?yc(n,s,t):n+s);return gf.flatten(i)},rBe=(r,e={})=>{let t=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!==\"brace\"&&o.type!==\"root\"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(yc(a.pop(),C3(n,e)));return}if(n.type===\"brace\"&&n.invalid!==!0&&n.nodes.length===2){a.push(yc(a.pop(),[\"{}\"]));return}if(n.nodes&&n.ranges>0){let g=gf.reduce(n.nodes);if(gf.exceedsLimit(...g,e.step,t))throw new RangeError(\"expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.\");let f=tBe(...g,e);f.length===0&&(f=C3(n,e)),a.push(yc(a.pop(),f)),n.nodes=[];return}let l=gf.encloseBrace(n),c=n.queue,u=n;for(;u.type!==\"brace\"&&u.type!==\"root\"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g<n.nodes.length;g++){let f=n.nodes[g];if(f.type===\"comma\"&&n.type===\"brace\"){g===1&&c.push(\"\"),c.push(\"\");continue}if(f.type===\"close\"){a.push(yc(a.pop(),c,l));continue}if(f.value&&f.type!==\"open\"){c.push(yc(c.pop(),f.value));continue}f.nodes&&i(f,n)}return c};return gf.flatten(i(r))};m3.exports=rBe});var y3=w((att,I3)=>{\"use strict\";I3.exports={MAX_LENGTH:1024*64,CHAR_0:\"0\",CHAR_9:\"9\",CHAR_UPPERCASE_A:\"A\",CHAR_LOWERCASE_A:\"a\",CHAR_UPPERCASE_Z:\"Z\",CHAR_LOWERCASE_Z:\"z\",CHAR_LEFT_PARENTHESES:\"(\",CHAR_RIGHT_PARENTHESES:\")\",CHAR_ASTERISK:\"*\",CHAR_AMPERSAND:\"&\",CHAR_AT:\"@\",CHAR_BACKSLASH:\"\\\\\",CHAR_BACKTICK:\"`\",CHAR_CARRIAGE_RETURN:\"\\r\",CHAR_CIRCUMFLEX_ACCENT:\"^\",CHAR_COLON:\":\",CHAR_COMMA:\",\",CHAR_DOLLAR:\"$\",CHAR_DOT:\".\",CHAR_DOUBLE_QUOTE:'\"',CHAR_EQUAL:\"=\",CHAR_EXCLAMATION_MARK:\"!\",CHAR_FORM_FEED:\"\\f\",CHAR_FORWARD_SLASH:\"/\",CHAR_HASH:\"#\",CHAR_HYPHEN_MINUS:\"-\",CHAR_LEFT_ANGLE_BRACKET:\"<\",CHAR_LEFT_CURLY_BRACE:\"{\",CHAR_LEFT_SQUARE_BRACKET:\"[\",CHAR_LINE_FEED:`\n`,CHAR_NO_BREAK_SPACE:\"\\xA0\",CHAR_PERCENT:\"%\",CHAR_PLUS:\"+\",CHAR_QUESTION_MARK:\"?\",CHAR_RIGHT_ANGLE_BRACKET:\">\",CHAR_RIGHT_CURLY_BRACE:\"}\",CHAR_RIGHT_SQUARE_BRACKET:\"]\",CHAR_SEMICOLON:\";\",CHAR_SINGLE_QUOTE:\"'\",CHAR_SPACE:\" \",CHAR_TAB:\"\t\",CHAR_UNDERSCORE:\"_\",CHAR_VERTICAL_LINE:\"|\",CHAR_ZERO_WIDTH_NOBREAK_SPACE:\"\\uFEFF\"}});var S3=w((Att,b3)=>{\"use strict\";var iBe=Hy(),{MAX_LENGTH:w3,CHAR_BACKSLASH:vx,CHAR_BACKTICK:nBe,CHAR_COMMA:sBe,CHAR_DOT:oBe,CHAR_LEFT_PARENTHESES:aBe,CHAR_RIGHT_PARENTHESES:ABe,CHAR_LEFT_CURLY_BRACE:lBe,CHAR_RIGHT_CURLY_BRACE:cBe,CHAR_LEFT_SQUARE_BRACKET:B3,CHAR_RIGHT_SQUARE_BRACKET:Q3,CHAR_DOUBLE_QUOTE:uBe,CHAR_SINGLE_QUOTE:gBe,CHAR_NO_BREAK_SPACE:fBe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:hBe}=y3(),pBe=(r,e={})=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");let t=e||{},i=typeof t.maxLength==\"number\"?Math.min(w3,t.maxLength):w3;if(r.length>i)throw new SyntaxError(`Input length (${r.length}), exceeds max characters (${i})`);let n={type:\"root\",input:r,nodes:[]},s=[n],o=n,a=n,l=0,c=r.length,u=0,g=0,f,h={},p=()=>r[u++],C=y=>{if(y.type===\"text\"&&a.type===\"dot\"&&(a.type=\"text\"),a&&a.type===\"text\"&&y.type===\"text\"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(C({type:\"bos\"});u<c;)if(o=s[s.length-1],f=p(),!(f===hBe||f===fBe)){if(f===vx){C({type:\"text\",value:(e.keepEscaping?f:\"\")+p()});continue}if(f===Q3){C({type:\"text\",value:\"\\\\\"+f});continue}if(f===B3){l++;let y=!0,B;for(;u<c&&(B=p());){if(f+=B,B===B3){l++;continue}if(B===vx){f+=p();continue}if(B===Q3&&(l--,l===0))break}C({type:\"text\",value:f});continue}if(f===aBe){o=C({type:\"paren\",nodes:[]}),s.push(o),C({type:\"text\",value:f});continue}if(f===ABe){if(o.type!==\"paren\"){C({type:\"text\",value:f});continue}o=s.pop(),C({type:\"text\",value:f}),o=s[s.length-1];continue}if(f===uBe||f===gBe||f===nBe){let y=f,B;for(e.keepQuotes!==!0&&(f=\"\");u<c&&(B=p());){if(B===vx){f+=B+p();continue}if(B===y){e.keepQuotes===!0&&(f+=B);break}f+=B}C({type:\"text\",value:f});continue}if(f===lBe){g++;let B={type:\"brace\",open:!0,close:!1,dollar:a.value&&a.value.slice(-1)===\"$\"||o.dollar===!0,depth:g,commas:0,ranges:0,nodes:[]};o=C(B),s.push(o),C({type:\"open\",value:f});continue}if(f===cBe){if(o.type!==\"brace\"){C({type:\"text\",value:f});continue}let y=\"close\";o=s.pop(),o.close=!0,C({type:y,value:f}),g--,o=s[s.length-1];continue}if(f===sBe&&g>0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:\"text\",value:iBe(o)}]}C({type:\"comma\",value:f}),o.commas++;continue}if(f===oBe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){C({type:\"text\",value:f});continue}if(a.type===\"dot\"){if(o.range=[],a.value+=f,a.type=\"range\",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type=\"text\";continue}o.ranges++,o.args=[];continue}if(a.type===\"range\"){y.pop();let B=y[y.length-1];B.value+=a.value+f,a=B,o.ranges--;continue}C({type:\"dot\",value:f});continue}C({type:\"text\",value:f})}do if(o=s.pop(),o.type!==\"root\"){o.nodes.forEach(v=>{v.nodes||(v.type===\"open\"&&(v.isOpen=!0),v.type===\"close\"&&(v.isClose=!0),v.nodes||(v.type=\"text\"),v.invalid=!0)});let y=s[s.length-1],B=y.nodes.indexOf(o);y.nodes.splice(B,1,...o.nodes)}while(s.length>0);return C({type:\"eos\"}),n};b3.exports=pBe});var P3=w((ltt,x3)=>{\"use strict\";var v3=Hy(),dBe=d3(),CBe=E3(),mBe=S3(),qn=(r,e={})=>{let t=[];if(Array.isArray(r))for(let i of r){let n=qn.create(i,e);Array.isArray(n)?t.push(...n):t.push(n)}else t=[].concat(qn.create(r,e));return e&&e.expand===!0&&e.nodupes===!0&&(t=[...new Set(t)]),t};qn.parse=(r,e={})=>mBe(r,e);qn.stringify=(r,e={})=>v3(typeof r==\"string\"?qn.parse(r,e):r,e);qn.compile=(r,e={})=>(typeof r==\"string\"&&(r=qn.parse(r,e)),dBe(r,e));qn.expand=(r,e={})=>{typeof r==\"string\"&&(r=qn.parse(r,e));let t=CBe(r,e);return e.noempty===!0&&(t=t.filter(Boolean)),e.nodupes===!0&&(t=[...new Set(t)]),t};qn.create=(r,e={})=>r===\"\"||r.length<3?[r]:e.expand!==!0?qn.compile(r,e):qn.expand(r,e);x3.exports=qn});var Gd=w((ctt,N3)=>{\"use strict\";var EBe=J(\"path\"),Mo=\"\\\\\\\\/\",D3=`[^${Mo}]`,Fa=\"\\\\.\",IBe=\"\\\\+\",yBe=\"\\\\?\",Yy=\"\\\\/\",wBe=\"(?=.)\",k3=\"[^/]\",xx=`(?:${Yy}|$)`,R3=`(?:^|${Yy})`,Px=`${Fa}{1,2}${xx}`,BBe=`(?!${Fa})`,QBe=`(?!${R3}${Px})`,bBe=`(?!${Fa}{0,1}${xx})`,SBe=`(?!${Px})`,vBe=`[^.${Yy}]`,xBe=`${k3}*?`,F3={DOT_LITERAL:Fa,PLUS_LITERAL:IBe,QMARK_LITERAL:yBe,SLASH_LITERAL:Yy,ONE_CHAR:wBe,QMARK:k3,END_ANCHOR:xx,DOTS_SLASH:Px,NO_DOT:BBe,NO_DOTS:QBe,NO_DOT_SLASH:bBe,NO_DOTS_SLASH:SBe,QMARK_NO_DOT:vBe,STAR:xBe,START_ANCHOR:R3},PBe={...F3,SLASH_LITERAL:`[${Mo}]`,QMARK:D3,STAR:`${D3}*?`,DOTS_SLASH:`${Fa}{1,2}(?:[${Mo}]|$)`,NO_DOT:`(?!${Fa})`,NO_DOTS:`(?!(?:^|[${Mo}])${Fa}{1,2}(?:[${Mo}]|$))`,NO_DOT_SLASH:`(?!${Fa}{0,1}(?:[${Mo}]|$))`,NO_DOTS_SLASH:`(?!${Fa}{1,2}(?:[${Mo}]|$))`,QMARK_NO_DOT:`[^.${Mo}]`,START_ANCHOR:`(?:^|[${Mo}])`,END_ANCHOR:`(?:[${Mo}]|$)`},DBe={alnum:\"a-zA-Z0-9\",alpha:\"a-zA-Z\",ascii:\"\\\\x00-\\\\x7F\",blank:\" \\\\t\",cntrl:\"\\\\x00-\\\\x1F\\\\x7F\",digit:\"0-9\",graph:\"\\\\x21-\\\\x7E\",lower:\"a-z\",print:\"\\\\x20-\\\\x7E \",punct:\"\\\\-!\\\"#$%&'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~\",space:\" \\\\t\\\\r\\\\n\\\\v\\\\f\",upper:\"A-Z\",word:\"A-Za-z0-9_\",xdigit:\"A-Fa-f0-9\"};N3.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:DBe,REGEX_BACKSLASH:/\\\\(?![*+?^${}(|)[\\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\\].,$*+?^{}()|\\\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\\\?)((\\W)(\\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,REPLACEMENTS:{\"***\":\"*\",\"**/**\":\"**\",\"**/**/**\":\"**\"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:EBe.sep,extglobChars(r){return{\"!\":{type:\"negate\",open:\"(?:(?!(?:\",close:`))${r.STAR})`},\"?\":{type:\"qmark\",open:\"(?:\",close:\")?\"},\"+\":{type:\"plus\",open:\"(?:\",close:\")+\"},\"*\":{type:\"star\",open:\"(?:\",close:\")*\"},\"@\":{type:\"at\",open:\"(?:\",close:\")\"}}},globChars(r){return r===!0?PBe:F3}}});var Yd=w(yn=>{\"use strict\";var kBe=J(\"path\"),RBe=process.platform===\"win32\",{REGEX_BACKSLASH:FBe,REGEX_REMOVE_BACKSLASH:NBe,REGEX_SPECIAL_CHARS:LBe,REGEX_SPECIAL_CHARS_GLOBAL:TBe}=Gd();yn.isObject=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r);yn.hasRegexChars=r=>LBe.test(r);yn.isRegexChar=r=>r.length===1&&yn.hasRegexChars(r);yn.escapeRegex=r=>r.replace(TBe,\"\\\\$1\");yn.toPosixSlashes=r=>r.replace(FBe,\"/\");yn.removeBackslashes=r=>r.replace(NBe,e=>e===\"\\\\\"?\"\":e);yn.supportsLookbehinds=()=>{let r=process.version.slice(1).split(\".\").map(Number);return r.length===3&&r[0]>=9||r[0]===8&&r[1]>=10};yn.isWindows=r=>r&&typeof r.windows==\"boolean\"?r.windows:RBe===!0||kBe.sep===\"\\\\\";yn.escapeLast=(r,e,t)=>{let i=r.lastIndexOf(e,t);return i===-1?r:r[i-1]===\"\\\\\"?yn.escapeLast(r,e,i-1):`${r.slice(0,i)}\\\\${r.slice(i)}`};yn.removePrefix=(r,e={})=>{let t=r;return t.startsWith(\"./\")&&(t=t.slice(2),e.prefix=\"./\"),t};yn.wrapOutput=(r,e={},t={})=>{let i=t.contains?\"\":\"^\",n=t.contains?\"\":\"$\",s=`${i}(?:${r})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var G3=w((gtt,H3)=>{\"use strict\";var L3=Yd(),{CHAR_ASTERISK:Dx,CHAR_AT:OBe,CHAR_BACKWARD_SLASH:jd,CHAR_COMMA:MBe,CHAR_DOT:kx,CHAR_EXCLAMATION_MARK:Rx,CHAR_FORWARD_SLASH:K3,CHAR_LEFT_CURLY_BRACE:Fx,CHAR_LEFT_PARENTHESES:Nx,CHAR_LEFT_SQUARE_BRACKET:UBe,CHAR_PLUS:KBe,CHAR_QUESTION_MARK:T3,CHAR_RIGHT_CURLY_BRACE:HBe,CHAR_RIGHT_PARENTHESES:O3,CHAR_RIGHT_SQUARE_BRACKET:GBe}=Gd(),M3=r=>r===K3||r===jd,U3=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?1/0:1)},YBe=(r,e)=>{let t=e||{},i=r.length-1,n=t.parts===!0||t.scanToEnd===!0,s=[],o=[],a=[],l=r,c=-1,u=0,g=0,f=!1,h=!1,p=!1,C=!1,y=!1,B=!1,v=!1,D=!1,L=!1,H=!1,j=0,$,V,W={value:\"\",depth:0,isGlob:!1},_=()=>c>=i,A=()=>l.charCodeAt(c+1),Ae=()=>($=V,l.charCodeAt(++c));for(;c<i;){V=Ae();let ue;if(V===jd){v=W.backslashes=!0,V=Ae(),V===Fx&&(B=!0);continue}if(B===!0||V===Fx){for(j++;_()!==!0&&(V=Ae());){if(V===jd){v=W.backslashes=!0,Ae();continue}if(V===Fx){j++;continue}if(B!==!0&&V===kx&&(V=Ae())===kx){if(f=W.isBrace=!0,p=W.isGlob=!0,H=!0,n===!0)continue;break}if(B!==!0&&V===MBe){if(f=W.isBrace=!0,p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===HBe&&(j--,j===0)){B=!1,f=W.isBrace=!0,H=!0;break}}if(n===!0)continue;break}if(V===K3){if(s.push(c),o.push(W),W={value:\"\",depth:0,isGlob:!1},H===!0)continue;if($===kx&&c===u+1){u+=2;continue}g=c+1;continue}if(t.noext!==!0&&(V===KBe||V===OBe||V===Dx||V===T3||V===Rx)===!0&&A()===Nx){if(p=W.isGlob=!0,C=W.isExtglob=!0,H=!0,V===Rx&&c===u&&(L=!0),n===!0){for(;_()!==!0&&(V=Ae());){if(V===jd){v=W.backslashes=!0,V=Ae();continue}if(V===O3){p=W.isGlob=!0,H=!0;break}}continue}break}if(V===Dx){if($===Dx&&(y=W.isGlobstar=!0),p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===T3){if(p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===UBe){for(;_()!==!0&&(ue=Ae());){if(ue===jd){v=W.backslashes=!0,Ae();continue}if(ue===GBe){h=W.isBracket=!0,p=W.isGlob=!0,H=!0;break}}if(n===!0)continue;break}if(t.nonegate!==!0&&V===Rx&&c===u){D=W.negated=!0,u++;continue}if(t.noparen!==!0&&V===Nx){if(p=W.isGlob=!0,n===!0){for(;_()!==!0&&(V=Ae());){if(V===Nx){v=W.backslashes=!0,V=Ae();continue}if(V===O3){H=!0;break}}continue}break}if(p===!0){if(H=!0,n===!0)continue;break}}t.noext===!0&&(C=!1,p=!1);let ge=l,re=\"\",O=\"\";u>0&&(re=l.slice(0,u),l=l.slice(u),g-=u),ge&&p===!0&&g>0?(ge=l.slice(0,g),O=l.slice(g)):p===!0?(ge=\"\",O=l):ge=l,ge&&ge!==\"\"&&ge!==\"/\"&&ge!==l&&M3(ge.charCodeAt(ge.length-1))&&(ge=ge.slice(0,-1)),t.unescape===!0&&(O&&(O=L3.removeBackslashes(O)),ge&&v===!0&&(ge=L3.removeBackslashes(ge)));let F={prefix:re,input:r,start:u,base:ge,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:C,isGlobstar:y,negated:D,negatedExtglob:L};if(t.tokens===!0&&(F.maxDepth=0,M3(V)||o.push(W),F.tokens=o),t.parts===!0||t.tokens===!0){let ue;for(let pe=0;pe<s.length;pe++){let ke=ue?ue+1:u,Fe=s[pe],Ne=r.slice(ke,Fe);t.tokens&&(pe===0&&u!==0?(o[pe].isPrefix=!0,o[pe].value=re):o[pe].value=Ne,U3(o[pe]),F.maxDepth+=o[pe].depth),(pe!==0||Ne!==\"\")&&a.push(Ne),ue=Fe}if(ue&&ue+1<r.length){let pe=r.slice(ue+1);a.push(pe),t.tokens&&(o[o.length-1].value=pe,U3(o[o.length-1]),F.maxDepth+=o[o.length-1].depth)}F.slashes=s,F.parts=a}return F};H3.exports=YBe});var q3=w((ftt,j3)=>{\"use strict\";var jy=Gd(),Jn=Yd(),{MAX_LENGTH:qy,POSIX_REGEX_SOURCE:jBe,REGEX_NON_SPECIAL_CHARS:qBe,REGEX_SPECIAL_CHARS_BACKREF:JBe,REPLACEMENTS:Y3}=jy,WBe=(r,e)=>{if(typeof e.expandRange==\"function\")return e.expandRange(...r,e);r.sort();let t=`[${r.join(\"-\")}]`;try{new RegExp(t)}catch{return r.map(n=>Jn.escapeRegex(n)).join(\"..\")}return t},ff=(r,e)=>`Missing ${r}: \"${e}\" - use \"\\\\\\\\${e}\" to match literal characters`,Lx=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");r=Y3[r]||r;let t={...e},i=typeof t.maxLength==\"number\"?Math.min(qy,t.maxLength):qy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:\"bos\",value:\"\",output:t.prepend||\"\"},o=[s],a=t.capture?\"\":\"?:\",l=Jn.isWindows(e),c=jy.globChars(l),u=jy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:C,NO_DOT:y,NO_DOT_SLASH:B,NO_DOTS_SLASH:v,QMARK:D,QMARK_NO_DOT:L,STAR:H,START_ANCHOR:j}=c,$=Y=>`(${a}(?:(?!${j}${Y.dot?C:g}).)*?)`,V=t.dot?\"\":y,W=t.dot?D:L,_=t.bash===!0?$(t):H;t.capture&&(_=`(${_})`),typeof t.noext==\"boolean\"&&(t.noextglob=t.noext);let A={input:r,index:-1,start:0,dot:t.dot===!0,consumed:\"\",output:\"\",prefix:\"\",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};r=Jn.removePrefix(r,A),n=r.length;let Ae=[],ge=[],re=[],O=s,F,ue=()=>A.index===n-1,pe=A.peek=(Y=1)=>r[A.index+Y],ke=A.advance=()=>r[++A.index]||\"\",Fe=()=>r.slice(A.index+1),Ne=(Y=\"\",he=0)=>{A.consumed+=Y,A.index+=he},oe=Y=>{A.output+=Y.output!=null?Y.output:Y.value,Ne(Y.value)},le=()=>{let Y=1;for(;pe()===\"!\"&&(pe(2)!==\"(\"||pe(3)===\"?\");)ke(),A.start++,Y++;return Y%2===0?!1:(A.negated=!0,A.start++,!0)},Be=Y=>{A[Y]++,re.push(Y)},fe=Y=>{A[Y]--,re.pop()},ae=Y=>{if(O.type===\"globstar\"){let he=A.braces>0&&(Y.type===\"comma\"||Y.type===\"brace\"),ie=Y.extglob===!0||Ae.length&&(Y.type===\"pipe\"||Y.type===\"paren\");Y.type!==\"slash\"&&Y.type!==\"paren\"&&!he&&!ie&&(A.output=A.output.slice(0,-O.output.length),O.type=\"star\",O.value=\"*\",O.output=_,A.output+=O.output)}if(Ae.length&&Y.type!==\"paren\"&&(Ae[Ae.length-1].inner+=Y.value),(Y.value||Y.output)&&oe(Y),O&&O.type===\"text\"&&Y.type===\"text\"){O.value+=Y.value,O.output=(O.output||\"\")+Y.value;return}Y.prev=O,o.push(Y),O=Y},qe=(Y,he)=>{let ie={...u[he],conditions:1,inner:\"\"};ie.prev=O,ie.parens=A.parens,ie.output=A.output;let de=(t.capture?\"(\":\"\")+ie.open;Be(\"parens\"),ae({type:Y,value:he,output:A.output?\"\":p}),ae({type:\"paren\",extglob:!0,value:ke(),output:de}),Ae.push(ie)},ne=Y=>{let he=Y.close+(t.capture?\")\":\"\"),ie;if(Y.type===\"negate\"){let de=_;if(Y.inner&&Y.inner.length>1&&Y.inner.includes(\"/\")&&(de=$(t)),(de!==_||ue()||/^\\)+$/.test(Fe()))&&(he=Y.close=`)$))${de}`),Y.inner.includes(\"*\")&&(ie=Fe())&&/^\\.[^\\\\/.]+$/.test(ie)){let _e=Lx(ie,{...e,fastpaths:!1}).output;he=Y.close=`)${_e})${de})`}Y.prev.type===\"bos\"&&(A.negatedExtglob=!0)}ae({type:\"paren\",extglob:!0,value:F,output:he}),fe(\"parens\")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\\]{}\"])/.test(r)){let Y=!1,he=r.replace(JBe,(ie,de,_e,Pt,It,Or)=>Pt===\"\\\\\"?(Y=!0,ie):Pt===\"?\"?de?de+Pt+(It?D.repeat(It.length):\"\"):Or===0?W+(It?D.repeat(It.length):\"\"):D.repeat(_e.length):Pt===\".\"?g.repeat(_e.length):Pt===\"*\"?de?de+Pt+(It?_:\"\"):_:de?ie:`\\\\${ie}`);return Y===!0&&(t.unescape===!0?he=he.replace(/\\\\/g,\"\"):he=he.replace(/\\\\+/g,ie=>ie.length%2===0?\"\\\\\\\\\":ie?\"\\\\\":\"\")),he===r&&t.contains===!0?(A.output=r,A):(A.output=Jn.wrapOutput(he,A,e),A)}for(;!ue();){if(F=ke(),F===\"\\0\")continue;if(F===\"\\\\\"){let ie=pe();if(ie===\"/\"&&t.bash!==!0||ie===\".\"||ie===\";\")continue;if(!ie){F+=\"\\\\\",ae({type:\"text\",value:F});continue}let de=/^\\\\+/.exec(Fe()),_e=0;if(de&&de[0].length>2&&(_e=de[0].length,A.index+=_e,_e%2!==0&&(F+=\"\\\\\")),t.unescape===!0?F=ke():F+=ke(),A.brackets===0){ae({type:\"text\",value:F});continue}}if(A.brackets>0&&(F!==\"]\"||O.value===\"[\"||O.value===\"[^\")){if(t.posix!==!1&&F===\":\"){let ie=O.value.slice(1);if(ie.includes(\"[\")&&(O.posix=!0,ie.includes(\":\"))){let de=O.value.lastIndexOf(\"[\"),_e=O.value.slice(0,de),Pt=O.value.slice(de+2),It=jBe[Pt];if(It){O.value=_e+It,A.backtrack=!0,ke(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(F===\"[\"&&pe()!==\":\"||F===\"-\"&&pe()===\"]\")&&(F=`\\\\${F}`),F===\"]\"&&(O.value===\"[\"||O.value===\"[^\")&&(F=`\\\\${F}`),t.posix===!0&&F===\"!\"&&O.value===\"[\"&&(F=\"^\"),O.value+=F,oe({value:F});continue}if(A.quotes===1&&F!=='\"'){F=Jn.escapeRegex(F),O.value+=F,oe({value:F});continue}if(F==='\"'){A.quotes=A.quotes===1?0:1,t.keepQuotes===!0&&ae({type:\"text\",value:F});continue}if(F===\"(\"){Be(\"parens\"),ae({type:\"paren\",value:F});continue}if(F===\")\"){if(A.parens===0&&t.strictBrackets===!0)throw new SyntaxError(ff(\"opening\",\"(\"));let ie=Ae[Ae.length-1];if(ie&&A.parens===ie.parens+1){ne(Ae.pop());continue}ae({type:\"paren\",value:F,output:A.parens?\")\":\"\\\\)\"}),fe(\"parens\");continue}if(F===\"[\"){if(t.nobracket===!0||!Fe().includes(\"]\")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\"]\"));F=`\\\\${F}`}else Be(\"brackets\");ae({type:\"bracket\",value:F});continue}if(F===\"]\"){if(t.nobracket===!0||O&&O.type===\"bracket\"&&O.value.length===1){ae({type:\"text\",value:F,output:`\\\\${F}`});continue}if(A.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"opening\",\"[\"));ae({type:\"text\",value:F,output:`\\\\${F}`});continue}fe(\"brackets\");let ie=O.value.slice(1);if(O.posix!==!0&&ie[0]===\"^\"&&!ie.includes(\"/\")&&(F=`/${F}`),O.value+=F,oe({value:F}),t.literalBrackets===!1||Jn.hasRegexChars(ie))continue;let de=Jn.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),t.literalBrackets===!0){A.output+=de,O.value=de;continue}O.value=`(${a}${de}|${O.value})`,A.output+=O.value;continue}if(F===\"{\"&&t.nobrace!==!0){Be(\"braces\");let ie={type:\"brace\",value:F,output:\"(\",outputIndex:A.output.length,tokensIndex:A.tokens.length};ge.push(ie),ae(ie);continue}if(F===\"}\"){let ie=ge[ge.length-1];if(t.nobrace===!0||!ie){ae({type:\"text\",value:F,output:F});continue}let de=\")\";if(ie.dots===!0){let _e=o.slice(),Pt=[];for(let It=_e.length-1;It>=0&&(o.pop(),_e[It].type!==\"brace\");It--)_e[It].type!==\"dots\"&&Pt.unshift(_e[It].value);de=WBe(Pt,t),A.backtrack=!0}if(ie.comma!==!0&&ie.dots!==!0){let _e=A.output.slice(0,ie.outputIndex),Pt=A.tokens.slice(ie.tokensIndex);ie.value=ie.output=\"\\\\{\",F=de=\"\\\\}\",A.output=_e;for(let It of Pt)A.output+=It.output||It.value}ae({type:\"brace\",value:F,output:de}),fe(\"braces\"),ge.pop();continue}if(F===\"|\"){Ae.length>0&&Ae[Ae.length-1].conditions++,ae({type:\"text\",value:F});continue}if(F===\",\"){let ie=F,de=ge[ge.length-1];de&&re[re.length-1]===\"braces\"&&(de.comma=!0,ie=\"|\"),ae({type:\"comma\",value:F,output:ie});continue}if(F===\"/\"){if(O.type===\"dot\"&&A.index===A.start+1){A.start=A.index+1,A.consumed=\"\",A.output=\"\",o.pop(),O=s;continue}ae({type:\"slash\",value:F,output:h});continue}if(F===\".\"){if(A.braces>0&&O.type===\"dot\"){O.value===\".\"&&(O.output=g);let ie=ge[ge.length-1];O.type=\"dots\",O.output+=F,O.value+=F,ie.dots=!0;continue}if(A.braces+A.parens===0&&O.type!==\"bos\"&&O.type!==\"slash\"){ae({type:\"text\",value:F,output:g});continue}ae({type:\"dot\",value:F,output:g});continue}if(F===\"?\"){if(!(O&&O.value===\"(\")&&t.noextglob!==!0&&pe()===\"(\"&&pe(2)!==\"?\"){qe(\"qmark\",F);continue}if(O&&O.type===\"paren\"){let de=pe(),_e=F;if(de===\"<\"&&!Jn.supportsLookbehinds())throw new Error(\"Node.js v10 or higher is required for regex lookbehinds\");(O.value===\"(\"&&!/[!=<:]/.test(de)||de===\"<\"&&!/<([!=]|\\w+>)/.test(Fe()))&&(_e=`\\\\${F}`),ae({type:\"text\",value:F,output:_e});continue}if(t.dot!==!0&&(O.type===\"slash\"||O.type===\"bos\")){ae({type:\"qmark\",value:F,output:L});continue}ae({type:\"qmark\",value:F,output:D});continue}if(F===\"!\"){if(t.noextglob!==!0&&pe()===\"(\"&&(pe(2)!==\"?\"||!/[!=<:]/.test(pe(3)))){qe(\"negate\",F);continue}if(t.nonegate!==!0&&A.index===0){le();continue}}if(F===\"+\"){if(t.noextglob!==!0&&pe()===\"(\"&&pe(2)!==\"?\"){qe(\"plus\",F);continue}if(O&&O.value===\"(\"||t.regex===!1){ae({type:\"plus\",value:F,output:f});continue}if(O&&(O.type===\"bracket\"||O.type===\"paren\"||O.type===\"brace\")||A.parens>0){ae({type:\"plus\",value:F});continue}ae({type:\"plus\",value:f});continue}if(F===\"@\"){if(t.noextglob!==!0&&pe()===\"(\"&&pe(2)!==\"?\"){ae({type:\"at\",extglob:!0,value:F,output:\"\"});continue}ae({type:\"text\",value:F});continue}if(F!==\"*\"){(F===\"$\"||F===\"^\")&&(F=`\\\\${F}`);let ie=qBe.exec(Fe());ie&&(F+=ie[0],A.index+=ie[0].length),ae({type:\"text\",value:F});continue}if(O&&(O.type===\"globstar\"||O.star===!0)){O.type=\"star\",O.star=!0,O.value+=F,O.output=_,A.backtrack=!0,A.globstar=!0,Ne(F);continue}let Y=Fe();if(t.noextglob!==!0&&/^\\([^?]/.test(Y)){qe(\"star\",F);continue}if(O.type===\"star\"){if(t.noglobstar===!0){Ne(F);continue}let ie=O.prev,de=ie.prev,_e=ie.type===\"slash\"||ie.type===\"bos\",Pt=de&&(de.type===\"star\"||de.type===\"globstar\");if(t.bash===!0&&(!_e||Y[0]&&Y[0]!==\"/\")){ae({type:\"star\",value:F,output:\"\"});continue}let It=A.braces>0&&(ie.type===\"comma\"||ie.type===\"brace\"),Or=Ae.length&&(ie.type===\"pipe\"||ie.type===\"paren\");if(!_e&&ie.type!==\"paren\"&&!It&&!Or){ae({type:\"star\",value:F,output:\"\"});continue}for(;Y.slice(0,3)===\"/**\";){let ii=r[A.index+4];if(ii&&ii!==\"/\")break;Y=Y.slice(3),Ne(\"/**\",3)}if(ie.type===\"bos\"&&ue()){O.type=\"globstar\",O.value+=F,O.output=$(t),A.output=O.output,A.globstar=!0,Ne(F);continue}if(ie.type===\"slash\"&&ie.prev.type!==\"bos\"&&!Pt&&ue()){A.output=A.output.slice(0,-(ie.output+O.output).length),ie.output=`(?:${ie.output}`,O.type=\"globstar\",O.output=$(t)+(t.strictSlashes?\")\":\"|$)\"),O.value+=F,A.globstar=!0,A.output+=ie.output+O.output,Ne(F);continue}if(ie.type===\"slash\"&&ie.prev.type!==\"bos\"&&Y[0]===\"/\"){let ii=Y[1]!==void 0?\"|$\":\"\";A.output=A.output.slice(0,-(ie.output+O.output).length),ie.output=`(?:${ie.output}`,O.type=\"globstar\",O.output=`${$(t)}${h}|${h}${ii})`,O.value+=F,A.output+=ie.output+O.output,A.globstar=!0,Ne(F+ke()),ae({type:\"slash\",value:\"/\",output:\"\"});continue}if(ie.type===\"bos\"&&Y[0]===\"/\"){O.type=\"globstar\",O.value+=F,O.output=`(?:^|${h}|${$(t)}${h})`,A.output=O.output,A.globstar=!0,Ne(F+ke()),ae({type:\"slash\",value:\"/\",output:\"\"});continue}A.output=A.output.slice(0,-O.output.length),O.type=\"globstar\",O.output=$(t),O.value+=F,A.output+=O.output,A.globstar=!0,Ne(F);continue}let he={type:\"star\",value:F,output:_};if(t.bash===!0){he.output=\".*?\",(O.type===\"bos\"||O.type===\"slash\")&&(he.output=V+he.output),ae(he);continue}if(O&&(O.type===\"bracket\"||O.type===\"paren\")&&t.regex===!0){he.output=F,ae(he);continue}(A.index===A.start||O.type===\"slash\"||O.type===\"dot\")&&(O.type===\"dot\"?(A.output+=B,O.output+=B):t.dot===!0?(A.output+=v,O.output+=v):(A.output+=V,O.output+=V),pe()!==\"*\"&&(A.output+=p,O.output+=p)),ae(he)}for(;A.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\"]\"));A.output=Jn.escapeLast(A.output,\"[\"),fe(\"brackets\")}for(;A.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\")\"));A.output=Jn.escapeLast(A.output,\"(\"),fe(\"parens\")}for(;A.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\"}\"));A.output=Jn.escapeLast(A.output,\"{\"),fe(\"braces\")}if(t.strictSlashes!==!0&&(O.type===\"star\"||O.type===\"bracket\")&&ae({type:\"maybe_slash\",value:\"\",output:`${h}?`}),A.backtrack===!0){A.output=\"\";for(let Y of A.tokens)A.output+=Y.output!=null?Y.output:Y.value,Y.suffix&&(A.output+=Y.suffix)}return A};Lx.fastpaths=(r,e)=>{let t={...e},i=typeof t.maxLength==\"number\"?Math.min(qy,t.maxLength):qy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);r=Y3[r]||r;let s=Jn.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=jy.globChars(s),C=t.dot?g:u,y=t.dot?f:u,B=t.capture?\"\":\"?:\",v={negated:!1,prefix:\"\"},D=t.bash===!0?\".*?\":h;t.capture&&(D=`(${D})`);let L=V=>V.noglobstar===!0?D:`(${B}(?:(?!${p}${V.dot?c:o}).)*?)`,H=V=>{switch(V){case\"*\":return`${C}${l}${D}`;case\".*\":return`${o}${l}${D}`;case\"*.*\":return`${C}${D}${o}${l}${D}`;case\"*/*\":return`${C}${D}${a}${l}${y}${D}`;case\"**\":return C+L(t);case\"**/*\":return`(?:${C}${L(t)}${a})?${y}${l}${D}`;case\"**/*.*\":return`(?:${C}${L(t)}${a})?${y}${D}${o}${l}${D}`;case\"**/.*\":return`(?:${C}${L(t)}${a})?${o}${l}${D}`;default:{let W=/^(.*?)\\.(\\w+)$/.exec(V);if(!W)return;let _=H(W[1]);return _?_+o+W[2]:void 0}}},j=Jn.removePrefix(r,v),$=H(j);return $&&t.strictSlashes!==!0&&($+=`${a}?`),$};j3.exports=Lx});var W3=w((htt,J3)=>{\"use strict\";var zBe=J(\"path\"),VBe=G3(),Tx=q3(),Ox=Yd(),XBe=Gd(),ZBe=r=>r&&typeof r==\"object\"&&!Array.isArray(r),Yr=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>Yr(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=ZBe(r)&&r.tokens&&r.input;if(r===\"\"||typeof r!=\"string\"&&!i)throw new TypeError(\"Expected pattern to be a non-empty string\");let n=e||{},s=Ox.isWindows(e),o=i?Yr.compileRe(r,e):Yr.makeRe(r,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u={...e,ignore:null,onMatch:null,onResult:null};l=Yr(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=Yr.test(u,o,e,{glob:r,posix:s}),C={glob:r,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult==\"function\"&&n.onResult(C),f===!1?(C.isMatch=!1,g?C:!1):l(u)?(typeof n.onIgnore==\"function\"&&n.onIgnore(C),C.isMatch=!1,g?C:!1):(typeof n.onMatch==\"function\"&&n.onMatch(C),g?C:!0)};return t&&(c.state=a),c};Yr.test=(r,e,t,{glob:i,posix:n}={})=>{if(typeof r!=\"string\")throw new TypeError(\"Expected input to be a string\");if(r===\"\")return{isMatch:!1,output:\"\"};let s=t||{},o=s.format||(n?Ox.toPosixSlashes:null),a=r===i,l=a&&o?o(r):r;return a===!1&&(l=o?o(r):r,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=Yr.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Yr.matchBase=(r,e,t,i=Ox.isWindows(t))=>(e instanceof RegExp?e:Yr.makeRe(e,t)).test(zBe.basename(r));Yr.isMatch=(r,e,t)=>Yr(e,t)(r);Yr.parse=(r,e)=>Array.isArray(r)?r.map(t=>Yr.parse(t,e)):Tx(r,{...e,fastpaths:!1});Yr.scan=(r,e)=>VBe(r,e);Yr.compileRe=(r,e,t=!1,i=!1)=>{if(t===!0)return r.output;let n=e||{},s=n.contains?\"\":\"^\",o=n.contains?\"\":\"$\",a=`${s}(?:${r.output})${o}`;r&&r.negated===!0&&(a=`^(?!${a}).*$`);let l=Yr.toRegex(a,e);return i===!0&&(l.state=r),l};Yr.makeRe=(r,e={},t=!1,i=!1)=>{if(!r||typeof r!=\"string\")throw new TypeError(\"Expected a non-empty string\");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(r[0]===\".\"||r[0]===\"*\")&&(n.output=Tx.fastpaths(r,e)),n.output||(n=Tx(r,e)),Yr.compileRe(n,e,t,i)};Yr.toRegex=(r,e)=>{try{let t=e||{};return new RegExp(r,t.flags||(t.nocase?\"i\":\"\"))}catch(t){if(e&&e.debug===!0)throw t;return/$^/}};Yr.constants=XBe;J3.exports=Yr});var Mx=w((ptt,z3)=>{\"use strict\";z3.exports=W3()});var wn=w((dtt,_3)=>{\"use strict\";var X3=J(\"util\"),Z3=P3(),Uo=Mx(),Ux=Yd(),V3=r=>r===\"\"||r===\"./\",Sr=(r,e,t)=>{e=[].concat(e),r=[].concat(r);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),t&&t.onResult&&t.onResult(u)};for(let u=0;u<e.length;u++){let g=Uo(String(e[u]),{...t,onResult:a},!0),f=g.state.negated||g.state.negatedExtglob;f&&o++;for(let h of r){let p=g(h,!0);!(f?!p.isMatch:p.isMatch)||(f?i.add(p.output):(i.delete(p.output),n.add(p.output)))}}let c=(o===e.length?[...s]:[...n]).filter(u=>!i.has(u));if(t&&c.length===0){if(t.failglob===!0)throw new Error(`No matches found for \"${e.join(\", \")}\"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?e.map(u=>u.replace(/\\\\/g,\"\")):e}return c};Sr.match=Sr;Sr.matcher=(r,e)=>Uo(r,e);Sr.isMatch=(r,e,t)=>Uo(e,t)(r);Sr.any=Sr.isMatch;Sr.not=(r,e,t={})=>{e=[].concat(e).map(String);let i=new Set,n=[],o=Sr(r,e,{...t,onResult:a=>{t.onResult&&t.onResult(a),n.push(a.output)}});for(let a of n)o.includes(a)||i.add(a);return[...i]};Sr.contains=(r,e,t)=>{if(typeof r!=\"string\")throw new TypeError(`Expected a string: \"${X3.inspect(r)}\"`);if(Array.isArray(e))return e.some(i=>Sr.contains(r,i,t));if(typeof e==\"string\"){if(V3(r)||V3(e))return!1;if(r.includes(e)||r.startsWith(\"./\")&&r.slice(2).includes(e))return!0}return Sr.isMatch(r,e,{...t,contains:!0})};Sr.matchKeys=(r,e,t)=>{if(!Ux.isObject(r))throw new TypeError(\"Expected the first argument to be an object\");let i=Sr(Object.keys(r),e,t),n={};for(let s of i)n[s]=r[s];return n};Sr.some=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Uo(String(n),t);if(i.some(o=>s(o)))return!0}return!1};Sr.every=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Uo(String(n),t);if(!i.every(o=>s(o)))return!1}return!0};Sr.all=(r,e,t)=>{if(typeof r!=\"string\")throw new TypeError(`Expected a string: \"${X3.inspect(r)}\"`);return[].concat(e).every(i=>Uo(i,t)(r))};Sr.capture=(r,e,t)=>{let i=Ux.isWindows(t),s=Uo.makeRe(String(r),{...t,capture:!0}).exec(i?Ux.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?\"\":o)};Sr.makeRe=(...r)=>Uo.makeRe(...r);Sr.scan=(...r)=>Uo.scan(...r);Sr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of Z3(String(i),e))t.push(Uo.parse(n,e));return t};Sr.braces=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");return e&&e.nobrace===!0||!/\\{.*\\}/.test(r)?[r]:Z3(r,e)};Sr.braceExpand=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");return Sr.braces(r,{...e,expand:!0})};_3.exports=Sr});var e8=w((Ctt,$3)=>{\"use strict\";$3.exports=({onlyFirst:r=!1}={})=>{let e=[\"[\\\\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=><~]))\"].join(\"|\");return new RegExp(e,r?void 0:\"g\")}});var r8=w((mtt,t8)=>{\"use strict\";var _Be=e8();t8.exports=r=>typeof r==\"string\"?r.replace(_Be(),\"\"):r});var d8=w((Ptt,p8)=>{\"use strict\";p8.exports=(...r)=>[...new Set([].concat(...r))]});var sP=w((Dtt,E8)=>{\"use strict\";var u0e=J(\"stream\"),C8=u0e.PassThrough,g0e=Array.prototype.slice;E8.exports=f0e;function f0e(){let r=[],e=!1,t=g0e.call(arguments),i=t[t.length-1];i&&!Array.isArray(i)&&i.pipe==null?t.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=C8(i);function o(){for(let c=0,u=arguments.length;c<u;c++)r.push(m8(arguments[c],i));return a(),this}function a(){if(e)return;e=!0;let c=r.shift();if(!c){process.nextTick(l);return}Array.isArray(c)||(c=[c]);let u=c.length+1;function g(){--u>0||(e=!1,a())}function f(h){function p(){h.removeListener(\"merge2UnpipeEnd\",p),h.removeListener(\"end\",p),g()}if(h._readableState.endEmitted)return g();h.on(\"merge2UnpipeEnd\",p),h.on(\"end\",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h<c.length;h++)f(c[h]);g()}function l(){return e=!1,s.emit(\"queueDrain\"),n&&s.end()}return s.setMaxListeners(0),s.add=o,s.on(\"unpipe\",function(c){c.emit(\"merge2UnpipeEnd\")}),t.length&&o.apply(null,t),s}function m8(r,e){if(Array.isArray(r))for(let t=0,i=r.length;t<i;t++)r[t]=m8(r[t],e);else{if(!r._readableState&&r.pipe&&(r=r.pipe(C8(e))),!r._readableState||!r.pause||!r.pipe)throw new Error(\"Only readable stream can be merged.\");r.pause()}return r}});var I8=w(Zy=>{\"use strict\";Object.defineProperty(Zy,\"__esModule\",{value:!0});function h0e(r){return r.reduce((e,t)=>[].concat(e,t),[])}Zy.flatten=h0e;function p0e(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Zy.splitWhen=p0e});var y8=w(oP=>{\"use strict\";Object.defineProperty(oP,\"__esModule\",{value:!0});function d0e(r){return r.code===\"ENOENT\"}oP.isEnoentCodeError=d0e});var w8=w(AP=>{\"use strict\";Object.defineProperty(AP,\"__esModule\",{value:!0});var aP=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function C0e(r,e){return new aP(r,e)}AP.createDirentFromStats=C0e});var B8=w(yf=>{\"use strict\";Object.defineProperty(yf,\"__esModule\",{value:!0});var m0e=J(\"path\"),E0e=2,I0e=/(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\())/g;function y0e(r){return r.replace(/\\\\/g,\"/\")}yf.unixify=y0e;function w0e(r,e){return m0e.resolve(r,e)}yf.makeAbsolute=w0e;function B0e(r){return r.replace(I0e,\"\\\\$2\")}yf.escape=B0e;function Q0e(r){if(r.charAt(0)===\".\"){let e=r.charAt(1);if(e===\"/\"||e===\"\\\\\")return r.slice(E0e)}return r}yf.removeLeadingDotSegment=Q0e});var b8=w((Ltt,Q8)=>{Q8.exports=function(e){if(typeof e!=\"string\"||e===\"\")return!1;for(var t;t=/(\\\\).|([@?!+*]\\(.*\\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}});var x8=w((Ttt,v8)=>{var b0e=b8(),S8={\"{\":\"}\",\"(\":\")\",\"[\":\"]\"},S0e=function(r){if(r[0]===\"!\")return!0;for(var e=0,t=-2,i=-2,n=-2,s=-2,o=-2;e<r.length;){if(r[e]===\"*\"||r[e+1]===\"?\"&&/[\\].+)]/.test(r[e])||i!==-1&&r[e]===\"[\"&&r[e+1]!==\"]\"&&(i<e&&(i=r.indexOf(\"]\",e)),i>e&&(o===-1||o>i||(o=r.indexOf(\"\\\\\",e),o===-1||o>i)))||n!==-1&&r[e]===\"{\"&&r[e+1]!==\"}\"&&(n=r.indexOf(\"}\",e),n>e&&(o=r.indexOf(\"\\\\\",e),o===-1||o>n))||s!==-1&&r[e]===\"(\"&&r[e+1]===\"?\"&&/[:!=]/.test(r[e+2])&&r[e+3]!==\")\"&&(s=r.indexOf(\")\",e),s>e&&(o=r.indexOf(\"\\\\\",e),o===-1||o>s))||t!==-1&&r[e]===\"(\"&&r[e+1]!==\"|\"&&(t<e&&(t=r.indexOf(\"|\",e)),t!==-1&&r[t+1]!==\")\"&&(s=r.indexOf(\")\",t),s>t&&(o=r.indexOf(\"\\\\\",t),o===-1||o>s))))return!0;if(r[e]===\"\\\\\"){var a=r[e+1];e+=2;var l=S8[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]===\"!\")return!0}else e++}return!1},v0e=function(r){if(r[0]===\"!\")return!0;for(var e=0;e<r.length;){if(/[*?{}()[\\]]/.test(r[e]))return!0;if(r[e]===\"\\\\\"){var t=r[e+1];e+=2;var i=S8[t];if(i){var n=r.indexOf(i,e);n!==-1&&(e=n+1)}if(r[e]===\"!\")return!0}else e++}return!1};v8.exports=function(e,t){if(typeof e!=\"string\"||e===\"\")return!1;if(b0e(e))return!0;var i=S0e;return t&&t.strict===!1&&(i=v0e),i(e)}});var D8=w((Ott,P8)=>{\"use strict\";var x0e=x8(),P0e=J(\"path\").posix.dirname,D0e=J(\"os\").platform()===\"win32\",lP=\"/\",k0e=/\\\\/g,R0e=/[\\{\\[].*[\\}\\]]$/,F0e=/(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/,N0e=/\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;P8.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&D0e&&e.indexOf(lP)<0&&(e=e.replace(k0e,lP)),R0e.test(e)&&(e+=lP),e+=\"a\";do e=P0e(e);while(x0e(e)||F0e.test(e));return e.replace(N0e,\"$1\")}});var U8=w($r=>{\"use strict\";Object.defineProperty($r,\"__esModule\",{value:!0});var L0e=J(\"path\"),T0e=D8(),k8=wn(),O0e=Mx(),R8=\"**\",M0e=\"\\\\\",U0e=/[*?]|^!/,K0e=/\\[.*]/,H0e=/(?:^|[^!*+?@])\\(.*\\|.*\\)/,G0e=/[!*+?@]\\(.*\\)/,Y0e=/{.*(?:,|\\.\\.).*}/;function F8(r,e={}){return!N8(r,e)}$r.isStaticPattern=F8;function N8(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(M0e)||U0e.test(r)||K0e.test(r)||H0e.test(r)||e.extglob!==!1&&G0e.test(r)||e.braceExpansion!==!1&&Y0e.test(r))}$r.isDynamicPattern=N8;function j0e(r){return _y(r)?r.slice(1):r}$r.convertToPositivePattern=j0e;function q0e(r){return\"!\"+r}$r.convertToNegativePattern=q0e;function _y(r){return r.startsWith(\"!\")&&r[1]!==\"(\"}$r.isNegativePattern=_y;function L8(r){return!_y(r)}$r.isPositivePattern=L8;function J0e(r){return r.filter(_y)}$r.getNegativePatterns=J0e;function W0e(r){return r.filter(L8)}$r.getPositivePatterns=W0e;function z0e(r){return T0e(r,{flipBackslashes:!1})}$r.getBaseDirectory=z0e;function V0e(r){return r.includes(R8)}$r.hasGlobStar=V0e;function T8(r){return r.endsWith(\"/\"+R8)}$r.endsWithSlashGlobStar=T8;function X0e(r){let e=L0e.basename(r);return T8(r)||F8(e)}$r.isAffectDepthOfReadingPattern=X0e;function Z0e(r){return r.reduce((e,t)=>e.concat(O8(t)),[])}$r.expandPatternsWithBraceExpansion=Z0e;function O8(r){return k8.braces(r,{expand:!0,nodupes:!0})}$r.expandBraceExpansion=O8;function _0e(r,e){let t=O0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}$r.getPatternParts=_0e;function M8(r,e){return k8.makeRe(r,e)}$r.makeRe=M8;function $0e(r,e){return r.map(t=>M8(t,e))}$r.convertPatternsToRe=$0e;function eQe(r,e){return e.some(t=>t.test(r))}$r.matchAny=eQe});var H8=w(cP=>{\"use strict\";Object.defineProperty(cP,\"__esModule\",{value:!0});var tQe=sP();function rQe(r){let e=tQe(r);return r.forEach(t=>{t.once(\"error\",i=>e.emit(\"error\",i))}),e.once(\"close\",()=>K8(r)),e.once(\"end\",()=>K8(r)),e}cP.merge=rQe;function K8(r){r.forEach(e=>e.emit(\"close\"))}});var G8=w($y=>{\"use strict\";Object.defineProperty($y,\"__esModule\",{value:!0});function iQe(r){return typeof r==\"string\"}$y.isString=iQe;function nQe(r){return r===\"\"}$y.isEmpty=nQe});var Ta=w(La=>{\"use strict\";Object.defineProperty(La,\"__esModule\",{value:!0});var sQe=I8();La.array=sQe;var oQe=y8();La.errno=oQe;var aQe=w8();La.fs=aQe;var AQe=B8();La.path=AQe;var lQe=U8();La.pattern=lQe;var cQe=H8();La.stream=cQe;var uQe=G8();La.string=uQe});var W8=w(Oa=>{\"use strict\";Object.defineProperty(Oa,\"__esModule\",{value:!0});var Qc=Ta();function gQe(r,e){let t=Y8(r),i=j8(r,e.ignore),n=t.filter(l=>Qc.pattern.isStaticPattern(l,e)),s=t.filter(l=>Qc.pattern.isDynamicPattern(l,e)),o=uP(n,i,!1),a=uP(s,i,!0);return o.concat(a)}Oa.generate=gQe;function uP(r,e,t){let i=q8(r);return\".\"in i?[gP(\".\",r,e,t)]:J8(i,e,t)}Oa.convertPatternsToTasks=uP;function Y8(r){return Qc.pattern.getPositivePatterns(r)}Oa.getPositivePatterns=Y8;function j8(r,e){return Qc.pattern.getNegativePatterns(r).concat(e).map(Qc.pattern.convertToPositivePattern)}Oa.getNegativePatternsAsPositive=j8;function q8(r){let e={};return r.reduce((t,i)=>{let n=Qc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Oa.groupPatternsByBaseDirectory=q8;function J8(r,e,t){return Object.keys(r).map(i=>gP(i,r[i],e,t))}Oa.convertPatternGroupsToTasks=J8;function gP(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(Qc.pattern.convertToNegativePattern))}}Oa.convertPatternGroupToTask=gP});var V8=w(ew=>{\"use strict\";Object.defineProperty(ew,\"__esModule\",{value:!0});ew.read=void 0;function fQe(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){z8(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){fP(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){z8(t,s);return}fP(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),fP(t,o)})})}ew.read=fQe;function z8(r,e){r(e)}function fP(r,e){r(null,e)}});var X8=w(tw=>{\"use strict\";Object.defineProperty(tw,\"__esModule\",{value:!0});tw.read=void 0;function hQe(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.followSymbolicLink)return t;try{let i=e.fs.statSync(r);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return t;throw i}}tw.read=hQe});var Z8=w(KA=>{\"use strict\";Object.defineProperty(KA,\"__esModule\",{value:!0});KA.createFileSystemAdapter=KA.FILE_SYSTEM_ADAPTER=void 0;var rw=J(\"fs\");KA.FILE_SYSTEM_ADAPTER={lstat:rw.lstat,stat:rw.stat,lstatSync:rw.lstatSync,statSync:rw.statSync};function pQe(r){return r===void 0?KA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},KA.FILE_SYSTEM_ADAPTER),r)}KA.createFileSystemAdapter=pQe});var _8=w(pP=>{\"use strict\";Object.defineProperty(pP,\"__esModule\",{value:!0});var dQe=Z8(),hP=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=dQe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return e!=null?e:t}};pP.default=hP});var bc=w(HA=>{\"use strict\";Object.defineProperty(HA,\"__esModule\",{value:!0});HA.statSync=HA.stat=HA.Settings=void 0;var $8=V8(),CQe=X8(),dP=_8();HA.Settings=dP.default;function mQe(r,e,t){if(typeof e==\"function\"){$8.read(r,CP(),e);return}$8.read(r,CP(e),t)}HA.stat=mQe;function EQe(r,e){let t=CP(e);return CQe.read(r,t)}HA.statSync=EQe;function CP(r={}){return r instanceof dP.default?r:new dP.default(r)}});var t4=w((ztt,e4)=>{e4.exports=IQe;function IQe(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=Object.keys(r),t={},i=n.length);function o(l){function c(){e&&e(l,t),e=null}s?process.nextTick(c):c()}function a(l,c,u){t[l]=u,(--i===0||c)&&o(c)}i?n?n.forEach(function(l){r[l](function(c,u){a(l,c,u)})}):r.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var mP=w(nw=>{\"use strict\";Object.defineProperty(nw,\"__esModule\",{value:!0});nw.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var iw=process.versions.node.split(\".\");if(iw[0]===void 0||iw[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var r4=Number.parseInt(iw[0],10),yQe=Number.parseInt(iw[1],10),i4=10,wQe=10,BQe=r4>i4,QQe=r4===i4&&yQe>=wQe;nw.IS_SUPPORT_READDIR_WITH_FILE_TYPES=BQe||QQe});var n4=w(sw=>{\"use strict\";Object.defineProperty(sw,\"__esModule\",{value:!0});sw.createDirentFromStats=void 0;var EP=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function bQe(r,e){return new EP(r,e)}sw.createDirentFromStats=bQe});var IP=w(ow=>{\"use strict\";Object.defineProperty(ow,\"__esModule\",{value:!0});ow.fs=void 0;var SQe=n4();ow.fs=SQe});var yP=w(aw=>{\"use strict\";Object.defineProperty(aw,\"__esModule\",{value:!0});aw.joinPathSegments=void 0;function vQe(r,e,t){return r.endsWith(t)?r+e:r+t+e}aw.joinPathSegments=vQe});var c4=w(GA=>{\"use strict\";Object.defineProperty(GA,\"__esModule\",{value:!0});GA.readdir=GA.readdirWithFileTypes=GA.read=void 0;var xQe=bc(),s4=t4(),PQe=mP(),o4=IP(),a4=yP();function DQe(r,e,t){if(!e.stats&&PQe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){A4(r,e,t);return}l4(r,e,t)}GA.read=DQe;function A4(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null){Aw(t,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:a4.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){wP(t,s);return}let o=s.map(a=>kQe(a,e));s4(o,(a,l)=>{if(a!==null){Aw(t,a);return}wP(t,l)})})}GA.readdirWithFileTypes=A4;function kQe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);return}e.fs.stat(r.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){t(i);return}t(null,r);return}r.dirent=o4.fs.createDirentFromStats(r.name,n),t(null,r)})}}function l4(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Aw(t,i);return}let s=n.map(o=>{let a=a4.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{xQe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:o4.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});s4(s,(o,a)=>{if(o!==null){Aw(t,o);return}wP(t,a)})})}GA.readdir=l4;function Aw(r,e){r(e)}function wP(r,e){r(null,e)}});var p4=w(YA=>{\"use strict\";Object.defineProperty(YA,\"__esModule\",{value:!0});YA.readdir=YA.readdirWithFileTypes=YA.read=void 0;var RQe=bc(),FQe=mP(),u4=IP(),g4=yP();function NQe(r,e){return!e.stats&&FQe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?f4(r,e):h4(r,e)}YA.read=NQe;function f4(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:g4.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=u4.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}YA.readdirWithFileTypes=f4;function h4(r,e){return e.fs.readdirSync(r).map(i=>{let n=g4.joinPathSegments(r,i,e.pathSegmentSeparator),s=RQe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:u4.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}YA.readdir=h4});var d4=w(jA=>{\"use strict\";Object.defineProperty(jA,\"__esModule\",{value:!0});jA.createFileSystemAdapter=jA.FILE_SYSTEM_ADAPTER=void 0;var wf=J(\"fs\");jA.FILE_SYSTEM_ADAPTER={lstat:wf.lstat,stat:wf.stat,lstatSync:wf.lstatSync,statSync:wf.statSync,readdir:wf.readdir,readdirSync:wf.readdirSync};function LQe(r){return r===void 0?jA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},jA.FILE_SYSTEM_ADAPTER),r)}jA.createFileSystemAdapter=LQe});var C4=w(QP=>{\"use strict\";Object.defineProperty(QP,\"__esModule\",{value:!0});var TQe=J(\"path\"),OQe=bc(),MQe=d4(),BP=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=MQe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,TQe.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new OQe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};QP.default=BP});var lw=w(qA=>{\"use strict\";Object.defineProperty(qA,\"__esModule\",{value:!0});qA.Settings=qA.scandirSync=qA.scandir=void 0;var m4=c4(),UQe=p4(),bP=C4();qA.Settings=bP.default;function KQe(r,e,t){if(typeof e==\"function\"){m4.read(r,SP(),e);return}m4.read(r,SP(e),t)}qA.scandir=KQe;function HQe(r,e){let t=SP(e);return UQe.read(r,t)}qA.scandirSync=HQe;function SP(r={}){return r instanceof bP.default?r:new bP.default(r)}});var I4=w((nrt,E4)=>{\"use strict\";function GQe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.next:(e=new r,t=e),s.next=null,s}function n(s){t.next=s,t=s}return{get:i,release:n}}E4.exports=GQe});var w4=w((srt,vP)=>{\"use strict\";var YQe=I4();function y4(r,e,t){if(typeof r==\"function\"&&(t=e,e=r,r=null),t<1)throw new Error(\"fastqueue concurrency must be greater than 1\");var i=YQe(jQe),n=null,s=null,o=0,a=null,l={push:C,drain:Is,saturated:Is,pause:u,paused:!1,concurrency:t,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Is,kill:v,killAndDrain:D,error:L};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var H=n,j=0;H;)H=H.next,j++;return j}function f(){for(var H=n,j=[];H;)j.push(H.value),H=H.next;return j}function h(){if(!!l.paused){l.paused=!1;for(var H=0;H<l.concurrency;H++)o++,B()}}function p(){return o===0&&l.length()===0}function C(H,j){var $=i.get();$.context=r,$.release=B,$.value=H,$.callback=j||Is,$.errorHandler=a,o===l.concurrency||l.paused?s?(s.next=$,s=$):(n=$,s=$,l.saturated()):(o++,e.call(r,$.value,$.worked))}function y(H,j){var $=i.get();$.context=r,$.release=B,$.value=H,$.callback=j||Is,o===l.concurrency||l.paused?n?($.next=n,n=$):(n=$,s=$,l.saturated()):(o++,e.call(r,$.value,$.worked))}function B(H){H&&i.release(H);var j=n;j?l.paused?o--:(s===n&&(s=null),n=j.next,j.next=null,e.call(r,j.value,j.worked),s===null&&l.empty()):--o===0&&l.drain()}function v(){n=null,s=null,l.drain=Is}function D(){n=null,s=null,l.drain(),l.drain=Is}function L(H){a=H}}function Is(){}function jQe(){this.value=null,this.callback=Is,this.next=null,this.release=Is,this.context=null,this.errorHandler=null;var r=this;this.worked=function(t,i){var n=r.callback,s=r.errorHandler,o=r.value;r.value=null,r.callback=Is,r.errorHandler&&s(t,o),n.call(r.context,t,i),r.release(r)}}function qQe(r,e,t){typeof r==\"function\"&&(t=e,e=r,r=null);function i(u,g){e.call(this,u).then(function(f){g(null,f)},g)}var n=y4(r,i,t),s=n.push,o=n.unshift;return n.push=a,n.unshift=l,n.drained=c,n;function a(u){var g=new Promise(function(f,h){s(u,function(p,C){if(p){h(p);return}f(C)})});return g.catch(Is),g}function l(u){var g=new Promise(function(f,h){o(u,function(p,C){if(p){h(p);return}f(C)})});return g.catch(Is),g}function c(){var u=n.drain,g=new Promise(function(f){n.drain=function(){u(),f()}});return g}}vP.exports=y4;vP.exports.promise=qQe});var cw=w(Go=>{\"use strict\";Object.defineProperty(Go,\"__esModule\",{value:!0});Go.joinPathSegments=Go.replacePathSegmentSeparator=Go.isAppliedFilter=Go.isFatalError=void 0;function JQe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Go.isFatalError=JQe;function WQe(r,e){return r===null||r(e)}Go.isAppliedFilter=WQe;function zQe(r,e){return r.split(/[/\\\\]/).join(e)}Go.replacePathSegmentSeparator=zQe;function VQe(r,e,t){return r===\"\"?e:r.endsWith(t)?r+e:r+t+e}Go.joinPathSegments=VQe});var DP=w(PP=>{\"use strict\";Object.defineProperty(PP,\"__esModule\",{value:!0});var XQe=cw(),xP=class{constructor(e,t){this._root=e,this._settings=t,this._root=XQe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};PP.default=xP});var FP=w(RP=>{\"use strict\";Object.defineProperty(RP,\"__esModule\",{value:!0});var ZQe=J(\"events\"),_Qe=lw(),$Qe=w4(),uw=cw(),ebe=DP(),kP=class extends ebe.default{constructor(e,t){super(e,t),this._settings=t,this._scandir=_Qe.scandir,this._emitter=new ZQe.EventEmitter,this._queue=$Qe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit(\"end\")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error(\"The reader is already destroyed\");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on(\"entry\",e)}onError(e){this._emitter.once(\"error\",e)}onEnd(e){this._emitter.once(\"end\",e)}_pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){t(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);t(null,void 0)})}_handleError(e){this._isDestroyed||!uw.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit(\"error\",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=e.path;t!==void 0&&(e.path=uw.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),uw.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&uw.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit(\"entry\",e)}};RP.default=kP});var B4=w(LP=>{\"use strict\";Object.defineProperty(LP,\"__esModule\",{value:!0});var tbe=FP(),NP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new tbe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{rbe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{ibe(e,[...this._storage])}),this._reader.read()}};LP.default=NP;function rbe(r,e){r(e)}function ibe(r,e){r(null,e)}});var Q4=w(OP=>{\"use strict\";Object.defineProperty(OP,\"__esModule\",{value:!0});var nbe=J(\"stream\"),sbe=FP(),TP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new sbe.default(this._root,this._settings),this._stream=new nbe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit(\"error\",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};OP.default=TP});var b4=w(UP=>{\"use strict\";Object.defineProperty(UP,\"__esModule\",{value:!0});var obe=lw(),gw=cw(),abe=DP(),MP=class extends abe.default{constructor(){super(...arguments),this._scandir=obe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,t)}catch(i){this._handleError(i)}}_handleError(e){if(!!gw.isFatalError(this._settings,e))throw e}_handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=gw.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),gw.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&gw.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};UP.default=MP});var S4=w(HP=>{\"use strict\";Object.defineProperty(HP,\"__esModule\",{value:!0});var Abe=b4(),KP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Abe.default(this._root,this._settings)}read(){return this._reader.read()}};HP.default=KP});var v4=w(YP=>{\"use strict\";Object.defineProperty(YP,\"__esModule\",{value:!0});var lbe=J(\"path\"),cbe=lw(),GP=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,lbe.sep),this.fsScandirSettings=new cbe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};YP.default=GP});var qP=w(Yo=>{\"use strict\";Object.defineProperty(Yo,\"__esModule\",{value:!0});Yo.Settings=Yo.walkStream=Yo.walkSync=Yo.walk=void 0;var x4=B4(),ube=Q4(),gbe=S4(),jP=v4();Yo.Settings=jP.default;function fbe(r,e,t){if(typeof e==\"function\"){new x4.default(r,fw()).read(e);return}new x4.default(r,fw(e)).read(t)}Yo.walk=fbe;function hbe(r,e){let t=fw(e);return new gbe.default(r,t).read()}Yo.walkSync=hbe;function pbe(r,e){let t=fw(e);return new ube.default(r,t).read()}Yo.walkStream=pbe;function fw(r={}){return r instanceof jP.default?r:new jP.default(r)}});var zP=w(WP=>{\"use strict\";Object.defineProperty(WP,\"__esModule\",{value:!0});var dbe=J(\"path\"),Cbe=bc(),P4=Ta(),JP=class{constructor(e){this._settings=e,this._fsStatSettings=new Cbe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return dbe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:P4.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!P4.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};WP.default=JP});var ZP=w(XP=>{\"use strict\";Object.defineProperty(XP,\"__esModule\",{value:!0});var mbe=J(\"stream\"),Ebe=bc(),Ibe=qP(),ybe=zP(),VP=class extends ybe.default{constructor(){super(...arguments),this._walkStream=Ibe.walkStream,this._stat=Ebe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new mbe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],t).then(l=>{l!==null&&t.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;s<i.length;s++)n.write(s);return n}_getEntry(e,t,i){return this._getStat(e).then(n=>this._makeEntry(n,t)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?t(s):i(n))})}};XP.default=VP});var D4=w($P=>{\"use strict\";Object.defineProperty($P,\"__esModule\",{value:!0});var Bf=Ta(),_P=class{constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Bf.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let t of e){let i=this._getPatternSegments(t),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:t,segments:i,sections:n})}}_getPatternSegments(e){return Bf.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Bf.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Bf.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Bf.array.splitWhen(e,t=>t.dynamic&&Bf.pattern.hasGlobStar(t.pattern))}};$P.default=_P});var k4=w(tD=>{\"use strict\";Object.defineProperty(tD,\"__esModule\",{value:!0});var wbe=D4(),eD=class extends wbe.default{match(e){let t=e.split(\"/\"),i=t.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||t.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};tD.default=eD});var R4=w(iD=>{\"use strict\";Object.defineProperty(iD,\"__esModule\",{value:!0});var hw=Ta(),Bbe=k4(),rD=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new Bbe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let t=e.filter(hw.pattern.isAffectDepthOfReadingPattern);return hw.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(t))return!1;let o=hw.path.removeLeadingDotSegment(t.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){let i=e.split(\"/\").length;return t.split(\"/\").length-(e===\"\"?0:i)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!hw.pattern.matchAny(e,t)}};iD.default=rD});var F4=w(sD=>{\"use strict\";Object.defineProperty(sD,\"__esModule\",{value:!0});var Zd=Ta(),nD=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){let i=Zd.pattern.convertPatternsToRe(e,this._micromatchOptions),n=Zd.pattern.convertPatternsToRe(t,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;let i=Zd.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,t)}_isMatchToPatterns(e,t){let i=Zd.path.removeLeadingDotSegment(e);return Zd.pattern.matchAny(i,t)}};sD.default=nD});var N4=w(aD=>{\"use strict\";Object.defineProperty(aD,\"__esModule\",{value:!0});var Qbe=Ta(),oD=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return Qbe.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};aD.default=oD});var T4=w(lD=>{\"use strict\";Object.defineProperty(lD,\"__esModule\",{value:!0});var L4=Ta(),AD=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=L4.path.makeAbsolute(this._settings.cwd,t),t=L4.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+=\"/\"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}};lD.default=AD});var pw=w(uD=>{\"use strict\";Object.defineProperty(uD,\"__esModule\",{value:!0});var bbe=J(\"path\"),Sbe=R4(),vbe=F4(),xbe=N4(),Pbe=T4(),cD=class{constructor(e){this._settings=e,this.errorFilter=new xbe.default(this._settings),this.entryFilter=new vbe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new Sbe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new Pbe.default(this._settings)}_getRootDirectory(e){return bbe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let t=e.base===\".\"?\"\":e.base;return{basePath:t,pathSegmentSeparator:\"/\",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};uD.default=cD});var O4=w(fD=>{\"use strict\";Object.defineProperty(fD,\"__esModule\",{value:!0});var Dbe=ZP(),kbe=pw(),gD=class extends kbe.default{constructor(){super(...arguments),this._reader=new Dbe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(t,e,i);a.once(\"error\",o),a.on(\"data\",l=>n.push(i.transform(l))),a.once(\"end\",()=>s(n))})}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};fD.default=gD});var M4=w(pD=>{\"use strict\";Object.defineProperty(pD,\"__esModule\",{value:!0});var Rbe=J(\"stream\"),Fbe=ZP(),Nbe=pw(),hD=class extends Nbe.default{constructor(){super(...arguments),this._reader=new Fbe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new Rbe.Readable({objectMode:!0,read:()=>{}});return n.once(\"error\",o=>s.emit(\"error\",o)).on(\"data\",o=>s.emit(\"data\",i.transform(o))).once(\"end\",()=>s.emit(\"end\")),s.once(\"close\",()=>n.destroy()),s}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};pD.default=hD});var U4=w(CD=>{\"use strict\";Object.defineProperty(CD,\"__esModule\",{value:!0});var Lbe=bc(),Tbe=qP(),Obe=zP(),dD=class extends Obe.default{constructor(){super(...arguments),this._walkSync=Tbe.walkSync,this._statSync=Lbe.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,t);o===null||!t.entryFilter(o)||i.push(o)}return i}_getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};CD.default=dD});var K4=w(ED=>{\"use strict\";Object.defineProperty(ED,\"__esModule\",{value:!0});var Mbe=U4(),Ube=pw(),mD=class extends Ube.default{constructor(){super(...arguments),this._reader=new Mbe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(t,e,i).map(i.transform)}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};ED.default=mD});var H4=w(_d=>{\"use strict\";Object.defineProperty(_d,\"__esModule\",{value:!0});var Qf=J(\"fs\"),Kbe=J(\"os\"),Hbe=Kbe.cpus().length;_d.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Qf.lstat,lstatSync:Qf.lstatSync,stat:Qf.stat,statSync:Qf.statSync,readdir:Qf.readdir,readdirSync:Qf.readdirSync};var ID=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,Hbe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return e===void 0?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},_d.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};_d.default=ID});var dw=w((Prt,Y4)=>{\"use strict\";var G4=W8(),Gbe=O4(),Ybe=M4(),jbe=K4(),yD=H4(),Sc=Ta();async function wD(r,e){bf(r);let t=BD(r,Gbe.default,e),i=await Promise.all(t);return Sc.array.flatten(i)}(function(r){function e(o,a){bf(o);let l=BD(o,jbe.default,a);return Sc.array.flatten(l)}r.sync=e;function t(o,a){bf(o);let l=BD(o,Ybe.default,a);return Sc.stream.merge(l)}r.stream=t;function i(o,a){bf(o);let l=[].concat(o),c=new yD.default(a);return G4.generate(l,c)}r.generateTasks=i;function n(o,a){bf(o);let l=new yD.default(a);return Sc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return bf(o),Sc.path.escape(o)}r.escapePath=s})(wD||(wD={}));function BD(r,e,t){let i=[].concat(r),n=new yD.default(t),s=G4.generate(i,n),o=new e(n);return s.map(o.read,o)}function bf(r){if(![].concat(r).every(i=>Sc.string.isString(i)&&!Sc.string.isEmpty(i)))throw new TypeError(\"Patterns must be a string (non empty) or an array of strings\")}Y4.exports=wD});var q4=w(vc=>{\"use strict\";var{promisify:qbe}=J(\"util\"),j4=J(\"fs\");async function QD(r,e,t){if(typeof t!=\"string\")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await qbe(j4[r])(t))[e]()}catch(i){if(i.code===\"ENOENT\")return!1;throw i}}function bD(r,e,t){if(typeof t!=\"string\")throw new TypeError(`Expected a string, got ${typeof t}`);try{return j4[r](t)[e]()}catch(i){if(i.code===\"ENOENT\")return!1;throw i}}vc.isFile=QD.bind(null,\"stat\",\"isFile\");vc.isDirectory=QD.bind(null,\"stat\",\"isDirectory\");vc.isSymlink=QD.bind(null,\"lstat\",\"isSymbolicLink\");vc.isFileSync=bD.bind(null,\"statSync\",\"isFile\");vc.isDirectorySync=bD.bind(null,\"statSync\",\"isDirectory\");vc.isSymlinkSync=bD.bind(null,\"lstatSync\",\"isSymbolicLink\")});var X4=w((krt,SD)=>{\"use strict\";var xc=J(\"path\"),J4=q4(),W4=r=>r.length>1?`{${r.join(\",\")}}`:r[0],z4=(r,e)=>{let t=r[0]===\"!\"?r.slice(1):r;return xc.isAbsolute(t)?t:xc.join(e,t)},Jbe=(r,e)=>xc.extname(r)?`**/${r}`:`**/${r}.${W4(e)}`,V4=(r,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \\`files\\` to be of type \\`Array\\` but received type \\`${typeof e.files}\\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \\`extensions\\` to be of type \\`Array\\` but received type \\`${typeof e.extensions}\\``);return e.files&&e.extensions?e.files.map(t=>xc.posix.join(r,Jbe(t,e.extensions))):e.files?e.files.map(t=>xc.posix.join(r,`**/${t}`)):e.extensions?[xc.posix.join(r,`**/*.${W4(e.extensions)}`)]:[xc.posix.join(r,\"**\")]};SD.exports=async(r,e)=>{if(e={cwd:process.cwd(),...e},typeof e.cwd!=\"string\")throw new TypeError(`Expected \\`cwd\\` to be of type \\`string\\` but received type \\`${typeof e.cwd}\\``);let t=await Promise.all([].concat(r).map(async i=>await J4.isDirectory(z4(i,e.cwd))?V4(i,e):i));return[].concat.apply([],t)};SD.exports.sync=(r,e)=>{if(e={cwd:process.cwd(),...e},typeof e.cwd!=\"string\")throw new TypeError(`Expected \\`cwd\\` to be of type \\`string\\` but received type \\`${typeof e.cwd}\\``);let t=[].concat(r).map(i=>J4.isDirectorySync(z4(i,e.cwd))?V4(i,e):i);return[].concat.apply([],t)}});var nW=w((Rrt,iW)=>{function Z4(r){return Array.isArray(r)?r:[r]}var tW=\"\",_4=\" \",vD=\"\\\\\",Wbe=/^\\s+$/,zbe=/^\\\\!/,Vbe=/^\\\\#/,Xbe=/\\r?\\n/g,Zbe=/^\\.*\\/|^\\.+$/,xD=\"/\",$4=typeof Symbol<\"u\"?Symbol.for(\"node-ignore\"):\"node-ignore\",_be=(r,e,t)=>Object.defineProperty(r,e,{value:t}),$be=/([0-z])-([0-z])/g,eSe=r=>r.replace($be,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:tW),tSe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},rSe=[[/\\\\?\\s+$/,r=>r.indexOf(\"\\\\\")===0?_4:tW],[/\\\\\\s/g,()=>_4],[/[\\\\$.|*+(){^]/g,r=>`\\\\${r}`],[/(?!\\\\)\\?/g,()=>\"[^/]\"],[/^\\//,()=>\"^\"],[/\\//g,()=>\"\\\\/\"],[/^\\^*\\\\\\*\\\\\\*\\\\\\//,()=>\"^(?:.*\\\\/)?\"],[/^(?=[^^])/,function(){return/\\/(?!$)/.test(this)?\"^\":\"(?:^|\\\\/)\"}],[/\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,(r,e,t)=>e+6<t.length?\"(?:\\\\/[^\\\\/]+)*\":\"\\\\/.+\"],[/(^|[^\\\\]+)\\\\\\*(?=.+)/g,(r,e)=>`${e}[^\\\\/]*`],[/\\\\\\\\\\\\(?=[$.|*+(){^])/g,()=>vD],[/\\\\\\\\/g,()=>vD],[/(\\\\)?\\[([^\\]/]*?)(\\\\*)($|\\])/g,(r,e,t,i,n)=>e===vD?`\\\\[${t}${tSe(i)}${n}`:n===\"]\"&&i.length%2===0?`[${eSe(t)}${i}]`:\"[]\"],[/(?:[^*])$/,r=>/\\/$/.test(r)?`${r}$`:`${r}(?=$|\\\\/$)`],[/(\\^|\\\\\\/)?\\\\\\*$/,(r,e)=>`${e?`${e}[^/]+`:\"[^/]*\"}(?=$|\\\\/$)`]],eW=Object.create(null),iSe=(r,e)=>{let t=eW[r];return t||(t=rSe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),eW[r]=t),e?new RegExp(t,\"i\"):new RegExp(t)},kD=r=>typeof r==\"string\",nSe=r=>r&&kD(r)&&!Wbe.test(r)&&r.indexOf(\"#\")!==0,sSe=r=>r.split(Xbe),PD=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},oSe=(r,e)=>{let t=r,i=!1;r.indexOf(\"!\")===0&&(i=!0,r=r.substr(1)),r=r.replace(zbe,\"!\").replace(Vbe,\"#\");let n=iSe(r,e);return new PD(t,r,i,n)},aSe=(r,e)=>{throw new e(r)},Ma=(r,e,t)=>kD(r)?r?Ma.isNotRelative(r)?t(`path should be a \\`path.relative()\\`d string, but got \"${e}\"`,RangeError):!0:t(\"path must not be empty\",TypeError):t(`path must be a string, but got \\`${e}\\``,TypeError),rW=r=>Zbe.test(r);Ma.isNotRelative=rW;Ma.convert=r=>r;var DD=class{constructor({ignorecase:e=!0}={}){_be(this,$4,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[$4]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(nSe(e)){let t=oSe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,Z4(kD(e)?sSe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!t)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,t,i,n){let s=e&&Ma.convert(e);return Ma(s,e,aSe),this._t(s,t,i,n)}_t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(xD)),n.pop(),!n.length)return t[e]=this._testOne(e,i);let s=this._t(n.join(xD)+xD,t,i,n);return t[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return Z4(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},Cw=r=>new DD(r),ASe=()=>!1,lSe=r=>Ma(r&&Ma.convert(r),r,ASe);Cw.isPathValid=lSe;Cw.default=Cw;iW.exports=Cw;if(typeof process<\"u\"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform===\"win32\")){let r=t=>/^\\\\\\\\\\?\\\\/.test(t)||/[\"<>|\\u0000-\\u001F]+/u.test(t)?t:t.replace(/\\\\/g,\"/\");Ma.convert=r;let e=/^[a-z]:\\//i;Ma.isNotRelative=t=>e.test(t)||rW(t)}});var oW=w((Frt,sW)=>{\"use strict\";sW.exports=r=>{let e=/^\\\\\\\\\\?\\\\/.test(r),t=/[^\\u0000-\\u0080]+/.test(r);return e||t?r:r.replace(/\\\\/g,\"/\")}});var fW=w((Nrt,RD)=>{\"use strict\";var{promisify:cSe}=J(\"util\"),aW=J(\"fs\"),Ua=J(\"path\"),AW=dw(),uSe=nW(),$d=oW(),lW=[\"**/node_modules/**\",\"**/flow-typed/**\",\"**/coverage/**\",\"**/.git\"],gSe=cSe(aW.readFile),fSe=r=>e=>e.startsWith(\"!\")?\"!\"+Ua.posix.join(r,e.slice(1)):Ua.posix.join(r,e),hSe=(r,e)=>{let t=$d(Ua.relative(e.cwd,Ua.dirname(e.fileName)));return r.split(/\\r?\\n/).filter(Boolean).filter(i=>!i.startsWith(\"#\")).map(fSe(t))},cW=r=>{let e=uSe();for(let t of r)e.add(hSe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},pSe=(r,e)=>{if(r=$d(r),Ua.isAbsolute(e)){if($d(e).startsWith(r))return e;throw new Error(`Path ${e} is not in cwd ${r}`)}return Ua.join(r,e)},uW=(r,e)=>t=>r.ignores($d(Ua.relative(e,pSe(e,t.path||t)))),dSe=async(r,e)=>{let t=Ua.join(e,r),i=await gSe(t,\"utf8\");return{cwd:e,filePath:t,content:i}},CSe=(r,e)=>{let t=Ua.join(e,r),i=aW.readFileSync(t,\"utf8\");return{cwd:e,filePath:t,content:i}},gW=({ignore:r=[],cwd:e=$d(process.cwd())}={})=>({ignore:r,cwd:e});RD.exports=async r=>{r=gW(r);let e=await AW(\"**/.gitignore\",{ignore:lW.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>dSe(n,r.cwd))),i=cW(t);return uW(i,r.cwd)};RD.exports.sync=r=>{r=gW(r);let t=AW.sync(\"**/.gitignore\",{ignore:lW.concat(r.ignore),cwd:r.cwd}).map(n=>CSe(n,r.cwd)),i=cW(t);return uW(i,r.cwd)}});var pW=w((Lrt,hW)=>{\"use strict\";var{Transform:mSe}=J(\"stream\"),mw=class extends mSe{constructor(){super({objectMode:!0})}},FD=class extends mw{constructor(e){super(),this._filter=e}_transform(e,t,i){this._filter(e)&&this.push(e),i()}},ND=class extends mw{constructor(){super(),this._pushed=new Set}_transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};hW.exports={FilterStream:FD,UniqueStream:ND}});var MD=w((Trt,Pc)=>{\"use strict\";var CW=J(\"fs\"),Ew=d8(),ESe=sP(),Iw=dw(),yw=X4(),LD=fW(),{FilterStream:ISe,UniqueStream:ySe}=pW(),mW=()=>!1,dW=r=>r[0]===\"!\",wSe=r=>{if(!r.every(e=>typeof e==\"string\"))throw new TypeError(\"Patterns must be a string or an array of strings\")},BSe=(r={})=>{if(!r.cwd)return;let e;try{e=CW.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error(\"The `cwd` option must be a path to a directory\")},QSe=r=>r.stats instanceof CW.Stats?r.path:r,ww=(r,e)=>{r=Ew([].concat(r)),wSe(r),BSe(e);let t=[];e={ignore:[],expandDirectories:!0,...e};for(let[i,n]of r.entries()){if(dW(n))continue;let s=r.slice(i).filter(a=>dW(a)).map(a=>a.slice(1)),o={...e,ignore:e.ignore.concat(s)};t.push({pattern:n,options:o})}return t},bSe=(r,e)=>{let t={};return r.options.cwd&&(t.cwd=r.options.cwd),Array.isArray(r.options.expandDirectories)?t={...t,files:r.options.expandDirectories}:typeof r.options.expandDirectories==\"object\"&&(t={...t,...r.options.expandDirectories}),e(r.pattern,t)},TD=(r,e)=>r.options.expandDirectories?bSe(r,e):[r.pattern],EW=r=>r&&r.gitignore?LD.sync({cwd:r.cwd,ignore:r.ignore}):mW,OD=r=>e=>{let{options:t}=r;return t.ignore&&Array.isArray(t.ignore)&&t.expandDirectories&&(t.ignore=yw.sync(t.ignore)),{pattern:e,options:t}};Pc.exports=async(r,e)=>{let t=ww(r,e),i=async()=>e&&e.gitignore?LD({cwd:e.cwd,ignore:e.ignore}):mW,n=async()=>{let l=await Promise.all(t.map(async c=>{let u=await TD(c,yw);return Promise.all(u.map(OD(c)))}));return Ew(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>Iw(l.pattern,l.options)));return Ew(...a).filter(l=>!s(QSe(l)))};Pc.exports.sync=(r,e)=>{let t=ww(r,e),i=[];for(let o of t){let a=TD(o,yw.sync).map(OD(o));i.push(...a)}let n=EW(e),s=[];for(let o of i)s=Ew(s,Iw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Pc.exports.stream=(r,e)=>{let t=ww(r,e),i=[];for(let a of t){let l=TD(a,yw.sync).map(OD(a));i.push(...l)}let n=EW(e),s=new ISe(a=>!n(a)),o=new ySe;return ESe(i.map(a=>Iw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Pc.exports.generateGlobTasks=ww;Pc.exports.hasMagic=(r,e)=>[].concat(r).some(t=>Iw.isDynamicPattern(t,e));Pc.exports.gitignore=LD});var Sn=w(($rt,NW)=>{function MSe(r){var e=typeof r;return r!=null&&(e==\"object\"||e==\"function\")}NW.exports=MSe});var WD=w((eit,LW)=>{var USe=typeof global==\"object\"&&global&&global.Object===Object&&global;LW.exports=USe});var ys=w((tit,TW)=>{var KSe=WD(),HSe=typeof self==\"object\"&&self&&self.Object===Object&&self,GSe=KSe||HSe||Function(\"return this\")();TW.exports=GSe});var MW=w((rit,OW)=>{var YSe=ys(),jSe=function(){return YSe.Date.now()};OW.exports=jSe});var KW=w((iit,UW)=>{var qSe=/\\s/;function JSe(r){for(var e=r.length;e--&&qSe.test(r.charAt(e)););return e}UW.exports=JSe});var GW=w((nit,HW)=>{var WSe=KW(),zSe=/^\\s+/;function VSe(r){return r&&r.slice(0,WSe(r)+1).replace(zSe,\"\")}HW.exports=VSe});var Rc=w((sit,YW)=>{var XSe=ys(),ZSe=XSe.Symbol;YW.exports=ZSe});var WW=w((oit,JW)=>{var jW=Rc(),qW=Object.prototype,_Se=qW.hasOwnProperty,$Se=qW.toString,uC=jW?jW.toStringTag:void 0;function eve(r){var e=_Se.call(r,uC),t=r[uC];try{r[uC]=void 0;var i=!0}catch{}var n=$Se.call(r);return i&&(e?r[uC]=t:delete r[uC]),n}JW.exports=eve});var VW=w((ait,zW)=>{var tve=Object.prototype,rve=tve.toString;function ive(r){return rve.call(r)}zW.exports=ive});var Fc=w((Ait,_W)=>{var XW=Rc(),nve=WW(),sve=VW(),ove=\"[object Null]\",ave=\"[object Undefined]\",ZW=XW?XW.toStringTag:void 0;function Ave(r){return r==null?r===void 0?ave:ove:ZW&&ZW in Object(r)?nve(r):sve(r)}_W.exports=Ave});var Jo=w((lit,$W)=>{function lve(r){return r!=null&&typeof r==\"object\"}$W.exports=lve});var gC=w((cit,ez)=>{var cve=Fc(),uve=Jo(),gve=\"[object Symbol]\";function fve(r){return typeof r==\"symbol\"||uve(r)&&cve(r)==gve}ez.exports=fve});var nz=w((uit,iz)=>{var hve=GW(),tz=Sn(),pve=gC(),rz=0/0,dve=/^[-+]0x[0-9a-f]+$/i,Cve=/^0b[01]+$/i,mve=/^0o[0-7]+$/i,Eve=parseInt;function Ive(r){if(typeof r==\"number\")return r;if(pve(r))return rz;if(tz(r)){var e=typeof r.valueOf==\"function\"?r.valueOf():r;r=tz(e)?e+\"\":e}if(typeof r!=\"string\")return r===0?r:+r;r=hve(r);var t=Cve.test(r);return t||mve.test(r)?Eve(r.slice(2),t?2:8):dve.test(r)?rz:+r}iz.exports=Ive});var az=w((git,oz)=>{var yve=Sn(),zD=MW(),sz=nz(),wve=\"Expected a function\",Bve=Math.max,Qve=Math.min;function bve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!=\"function\")throw new TypeError(wve);e=sz(e)||0,yve(t)&&(u=!!t.leading,g=\"maxWait\"in t,s=g?Bve(sz(t.maxWait)||0,e):s,f=\"trailing\"in t?!!t.trailing:f);function h(j){var $=i,V=n;return i=n=void 0,c=j,o=r.apply(V,$),o}function p(j){return c=j,a=setTimeout(B,e),u?h(j):o}function C(j){var $=j-l,V=j-c,W=e-$;return g?Qve(W,s-V):W}function y(j){var $=j-l,V=j-c;return l===void 0||$>=e||$<0||g&&V>=s}function B(){var j=zD();if(y(j))return v(j);a=setTimeout(B,C(j))}function v(j){return a=void 0,f&&i?h(j):(i=n=void 0,o)}function D(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function L(){return a===void 0?o:v(zD())}function H(){var j=zD(),$=y(j);if(i=arguments,n=this,l=j,$){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(B,e),h(l)}return a===void 0&&(a=setTimeout(B,e)),o}return H.cancel=D,H.flush=L,H}oz.exports=bve});var lz=w((fit,Az)=>{var Sve=az(),vve=Sn(),xve=\"Expected a function\";function Pve(r,e,t){var i=!0,n=!0;if(typeof r!=\"function\")throw new TypeError(xve);return vve(t)&&(i=\"leading\"in t?!!t.leading:i,n=\"trailing\"in t?!!t.trailing:n),Sve(r,e,{leading:i,maxWait:e,trailing:n})}Az.exports=Pve});var Ga=w((Ha,jw)=>{\"use strict\";Object.defineProperty(Ha,\"__esModule\",{value:!0});var mz=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"BigInt64Array\",\"BigUint64Array\"];function Gve(r){return mz.includes(r)}var Yve=[\"Function\",\"Generator\",\"AsyncGenerator\",\"GeneratorFunction\",\"AsyncGeneratorFunction\",\"AsyncFunction\",\"Observable\",\"Array\",\"Buffer\",\"Object\",\"RegExp\",\"Date\",\"Error\",\"Map\",\"Set\",\"WeakMap\",\"WeakSet\",\"ArrayBuffer\",\"SharedArrayBuffer\",\"DataView\",\"Promise\",\"URL\",\"FormData\",\"URLSearchParams\",\"HTMLElement\",...mz];function jve(r){return Yve.includes(r)}var qve=[\"null\",\"undefined\",\"string\",\"number\",\"bigint\",\"boolean\",\"symbol\"];function Jve(r){return qve.includes(r)}function Tf(r){return e=>typeof e===r}var{toString:Ez}=Object.prototype,CC=r=>{let e=Ez.call(r).slice(8,-1);if(/HTML\\w+Element/.test(e)&&X.domElement(r))return\"HTMLElement\";if(jve(e))return e},lr=r=>e=>CC(e)===r;function X(r){if(r===null)return\"null\";switch(typeof r){case\"undefined\":return\"undefined\";case\"string\":return\"string\";case\"number\":return\"number\";case\"boolean\":return\"boolean\";case\"function\":return\"Function\";case\"bigint\":return\"bigint\";case\"symbol\":return\"symbol\";default:}if(X.observable(r))return\"Observable\";if(X.array(r))return\"Array\";if(X.buffer(r))return\"Buffer\";let e=CC(r);if(e)return e;if(r instanceof String||r instanceof Boolean||r instanceof Number)throw new TypeError(\"Please don't use object wrappers for primitive types\");return\"Object\"}X.undefined=Tf(\"undefined\");X.string=Tf(\"string\");var Wve=Tf(\"number\");X.number=r=>Wve(r)&&!X.nan(r);X.bigint=Tf(\"bigint\");X.function_=Tf(\"function\");X.null_=r=>r===null;X.class_=r=>X.function_(r)&&r.toString().startsWith(\"class \");X.boolean=r=>r===!0||r===!1;X.symbol=Tf(\"symbol\");X.numericString=r=>X.string(r)&&!X.emptyStringOrWhitespace(r)&&!Number.isNaN(Number(r));X.array=(r,e)=>Array.isArray(r)?X.function_(e)?r.every(e):!0:!1;X.buffer=r=>{var e,t,i,n;return(n=(i=(t=(e=r)===null||e===void 0?void 0:e.constructor)===null||t===void 0?void 0:t.isBuffer)===null||i===void 0?void 0:i.call(t,r))!==null&&n!==void 0?n:!1};X.nullOrUndefined=r=>X.null_(r)||X.undefined(r);X.object=r=>!X.null_(r)&&(typeof r==\"object\"||X.function_(r));X.iterable=r=>{var e;return X.function_((e=r)===null||e===void 0?void 0:e[Symbol.iterator])};X.asyncIterable=r=>{var e;return X.function_((e=r)===null||e===void 0?void 0:e[Symbol.asyncIterator])};X.generator=r=>X.iterable(r)&&X.function_(r.next)&&X.function_(r.throw);X.asyncGenerator=r=>X.asyncIterable(r)&&X.function_(r.next)&&X.function_(r.throw);X.nativePromise=r=>lr(\"Promise\")(r);var zve=r=>{var e,t;return X.function_((e=r)===null||e===void 0?void 0:e.then)&&X.function_((t=r)===null||t===void 0?void 0:t.catch)};X.promise=r=>X.nativePromise(r)||zve(r);X.generatorFunction=lr(\"GeneratorFunction\");X.asyncGeneratorFunction=r=>CC(r)===\"AsyncGeneratorFunction\";X.asyncFunction=r=>CC(r)===\"AsyncFunction\";X.boundFunction=r=>X.function_(r)&&!r.hasOwnProperty(\"prototype\");X.regExp=lr(\"RegExp\");X.date=lr(\"Date\");X.error=lr(\"Error\");X.map=r=>lr(\"Map\")(r);X.set=r=>lr(\"Set\")(r);X.weakMap=r=>lr(\"WeakMap\")(r);X.weakSet=r=>lr(\"WeakSet\")(r);X.int8Array=lr(\"Int8Array\");X.uint8Array=lr(\"Uint8Array\");X.uint8ClampedArray=lr(\"Uint8ClampedArray\");X.int16Array=lr(\"Int16Array\");X.uint16Array=lr(\"Uint16Array\");X.int32Array=lr(\"Int32Array\");X.uint32Array=lr(\"Uint32Array\");X.float32Array=lr(\"Float32Array\");X.float64Array=lr(\"Float64Array\");X.bigInt64Array=lr(\"BigInt64Array\");X.bigUint64Array=lr(\"BigUint64Array\");X.arrayBuffer=lr(\"ArrayBuffer\");X.sharedArrayBuffer=lr(\"SharedArrayBuffer\");X.dataView=lr(\"DataView\");X.directInstanceOf=(r,e)=>Object.getPrototypeOf(r)===e.prototype;X.urlInstance=r=>lr(\"URL\")(r);X.urlString=r=>{if(!X.string(r))return!1;try{return new URL(r),!0}catch{return!1}};X.truthy=r=>Boolean(r);X.falsy=r=>!r;X.nan=r=>Number.isNaN(r);X.primitive=r=>X.null_(r)||Jve(typeof r);X.integer=r=>Number.isInteger(r);X.safeInteger=r=>Number.isSafeInteger(r);X.plainObject=r=>{if(Ez.call(r)!==\"[object Object]\")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};X.typedArray=r=>Gve(CC(r));var Vve=r=>X.safeInteger(r)&&r>=0;X.arrayLike=r=>!X.nullOrUndefined(r)&&!X.function_(r)&&Vve(r.length);X.inRange=(r,e)=>{if(X.number(e))return r>=Math.min(0,e)&&r<=Math.max(e,0);if(X.array(e)&&e.length===2)return r>=Math.min(...e)&&r<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Xve=1,Zve=[\"innerHTML\",\"ownerDocument\",\"style\",\"attributes\",\"nodeValue\"];X.domElement=r=>X.object(r)&&r.nodeType===Xve&&X.string(r.nodeName)&&!X.plainObject(r)&&Zve.every(e=>e in r);X.observable=r=>{var e,t,i,n;return r?r===((t=(e=r)[Symbol.observable])===null||t===void 0?void 0:t.call(e))||r===((n=(i=r)[\"@@observable\"])===null||n===void 0?void 0:n.call(i)):!1};X.nodeStream=r=>X.object(r)&&X.function_(r.pipe)&&!X.observable(r);X.infinite=r=>r===1/0||r===-1/0;var Iz=r=>e=>X.integer(e)&&Math.abs(e%2)===r;X.evenInteger=Iz(0);X.oddInteger=Iz(1);X.emptyArray=r=>X.array(r)&&r.length===0;X.nonEmptyArray=r=>X.array(r)&&r.length>0;X.emptyString=r=>X.string(r)&&r.length===0;X.nonEmptyString=r=>X.string(r)&&r.length>0;var _ve=r=>X.string(r)&&!/\\S/.test(r);X.emptyStringOrWhitespace=r=>X.emptyString(r)||_ve(r);X.emptyObject=r=>X.object(r)&&!X.map(r)&&!X.set(r)&&Object.keys(r).length===0;X.nonEmptyObject=r=>X.object(r)&&!X.map(r)&&!X.set(r)&&Object.keys(r).length>0;X.emptySet=r=>X.set(r)&&r.size===0;X.nonEmptySet=r=>X.set(r)&&r.size>0;X.emptyMap=r=>X.map(r)&&r.size===0;X.nonEmptyMap=r=>X.map(r)&&r.size>0;X.propertyKey=r=>X.any([X.string,X.number,X.symbol],r);X.formData=r=>lr(\"FormData\")(r);X.urlSearchParams=r=>lr(\"URLSearchParams\")(r);var yz=(r,e,t)=>{if(!X.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(t.length===0)throw new TypeError(\"Invalid number of values\");return r.call(t,e)};X.any=(r,...e)=>(X.array(r)?r:[r]).some(i=>yz(Array.prototype.some,i,e));X.all=(r,...e)=>yz(Array.prototype.every,r,e);var Ye=(r,e,t,i={})=>{if(!r){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(t.map(o=>`\\`${X(o)}\\``))].join(\", \")}`:`received value of type \\`${X(t)}\\``;throw new TypeError(`Expected value which is \\`${e}\\`, ${s}.`)}};Ha.assert={undefined:r=>Ye(X.undefined(r),\"undefined\",r),string:r=>Ye(X.string(r),\"string\",r),number:r=>Ye(X.number(r),\"number\",r),bigint:r=>Ye(X.bigint(r),\"bigint\",r),function_:r=>Ye(X.function_(r),\"Function\",r),null_:r=>Ye(X.null_(r),\"null\",r),class_:r=>Ye(X.class_(r),\"Class\",r),boolean:r=>Ye(X.boolean(r),\"boolean\",r),symbol:r=>Ye(X.symbol(r),\"symbol\",r),numericString:r=>Ye(X.numericString(r),\"string with a number\",r),array:(r,e)=>{Ye(X.array(r),\"Array\",r),e&&r.forEach(e)},buffer:r=>Ye(X.buffer(r),\"Buffer\",r),nullOrUndefined:r=>Ye(X.nullOrUndefined(r),\"null or undefined\",r),object:r=>Ye(X.object(r),\"Object\",r),iterable:r=>Ye(X.iterable(r),\"Iterable\",r),asyncIterable:r=>Ye(X.asyncIterable(r),\"AsyncIterable\",r),generator:r=>Ye(X.generator(r),\"Generator\",r),asyncGenerator:r=>Ye(X.asyncGenerator(r),\"AsyncGenerator\",r),nativePromise:r=>Ye(X.nativePromise(r),\"native Promise\",r),promise:r=>Ye(X.promise(r),\"Promise\",r),generatorFunction:r=>Ye(X.generatorFunction(r),\"GeneratorFunction\",r),asyncGeneratorFunction:r=>Ye(X.asyncGeneratorFunction(r),\"AsyncGeneratorFunction\",r),asyncFunction:r=>Ye(X.asyncFunction(r),\"AsyncFunction\",r),boundFunction:r=>Ye(X.boundFunction(r),\"Function\",r),regExp:r=>Ye(X.regExp(r),\"RegExp\",r),date:r=>Ye(X.date(r),\"Date\",r),error:r=>Ye(X.error(r),\"Error\",r),map:r=>Ye(X.map(r),\"Map\",r),set:r=>Ye(X.set(r),\"Set\",r),weakMap:r=>Ye(X.weakMap(r),\"WeakMap\",r),weakSet:r=>Ye(X.weakSet(r),\"WeakSet\",r),int8Array:r=>Ye(X.int8Array(r),\"Int8Array\",r),uint8Array:r=>Ye(X.uint8Array(r),\"Uint8Array\",r),uint8ClampedArray:r=>Ye(X.uint8ClampedArray(r),\"Uint8ClampedArray\",r),int16Array:r=>Ye(X.int16Array(r),\"Int16Array\",r),uint16Array:r=>Ye(X.uint16Array(r),\"Uint16Array\",r),int32Array:r=>Ye(X.int32Array(r),\"Int32Array\",r),uint32Array:r=>Ye(X.uint32Array(r),\"Uint32Array\",r),float32Array:r=>Ye(X.float32Array(r),\"Float32Array\",r),float64Array:r=>Ye(X.float64Array(r),\"Float64Array\",r),bigInt64Array:r=>Ye(X.bigInt64Array(r),\"BigInt64Array\",r),bigUint64Array:r=>Ye(X.bigUint64Array(r),\"BigUint64Array\",r),arrayBuffer:r=>Ye(X.arrayBuffer(r),\"ArrayBuffer\",r),sharedArrayBuffer:r=>Ye(X.sharedArrayBuffer(r),\"SharedArrayBuffer\",r),dataView:r=>Ye(X.dataView(r),\"DataView\",r),urlInstance:r=>Ye(X.urlInstance(r),\"URL\",r),urlString:r=>Ye(X.urlString(r),\"string with a URL\",r),truthy:r=>Ye(X.truthy(r),\"truthy\",r),falsy:r=>Ye(X.falsy(r),\"falsy\",r),nan:r=>Ye(X.nan(r),\"NaN\",r),primitive:r=>Ye(X.primitive(r),\"primitive\",r),integer:r=>Ye(X.integer(r),\"integer\",r),safeInteger:r=>Ye(X.safeInteger(r),\"integer\",r),plainObject:r=>Ye(X.plainObject(r),\"plain object\",r),typedArray:r=>Ye(X.typedArray(r),\"TypedArray\",r),arrayLike:r=>Ye(X.arrayLike(r),\"array-like\",r),domElement:r=>Ye(X.domElement(r),\"HTMLElement\",r),observable:r=>Ye(X.observable(r),\"Observable\",r),nodeStream:r=>Ye(X.nodeStream(r),\"Node.js Stream\",r),infinite:r=>Ye(X.infinite(r),\"infinite number\",r),emptyArray:r=>Ye(X.emptyArray(r),\"empty array\",r),nonEmptyArray:r=>Ye(X.nonEmptyArray(r),\"non-empty array\",r),emptyString:r=>Ye(X.emptyString(r),\"empty string\",r),nonEmptyString:r=>Ye(X.nonEmptyString(r),\"non-empty string\",r),emptyStringOrWhitespace:r=>Ye(X.emptyStringOrWhitespace(r),\"empty string or whitespace\",r),emptyObject:r=>Ye(X.emptyObject(r),\"empty object\",r),nonEmptyObject:r=>Ye(X.nonEmptyObject(r),\"non-empty object\",r),emptySet:r=>Ye(X.emptySet(r),\"empty set\",r),nonEmptySet:r=>Ye(X.nonEmptySet(r),\"non-empty set\",r),emptyMap:r=>Ye(X.emptyMap(r),\"empty map\",r),nonEmptyMap:r=>Ye(X.nonEmptyMap(r),\"non-empty map\",r),propertyKey:r=>Ye(X.propertyKey(r),\"PropertyKey\",r),formData:r=>Ye(X.formData(r),\"FormData\",r),urlSearchParams:r=>Ye(X.urlSearchParams(r),\"URLSearchParams\",r),evenInteger:r=>Ye(X.evenInteger(r),\"even integer\",r),oddInteger:r=>Ye(X.oddInteger(r),\"odd integer\",r),directInstanceOf:(r,e)=>Ye(X.directInstanceOf(r,e),\"T\",r),inRange:(r,e)=>Ye(X.inRange(r,e),\"in range\",r),any:(r,...e)=>Ye(X.any(r,...e),\"predicate returns truthy for any value\",e,{multipleValues:!0}),all:(r,...e)=>Ye(X.all(r,...e),\"predicate returns truthy for all values\",e,{multipleValues:!0})};Object.defineProperties(X,{class:{value:X.class_},function:{value:X.function_},null:{value:X.null_}});Object.defineProperties(Ha.assert,{class:{value:Ha.assert.class_},function:{value:Ha.assert.function_},null:{value:Ha.assert.null_}});Ha.default=X;jw.exports=X;jw.exports.default=X;jw.exports.assert=Ha.assert});var wz=w((_it,dk)=>{\"use strict\";var qw=class extends Error{constructor(e){super(e||\"Promise was canceled\"),this.name=\"CancelError\"}get isCanceled(){return!0}},Of=class{static fn(e){return(...t)=>new Of((i,n,s)=>{t.push(s),e(...t).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,i)=>{this._reject=i;let n=a=>{this._isPending=!1,t(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error(\"The `onCancel` handler was attached after the promise settled.\");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let t of this._cancelHandlers)t()}catch(t){this._reject(t)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new qw(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Of.prototype,Promise.prototype);dk.exports=Of;dk.exports.CancelError=qw});var Bz=w((mk,Ek)=>{\"use strict\";Object.defineProperty(mk,\"__esModule\",{value:!0});var $ve=J(\"tls\"),Ck=(r,e)=>{let t;typeof e==\"function\"?t={connect:e}:t=e;let i=typeof t.connect==\"function\",n=typeof t.secureConnect==\"function\",s=typeof t.close==\"function\",o=()=>{i&&t.connect(),r instanceof $ve.TLSSocket&&n&&(r.authorized?t.secureConnect():r.authorizationError||r.once(\"secureConnect\",t.secureConnect)),s&&r.once(\"close\",t.close)};r.writable&&!r.connecting?o():r.connecting?r.once(\"connect\",o):r.destroyed&&s&&t.close(r._hadError)};mk.default=Ck;Ek.exports=Ck;Ek.exports.default=Ck});var Qz=w((yk,wk)=>{\"use strict\";Object.defineProperty(yk,\"__esModule\",{value:!0});var exe=Bz(),txe=Number(process.versions.node.split(\".\")[0]),Ik=r=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};r.timings=e;let t=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l===\"error\"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};t(r),r.prependOnceListener(\"abort\",()=>{e.abort=Date.now(),(!e.response||txe>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener(\"lookup\",a),exe.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener(\"lookup\",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};r.socket?i(r.socket):r.prependOnceListener(\"socket\",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof r.writableFinished==\"boolean\"?r.writableFinished:r.finished&&r.outputSize===0&&(!r.socket||r.socket.writableLength===0))()?n():r.prependOnceListener(\"finish\",n),r.prependOnceListener(\"response\",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,t(o),o.prependOnceListener(\"end\",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};yk.default=Ik;wk.exports=Ik;wk.exports.default=Ik});var kz=w(($it,bk)=>{\"use strict\";var{V4MAPPED:rxe,ADDRCONFIG:ixe,ALL:Dz,promises:{Resolver:bz},lookup:nxe}=J(\"dns\"),{promisify:Bk}=J(\"util\"),sxe=J(\"os\"),Mf=Symbol(\"cacheableLookupCreateConnection\"),Qk=Symbol(\"cacheableLookupInstance\"),Sz=Symbol(\"expires\"),oxe=typeof Dz==\"number\",vz=r=>{if(!(r&&typeof r.createConnection==\"function\"))throw new Error(\"Expected an Agent instance as the first argument\")},axe=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},xz=()=>{let r=!1,e=!1;for(let t of Object.values(sxe.networkInterfaces()))for(let i of t)if(!i.internal&&(i.family===\"IPv6\"?e=!0:r=!0,r&&e))return{has4:r,has6:e};return{has4:r,has6:e}},Axe=r=>Symbol.iterator in r,Pz={ttl:!0},lxe={all:!0},Jw=class{constructor({cache:e=new Map,maxTtl:t=1/0,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new bz,lookup:o=nxe}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Bk(o),this._resolver instanceof bz?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Bk(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Bk(this._resolver.resolve6.bind(this._resolver))),this._iface=xz(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,i){if(typeof t==\"function\"?(i=t,t={}):typeof t==\"number\"&&(t={family:t}),!i)throw new Error(\"Callback must be a function.\");this.lookupAsync(e,t).then(n=>{t.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,t={}){typeof t==\"number\"&&(t={family:t});let i=await this.query(e);if(t.family===6){let n=i.filter(s=>s.family===6);t.hints&rxe&&(oxe&&t.hints&Dz||n.length===0)?axe(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&ixe){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code=\"ENOTFOUND\",n.hostname=e,n}return t.all?i:i[0]}async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending[e];if(i)t=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,t=await n}}return t=t.map(i=>({...i})),t}async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code===\"ENODATA\"||u.code===\"ENOTFOUND\")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,Pz),this._resolve6(e,Pz)].map(c=>t(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t[Sz]=Date.now()+i;try{await this._cache.set(e,t,i)}catch(n){this.lookupAsync=async()=>{let s=new Error(\"Cache Error. Please recreate the CacheableLookup instance.\");throw s.cause=n,s}}Axe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,lxe);try{let t=await this._resolve(e);t.entries.length===0&&this._fallback&&(t=await this._lookup(e),t.entries.length!==0&&this._hostnamesToFallback.add(e));let i=t.entries.length===0?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,i),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){let t=this._nextRemovalTime;(!t||e<t)&&(clearTimeout(this._removalTimeout),this._nextRemovalTime=e,this._removalTimeout=setTimeout(()=>{this._nextRemovalTime=!1;let i=1/0,n=Date.now();for(let[s,o]of this._cache){let a=o[Sz];n>=a?this._cache.delete(s):a<i&&(i=a)}i!==1/0&&this._tick(i-n)},e),this._removalTimeout.unref&&this._removalTimeout.unref())}install(e){if(vz(e),Mf in e)throw new Error(\"CacheableLookup has been already installed\");e[Mf]=e.createConnection,e[Qk]=this,e.createConnection=(t,i)=>(\"lookup\"in t||(t.lookup=this.lookup),e[Mf](t,i))}uninstall(e){if(vz(e),e[Mf]){if(e[Qk]!==this)throw new Error(\"The agent is not owned by this CacheableLookup instance\");e.createConnection=e[Mf],delete e[Mf],delete e[Qk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=xz(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};bk.exports=Jw;bk.exports.default=Jw});var Nz=w((ent,Sk)=>{\"use strict\";var cxe=typeof URL>\"u\"?J(\"url\").URL:URL,uxe=\"text/plain\",gxe=\"us-ascii\",Rz=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),fxe=(r,{stripHash:e})=>{let t=r.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!t)throw new Error(`Invalid URL: ${r}`);let i=t[1].split(\";\"),n=t[2],s=e?\"\":t[3],o=!1;i[i.length-1]===\"base64\"&&(i.pop(),o=!0);let a=(i.shift()||\"\").toLowerCase(),c=[...i.map(u=>{let[g,f=\"\"]=u.split(\"=\").map(h=>h.trim());return g===\"charset\"&&(f=f.toLowerCase(),f===gxe)?\"\":`${g}${f?`=${f}`:\"\"}`}).filter(Boolean)];return o&&c.push(\"base64\"),(c.length!==0||a&&a!==uxe)&&c.unshift(a),`data:${c.join(\";\")},${o?n.trim():n}${s?`#${s}`:\"\"}`},Fz=(r,e)=>{if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,\"normalizeHttps\"))throw new Error(\"options.normalizeHttps is renamed to options.forceHttp\");if(Reflect.has(e,\"normalizeHttp\"))throw new Error(\"options.normalizeHttp is renamed to options.forceHttps\");if(Reflect.has(e,\"stripFragment\"))throw new Error(\"options.stripFragment is renamed to options.stripHash\");if(r=r.trim(),/^data:/i.test(r))return fxe(r,e);let t=r.startsWith(\"//\");!t&&/^\\.*\\//.test(r)||(r=r.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let n=new cxe(r);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&n.protocol===\"https:\"&&(n.protocol=\"http:\"),e.forceHttps&&n.protocol===\"http:\"&&(n.protocol=\"https:\"),e.stripAuthentication&&(n.username=\"\",n.password=\"\"),e.stripHash&&(n.hash=\"\"),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\\/{2,}/g,(s,o)=>/^(?!\\/)/g.test(o)?`${o}/`:\"/\")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split(\"/\"),o=s[s.length-1];Rz(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join(\"/\")+\"/\")}if(n.hostname&&(n.hostname=n.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.([a-z\\-\\d]{2,63})\\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Rz(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\\/$/,\"\")),r=n.toString(),(e.removeTrailingSlash||n.pathname===\"/\")&&n.hash===\"\"&&(r=r.replace(/\\/$/,\"\")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\\/\\//,\"\")),r};Sk.exports=Fz;Sk.exports.default=Fz});var Oz=w((tnt,Tz)=>{Tz.exports=Lz;function Lz(r,e){if(r&&e)return Lz(r)(e);if(typeof r!=\"function\")throw new TypeError(\"need wrapper function\");return Object.keys(r).forEach(function(i){t[i]=r[i]}),t;function t(){for(var i=new Array(arguments.length),n=0;n<i.length;n++)i[n]=arguments[n];var s=r.apply(this,i),o=i[i.length-1];return typeof s==\"function\"&&s!==o&&Object.keys(o).forEach(function(a){s[a]=o[a]}),s}}});var xk=w((rnt,vk)=>{var Mz=Oz();vk.exports=Mz(Ww);vk.exports.strict=Mz(Uz);Ww.proto=Ww(function(){Object.defineProperty(Function.prototype,\"once\",{value:function(){return Ww(this)},configurable:!0}),Object.defineProperty(Function.prototype,\"onceStrict\",{value:function(){return Uz(this)},configurable:!0})});function Ww(r){var e=function(){return e.called?e.value:(e.called=!0,e.value=r.apply(this,arguments))};return e.called=!1,e}function Uz(r){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=r.apply(this,arguments)},t=r.name||\"Function wrapped with `once`\";return e.onceError=t+\" shouldn't be called more than once\",e.called=!1,e}});var Pk=w((int,Hz)=>{var hxe=xk(),pxe=function(){},dxe=function(r){return r.setHeader&&typeof r.abort==\"function\"},Cxe=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},Kz=function(r,e,t){if(typeof e==\"function\")return Kz(r,null,e);e||(e={}),t=hxe(t||pxe);var i=r._writableState,n=r._readableState,s=e.readable||e.readable!==!1&&r.readable,o=e.writable||e.writable!==!1&&r.writable,a=function(){r.writable||l()},l=function(){o=!1,s||t.call(r)},c=function(){s=!1,o||t.call(r)},u=function(p){t.call(r,p?new Error(\"exited with error code: \"+p):null)},g=function(p){t.call(r,p)},f=function(){if(s&&!(n&&n.ended))return t.call(r,new Error(\"premature close\"));if(o&&!(i&&i.ended))return t.call(r,new Error(\"premature close\"))},h=function(){r.req.on(\"finish\",l)};return dxe(r)?(r.on(\"complete\",l),r.on(\"abort\",f),r.req?h():r.on(\"request\",h)):o&&!i&&(r.on(\"end\",a),r.on(\"close\",a)),Cxe(r)&&r.on(\"exit\",u),r.on(\"end\",c),r.on(\"finish\",l),e.error!==!1&&r.on(\"error\",g),r.on(\"close\",f),function(){r.removeListener(\"complete\",l),r.removeListener(\"abort\",f),r.removeListener(\"request\",h),r.req&&r.req.removeListener(\"finish\",l),r.removeListener(\"end\",a),r.removeListener(\"close\",a),r.removeListener(\"finish\",l),r.removeListener(\"exit\",u),r.removeListener(\"end\",c),r.removeListener(\"error\",g),r.removeListener(\"close\",f)}};Hz.exports=Kz});var jz=w((nnt,Yz)=>{var mxe=xk(),Exe=Pk(),Dk=J(\"fs\"),mC=function(){},Ixe=/^v?\\.0/.test(process.version),zw=function(r){return typeof r==\"function\"},yxe=function(r){return!Ixe||!Dk?!1:(r instanceof(Dk.ReadStream||mC)||r instanceof(Dk.WriteStream||mC))&&zw(r.close)},wxe=function(r){return r.setHeader&&zw(r.abort)},Bxe=function(r,e,t,i){i=mxe(i);var n=!1;r.on(\"close\",function(){n=!0}),Exe(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,yxe(r))return r.close(mC);if(wxe(r))return r.abort();if(zw(r.destroy))return r.destroy();i(o||new Error(\"stream was destroyed\"))}}},Gz=function(r){r()},Qxe=function(r,e){return r.pipe(e)},bxe=function(){var r=Array.prototype.slice.call(arguments),e=zw(r[r.length-1]||mC)&&r.pop()||mC;if(Array.isArray(r[0])&&(r=r[0]),r.length<2)throw new Error(\"pump requires two streams per minimum\");var t,i=r.map(function(n,s){var o=s<r.length-1,a=s>0;return Bxe(n,o,a,function(l){t||(t=l),l&&i.forEach(Gz),!o&&(i.forEach(Gz),e(t))})});return r.reduce(Qxe)};Yz.exports=bxe});var Jz=w((snt,qz)=>{\"use strict\";var{PassThrough:Sxe}=J(\"stream\");qz.exports=r=>{r={...r};let{array:e}=r,{encoding:t}=r,i=t===\"buffer\",n=!1;e?n=!(t||i):t=t||\"utf8\",i&&(t=null);let s=new Sxe({objectMode:n});t&&s.setEncoding(t);let o=0,a=[];return s.on(\"data\",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(\"\"),s.getBufferedLength=()=>o,s}});var Wz=w((ont,Uf)=>{\"use strict\";var vxe=jz(),xxe=Jz(),Vw=class extends Error{constructor(){super(\"maxBuffer exceeded\"),this.name=\"MaxBufferError\"}};async function Xw(r,e){if(!r)return Promise.reject(new Error(\"Expected a stream\"));e={maxBuffer:1/0,...e};let{maxBuffer:t}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=vxe(r,xxe(e),a=>{if(a){o(a);return}n()}),i.on(\"data\",()=>{i.getBufferedLength()>t&&o(new Vw)})}),i.getBufferedValue()}Uf.exports=Xw;Uf.exports.default=Xw;Uf.exports.buffer=(r,e)=>Xw(r,{...e,encoding:\"buffer\"});Uf.exports.array=(r,e)=>Xw(r,{...e,array:!0});Uf.exports.MaxBufferError=Vw});var Vz=w((Ant,zz)=>{\"use strict\";var Pxe=new Set([200,203,204,206,300,301,404,405,410,414,501]),Dxe=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),kxe=new Set([500,502,503,504]),Rxe={date:!0,connection:!0,\"keep-alive\":!0,\"proxy-authenticate\":!0,\"proxy-authorization\":!0,te:!0,trailer:!0,\"transfer-encoding\":!0,upgrade:!0},Fxe={\"content-length\":!0,\"content-encoding\":!0,\"transfer-encoding\":!0,\"content-range\":!0};function Tc(r){let e=parseInt(r,10);return isFinite(e)?e:0}function Nxe(r){return r?kxe.has(r.status):!0}function kk(r){let e={};if(!r)return e;let t=r.trim().split(/\\s*,\\s*/);for(let i of t){let[n,s]=i.split(/\\s*=\\s*/,2);e[n]=s===void 0?!0:s.replace(/^\"|\"$/g,\"\")}return e}function Lxe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+\"=\"+i)}if(!!e.length)return e.join(\", \")}zz.exports=class{constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,_fromObject:a}={}){if(a){this._fromObject(a);return}if(!t||!t.headers)throw Error(\"Response headers missing\");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status=\"status\"in t?t.status:200,this._resHeaders=t.headers,this._rescc=kk(t.headers[\"cache-control\"]),this._method=\"method\"in e?e.method:\"GET\",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=kk(e.headers[\"cache-control\"]),o&&\"pre-check\"in this._rescc&&\"post-check\"in this._rescc&&(delete this._rescc[\"pre-check\"],delete this._rescc[\"post-check\"],delete this._rescc[\"no-cache\"],delete this._rescc[\"no-store\"],delete this._rescc[\"must-revalidate\"],this._resHeaders=Object.assign({},this._resHeaders,{\"cache-control\":Lxe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),t.headers[\"cache-control\"]==null&&/no-cache/.test(t.headers.pragma)&&(this._rescc[\"no-cache\"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc[\"no-store\"]&&(this._method===\"GET\"||this._method===\"HEAD\"||this._method===\"POST\"&&this._hasExplicitExpiration())&&Dxe.has(this._status)&&!this._rescc[\"no-store\"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc[\"max-age\"]||this._isShared&&this._rescc[\"s-maxage\"]||this._rescc.public||Pxe.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc[\"s-maxage\"]||this._rescc[\"max-age\"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error(\"Request headers missing\")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=kk(e.headers[\"cache-control\"]);return t[\"no-cache\"]||/no-cache/.test(e.headers.pragma)||t[\"max-age\"]&&this.age()>t[\"max-age\"]||t[\"min-fresh\"]&&this.timeToLive()<1e3*t[\"min-fresh\"]||this.stale()&&!(t[\"max-stale\"]&&!this._rescc[\"must-revalidate\"]&&(t[\"max-stale\"]===!0||t[\"max-stale\"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&e.method===\"HEAD\")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc[\"must-revalidate\"]||this._rescc.public||this._rescc[\"s-maxage\"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary===\"*\")return!1;let t=this._resHeaders.vary.trim().toLowerCase().split(/\\s*,\\s*/);for(let i of t)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let t={};for(let i in e)Rxe[i]||(t[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\\s*,\\s*/);for(let n of i)delete t[n]}if(t.warning){let i=t.warning.split(/,/).filter(n=>!/^\\s*1[0-9][0-9]/.test(n));i.length?t.warning=i.join(\",\").trim():delete t.warning}return t}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:\"\")+'113 - \"rfc7234 5.5.4\"'),e.age=`${Math.round(t)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),t=(this.now()-this._responseTime)/1e3;return e+t}_ageValue(){return Tc(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc[\"no-cache\"]||this._isShared&&this._resHeaders[\"set-cookie\"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary===\"*\")return 0;if(this._isShared){if(this._rescc[\"proxy-revalidate\"])return 0;if(this._rescc[\"s-maxage\"])return Tc(this._rescc[\"s-maxage\"])}if(this._rescc[\"max-age\"])return Tc(this._rescc[\"max-age\"]);let e=this._rescc.immutable?this._immutableMinTtl:0,t=this.date();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||i<t?0:Math.max(e,(i-t)/1e3)}if(this._resHeaders[\"last-modified\"]){let i=Date.parse(this._resHeaders[\"last-modified\"]);if(isFinite(i)&&t>i)return Math.max(e,(t-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),t=e+Tc(this._rescc[\"stale-if-error\"]),i=e+Tc(this._rescc[\"stale-while-revalidate\"]);return Math.max(0,e,t,i)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Tc(this._rescc[\"stale-if-error\"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Tc(this._rescc[\"stale-while-revalidate\"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error(\"Reinitialized\");if(!e||e.v!==1)throw Error(\"Invalid serialization\");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t[\"if-range\"],!this._requestMatches(e,!0)||!this.storable())return delete t[\"if-none-match\"],delete t[\"if-modified-since\"],t;if(this._resHeaders.etag&&(t[\"if-none-match\"]=t[\"if-none-match\"]?`${t[\"if-none-match\"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),t[\"accept-ranges\"]||t[\"if-match\"]||t[\"if-unmodified-since\"]||this._method&&this._method!=\"GET\"){if(delete t[\"if-modified-since\"],t[\"if-none-match\"]){let n=t[\"if-none-match\"].split(/,/).filter(s=>!/^\\s*W\\//.test(s));n.length?t[\"if-none-match\"]=n.join(\",\").trim():delete t[\"if-none-match\"]}}else this._resHeaders[\"last-modified\"]&&!t[\"if-modified-since\"]&&(t[\"if-modified-since\"]=this._resHeaders[\"last-modified\"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Nxe(t))return{modified:!1,matches:!1,policy:this};if(!t||!t.headers)throw Error(\"Response headers missing\");let i=!1;if(t.status!==void 0&&t.status!=304?i=!1:t.headers.etag&&!/^\\s*W\\//.test(t.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?i=this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===t.headers.etag.replace(/^\\s*W\\//,\"\"):this._resHeaders[\"last-modified\"]?i=this._resHeaders[\"last-modified\"]===t.headers[\"last-modified\"]:!this._resHeaders.etag&&!this._resHeaders[\"last-modified\"]&&!t.headers.etag&&!t.headers[\"last-modified\"]&&(i=!0),!i)return{policy:new this.constructor(e,t),modified:t.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in t.headers&&!Fxe[o]?t.headers[o]:this._resHeaders[o];let s=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var Zw=w((lnt,Xz)=>{\"use strict\";Xz.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var _z=w((cnt,Zz)=>{\"use strict\";var Txe=J(\"stream\").Readable,Oxe=Zw(),Rk=class extends Txe{constructor(e,t,i,n){if(typeof e!=\"number\")throw new TypeError(\"Argument `statusCode` should be a number\");if(typeof t!=\"object\")throw new TypeError(\"Argument `headers` should be an object\");if(!(i instanceof Buffer))throw new TypeError(\"Argument `body` should be a buffer\");if(typeof n!=\"string\")throw new TypeError(\"Argument `url` should be a string\");super(),this.statusCode=e,this.headers=Oxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};Zz.exports=Rk});var e5=w((unt,$z)=>{\"use strict\";var Mxe=[\"destroy\",\"setTimeout\",\"socket\",\"headers\",\"trailers\",\"rawHeaders\",\"statusCode\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"rawTrailers\",\"statusMessage\"];$z.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(Mxe));for(let i of t)i in e||(e[i]=typeof r[i]==\"function\"?r[i].bind(r):r[i])}});var r5=w((gnt,t5)=>{\"use strict\";var Uxe=J(\"stream\").PassThrough,Kxe=e5(),Hxe=r=>{if(!(r&&r.pipe))throw new TypeError(\"Parameter `response` must be a response stream.\");let e=new Uxe;return Kxe(r,e),r.pipe(e)};t5.exports=Hxe});var i5=w(Fk=>{Fk.stringify=function r(e){if(typeof e>\"u\")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(\":base64:\"+e.toString(\"base64\"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e==\"object\"){var t=\"\",i=Array.isArray(e);t=i?\"[\":\"{\";var n=!0;for(var s in e){var o=typeof e[s]==\"function\"||!i&&typeof e[s]>\"u\";Object.hasOwnProperty.call(e,s)&&!o&&(n||(t+=\",\"),n=!1,i?e[s]==null?t+=\"null\":t+=r(e[s]):e[s]!==void 0&&(t+=r(s)+\":\"+r(e[s])))}return t+=i?\"]\":\"}\",t}else return typeof e==\"string\"?JSON.stringify(/^:/.test(e)?\":\"+e:e):typeof e>\"u\"?\"null\":JSON.stringify(e)};Fk.parse=function(r){return JSON.parse(r,function(e,t){return typeof t==\"string\"?/^:base64:/.test(t)?Buffer.from(t.substring(8),\"base64\"):/^:/.test(t)?t.substring(1):t:t})}});var o5=w((hnt,s5)=>{\"use strict\";var Gxe=J(\"events\"),n5=i5(),Yxe=r=>{let e={redis:\"@keyv/redis\",mongodb:\"@keyv/mongo\",mongo:\"@keyv/mongo\",sqlite:\"@keyv/sqlite\",postgresql:\"@keyv/postgres\",postgres:\"@keyv/postgres\",mysql:\"@keyv/mysql\"};if(r.adapter||r.uri){let t=r.adapter||/^[^:]*/.exec(r.uri)[0];return new(J(e[t]))(r)}return new Map},Nk=class extends Gxe{constructor(e,t){if(super(),this.opts=Object.assign({namespace:\"keyv\",serialize:n5.stringify,deserialize:n5.parse},typeof e==\"string\"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=Yxe(i)}typeof this.opts.store.on==\"function\"&&this.opts.store.on(\"error\",i=>this.emit(\"error\",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n==\"string\"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires==\"number\"&&Date.now()>n.expires){this.delete(e);return}return t&&t.raw?n:n.value}})}set(e,t,i){e=this._getKeyPrefix(e),typeof i>\"u\"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i==\"number\"?Date.now()+i:null;return t={value:t,expires:s},this.opts.serialize(t)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};s5.exports=Nk});var l5=w((dnt,A5)=>{\"use strict\";var jxe=J(\"events\"),_w=J(\"url\"),qxe=Nz(),Jxe=Wz(),Lk=Vz(),a5=_z(),Wxe=Zw(),zxe=r5(),Vxe=o5(),oo=class{constructor(e,t){if(typeof e!=\"function\")throw new TypeError(\"Parameter `request` must be a function\");return this.cache=new Vxe({uri:typeof t==\"string\"&&t,store:typeof t!=\"string\"&&t,namespace:\"cacheable-request\"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,i)=>{let n;if(typeof t==\"string\")n=Tk(_w.parse(t)),t={};else if(t instanceof _w.URL)n=Tk(_w.parse(t.toString())),t={};else{let[g,...f]=(t.path||\"\").split(\"?\"),h=f.length>0?`?${f.join(\"?\")}`:\"\";n=Tk({...t,pathname:g,search:h})}t={headers:{},method:\"GET\",cache:!0,strictTtl:!1,automaticFailover:!1,...t,...Xxe(n)},t.headers=Wxe(t.headers);let s=new jxe,o=qxe(_w.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${t.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),C=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let v=Lk.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!v.modified){let D=v.policy.responseHeaders();y=new a5(l.statusCode,D,l.body,l.url),y.cachePolicy=v.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new Lk(g,y,g),y.fromCache=!1);let B;g.cache&&y.cachePolicy.storable()?(B=zxe(y),(async()=>{try{let v=Jxe.buffer(y);if(await Promise.race([p,new Promise(j=>y.once(\"end\",j))]),f)return;let D=await v,L={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:D},H=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(H=H?Math.min(H,g.maxTtl):g.maxTtl),await this.cache.set(a,L,H)}catch(v){s.emit(\"error\",new oo.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit(\"error\",new oo.CacheError(v))}})(),s.emit(\"response\",B||y),typeof i==\"function\"&&i(B||y)};try{let y=e(g,C);y.once(\"error\",h),y.once(\"abort\",h),s.emit(\"request\",y)}catch(y){s.emit(\"error\",new oo.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p>\"u\")return u(h);let C=Lk.fromObject(p.cachePolicy);if(C.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=C.responseHeaders(),B=new a5(p.statusCode,y,p.body,p.url);B.cachePolicy=C,B.fromCache=!0,s.emit(\"response\",B),typeof i==\"function\"&&i(B)}else l=p,h.headers=C.revalidationHeaders(h),u(h)},f=h=>s.emit(\"error\",new oo.CacheError(h));this.cache.once(\"error\",f),s.on(\"response\",()=>this.cache.removeListener(\"error\",f));try{await g(t)}catch(h){t.automaticFailover&&!c&&u(t),s.emit(\"error\",new oo.CacheError(h))}})(),s}}};function Xxe(r){let e={...r};return e.path=`${r.pathname||\"/\"}${r.search||\"\"}`,delete e.pathname,delete e.search,e}function Tk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostname||r.host||\"localhost\",port:r.port,pathname:r.pathname,search:r.search}}oo.RequestError=class extends Error{constructor(r){super(r.message),this.name=\"RequestError\",Object.assign(this,r)}};oo.CacheError=class extends Error{constructor(r){super(r.message),this.name=\"CacheError\",Object.assign(this,r)}};A5.exports=oo});var u5=w((Ent,c5)=>{\"use strict\";var Zxe=[\"aborted\",\"complete\",\"headers\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"method\",\"rawHeaders\",\"rawTrailers\",\"setTimeout\",\"socket\",\"statusCode\",\"statusMessage\",\"trailers\",\"url\"];c5.exports=(r,e)=>{if(e._readableState.autoDestroy)throw new Error(\"The second stream must have the `autoDestroy` option set to `false`\");let t=new Set(Object.keys(r).concat(Zxe)),i={};for(let n of t)n in e||(i[n]={get(){let s=r[n];return typeof s==\"function\"?s.bind(r):s},set(s){r[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),r.once(\"aborted\",()=>{e.destroy(),e.emit(\"aborted\")}),r.once(\"close\",()=>{r.complete&&e.readable?e.once(\"end\",()=>{e.emit(\"close\")}):e.emit(\"close\")}),e}});var f5=w((Int,g5)=>{\"use strict\";var{Transform:_xe,PassThrough:$xe}=J(\"stream\"),Ok=J(\"zlib\"),ePe=u5();g5.exports=r=>{let e=(r.headers[\"content-encoding\"]||\"\").toLowerCase();if(![\"gzip\",\"deflate\",\"br\"].includes(e))return r;let t=e===\"br\";if(t&&typeof Ok.createBrotliDecompress!=\"function\")return r.destroy(new Error(\"Brotli is not supported on Node.js < 12\")),r;let i=!0,n=new _xe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new $xe({autoDestroy:!1,destroy(a,l){r.destroy(),l(a)}}),o=t?Ok.createBrotliDecompress():Ok.createUnzip();return o.once(\"error\",a=>{if(i&&!r.readable){s.end();return}s.destroy(a)}),ePe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Uk=w((ynt,h5)=>{\"use strict\";var Mk=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError(\"`maxSize` must be a number greater than 0\");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction==\"function\")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};h5.exports=Mk});var Hk=w((wnt,m5)=>{\"use strict\";var tPe=J(\"events\"),rPe=J(\"tls\"),iPe=J(\"http2\"),nPe=Uk(),sn=Symbol(\"currentStreamsCount\"),p5=Symbol(\"request\"),Bs=Symbol(\"cachedOriginSet\"),Kf=Symbol(\"gracefullyClosing\"),sPe=[\"maxDeflateDynamicTableSize\",\"maxSessionMemory\",\"maxHeaderListPairs\",\"maxOutstandingPings\",\"maxReservedRemoteStreams\",\"maxSendHeaderBlockLength\",\"paddingStrategy\",\"localAddress\",\"path\",\"rejectUnauthorized\",\"minDHSize\",\"ca\",\"cert\",\"clientCertEngine\",\"ciphers\",\"key\",\"pfx\",\"servername\",\"minVersion\",\"maxVersion\",\"secureProtocol\",\"crl\",\"honorCipherOrder\",\"ecdhCurve\",\"dhparam\",\"secureOptions\",\"sessionIdContext\"],oPe=(r,e,t)=>{let i=0,n=r.length;for(;i<n;){let s=i+n>>>1;t(r[s],e)?i=s+1:n=s}return i},aPe=(r,e)=>r.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,Kk=(r,e)=>{for(let t of r)t[Bs].length<e[Bs].length&&t[Bs].every(i=>e[Bs].includes(i))&&t[sn]+e[sn]<=e.remoteSettings.maxConcurrentStreams&&C5(t)},APe=(r,e)=>{for(let t of r)e[Bs].length<t[Bs].length&&e[Bs].every(i=>t[Bs].includes(i))&&e[sn]+t[sn]<=t.remoteSettings.maxConcurrentStreams&&C5(e)},d5=({agent:r,isFree:e})=>{let t={};for(let i in r.sessions){let s=r.sessions[i].filter(o=>{let a=o[zo.kCurrentStreamsCount]<o.remoteSettings.maxConcurrentStreams;return e?a:!a});s.length!==0&&(t[i]=s)}return t},C5=r=>{r[Kf]=!0,r[sn]===0&&r.close()},zo=class extends tPe{constructor({timeout:e=6e4,maxSessions:t=1/0,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new nPe({maxSize:n})}static normalizeOrigin(e,t){return typeof e==\"string\"&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t=\"\";if(e)for(let i of sPe)e[i]&&(t+=`:${e[i]}`);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;let i=this.queue[e][t];this._sessionsCount<this.maxSessions&&!i.completed&&(i.completed=!0,i())}getSession(e,t,i){return new Promise((n,s)=>{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(t),a=zo.normalizeOrigin(e,t&&t.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError(\"The `origin` argument needs to be a string or an URL object\"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let C=p.remoteSettings.maxConcurrentStreams;if(C<g)break;if(p[Bs].includes(a)){let y=p[sn];if(y>=C||p[Kf]||p.destroyed)continue;h||(g=C),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let C=new Error(`Expected the length of listeners to be 1, got ${i.length}.\nPlease report this to https://github.com/szmarczak/http2-wrapper/`);p(C)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=iPe.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u),...t});f[sn]=0,f[Kf]=!1;let h=()=>f[sn]<f.remoteSettings.maxConcurrentStreams,p=!0;f.socket.once(\"session\",y=>{this.tlsSessionCache.set(u,y)}),f.once(\"error\",y=>{for(let{reject:B}of i)B(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once(\"close\",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error(\"Session closed without receiving a SETTINGS frame\");y.code=\"HTTP2WRAPPER_NOSETTINGS\";for(let{reject:B}of i)B(y);l()}this._tryToCreateNewSession(o,a)});let C=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Bs])if(y in this.queue[o]){let{listeners:B}=this.queue[o][y];for(;B.length!==0&&h();)B.shift().resolve(f);let v=this.queue[o];if(v[y].listeners.length===0&&(delete v[y],Object.keys(v).length===0)){delete this.queue[o];break}if(!h())break}}};f.on(\"origin\",()=>{f[Bs]=f.originSet,h()&&(C(),Kk(this.sessions[o],f))}),f.once(\"remoteSettings\",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error(\"Agent has been destroyed\");for(let B of i)B.reject(y);f.destroy();return}f[Bs]=f.originSet;{let y=this.sessions;if(o in y){let B=y[o];B.splice(oPe(B,f,aPe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit(\"session\",f),C(),l(),f[sn]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,t,i),i.length=0),f.on(\"remoteSettings\",()=>{C(),Kk(this.sessions[o],f)})}),f[p5]=f.request,f.request=(y,B)=>{if(f[Kf])throw new Error(\"The session is gracefully closing. No new streams are allowed.\");let v=f[p5](y,B);return f.ref(),++f[sn],f[sn]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,v.once(\"close\",()=>{if(p=h(),--f[sn],!f.destroyed&&!f.closed&&(APe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let D=f[sn]===0;D&&f.unref(),D&&(this._freeSessionsCount>this.maxFreeSessions||f[Kf])?f.close():(Kk(this.sessions[o],f),C())}}),v}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,t){return zo.connect(e,t)}static connect(e,t){t.ALPNProtocols=[\"h2\"];let i=e.port||443,n=e.hostname||e.host;return typeof t.servername>\"u\"&&(t.servername=n),rPe.connect(i,n,t)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t of e)t[sn]===0&&t.close()}destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.destroy(e);for(let t of Object.values(this.queue))for(let i of Object.values(t))i.destroyed=!0;this.queue={}}get freeSessions(){return d5({agent:this,isFree:!0})}get busySessions(){return d5({agent:this,isFree:!1})}};zo.kCurrentStreamsCount=sn;zo.kGracefullyClosing=Kf;m5.exports={Agent:zo,globalAgent:new zo}});var Yk=w((Bnt,E5)=>{\"use strict\";var{Readable:lPe}=J(\"stream\"),Gk=class extends lPe{constructor(e,t){super({highWaterMark:t,autoDestroy:!1}),this.statusCode=null,this.statusMessage=\"\",this.httpVersion=\"2.0\",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners(\"data\"),this.resume())}_read(){this.req&&this.req._request.resume()}};E5.exports=Gk});var jk=w((Qnt,I5)=>{\"use strict\";I5.exports=r=>{let e={protocol:r.protocol,hostname:typeof r.hostname==\"string\"&&r.hostname.startsWith(\"[\")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||\"\"}${r.search||\"\"}`};return typeof r.port==\"string\"&&r.port.length!==0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||\"\"}:${r.password||\"\"}`),e}});var w5=w((bnt,y5)=>{\"use strict\";y5.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var Q5=w((Snt,B5)=>{\"use strict\";B5.exports=r=>{switch(r){case\":method\":case\":scheme\":case\":authority\":case\":path\":return!0;default:return!1}}});var S5=w((xnt,b5)=>{\"use strict\";var Hf=(r,e,t)=>{b5.exports[e]=class extends r{constructor(...n){super(typeof t==\"string\"?t:t(n)),this.name=`${super.name} [${e}]`,this.code=e}}};Hf(TypeError,\"ERR_INVALID_ARG_TYPE\",r=>{let e=r[0].includes(\".\")?\"property\":\"argument\",t=r[1],i=Array.isArray(t);return i&&(t=`${t.slice(0,-1).join(\", \")} or ${t.slice(-1)}`),`The \"${r[0]}\" ${e} must be ${i?\"one of\":\"of\"} type ${t}. Received ${typeof r[2]}`});Hf(TypeError,\"ERR_INVALID_PROTOCOL\",r=>`Protocol \"${r[0]}\" not supported. Expected \"${r[1]}\"`);Hf(Error,\"ERR_HTTP_HEADERS_SENT\",r=>`Cannot ${r[0]} headers after they are sent to the client`);Hf(TypeError,\"ERR_INVALID_HTTP_TOKEN\",r=>`${r[0]} must be a valid HTTP token [${r[1]}]`);Hf(TypeError,\"ERR_HTTP_INVALID_HEADER_VALUE\",r=>`Invalid value \"${r[0]} for header \"${r[1]}\"`);Hf(TypeError,\"ERR_INVALID_CHAR\",r=>`Invalid character in ${r[0]} [${r[1]}]`)});var Vk=w((Pnt,F5)=>{\"use strict\";var cPe=J(\"http2\"),{Writable:uPe}=J(\"stream\"),{Agent:v5,globalAgent:gPe}=Hk(),fPe=Yk(),hPe=jk(),pPe=w5(),dPe=Q5(),{ERR_INVALID_ARG_TYPE:qk,ERR_INVALID_PROTOCOL:CPe,ERR_HTTP_HEADERS_SENT:x5,ERR_INVALID_HTTP_TOKEN:mPe,ERR_HTTP_INVALID_HEADER_VALUE:EPe,ERR_INVALID_CHAR:IPe}=S5(),{HTTP2_HEADER_STATUS:P5,HTTP2_HEADER_METHOD:D5,HTTP2_HEADER_PATH:k5,HTTP2_METHOD_CONNECT:yPe}=cPe.constants,Ki=Symbol(\"headers\"),Jk=Symbol(\"origin\"),Wk=Symbol(\"session\"),R5=Symbol(\"options\"),$w=Symbol(\"flushedHeaders\"),EC=Symbol(\"jobs\"),wPe=/^[\\^`\\-\\w!#$%&*+.|~]+$/,BPe=/[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/,zk=class extends uPe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e==\"string\"||e instanceof URL;if(n&&(e=hPe(e instanceof URL?e:new URL(e))),typeof t==\"function\"||t===void 0?(i=t,t=n?e:{...e}):t={...e,...t},t.h2session)this[Wk]=t.h2session;else if(t.agent===!1)this.agent=new v5({maxFreeSessions:0});else if(typeof t.agent>\"u\"||t.agent===null)typeof t.createConnection==\"function\"?(this.agent=new v5({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=gPe;else if(typeof t.agent.request==\"function\")this.agent=t.agent;else throw new qk(\"options.agent\",[\"Agent-like Object\",\"undefined\",\"false\"],t.agent);if(t.protocol&&t.protocol!==\"https:\")throw new CPe(t.protocol,\"https:\");let s=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,o=t.hostname||t.host||\"localhost\";delete t.hostname,delete t.host,delete t.port;let{timeout:a}=t;if(t.timeout=void 0,this[Ki]=Object.create(null),this[EC]=[],this.socket=null,this.connection=null,this.method=t.method||\"GET\",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(let[l,c]of Object.entries(t.headers))this.setHeader(l,c);t.auth&&!(\"authorization\"in this[Ki])&&(this[Ki].authorization=\"Basic \"+Buffer.from(t.auth).toString(\"base64\")),t.session=t.tlsSession,t.path=t.socketPath,this[R5]=t,s===443?(this[Jk]=`https://${o}`,\":authority\"in this[Ki]||(this[Ki][\":authority\"]=o)):(this[Jk]=`https://${o}:${s}`,\":authority\"in this[Ki]||(this[Ki][\":authority\"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once(\"response\",i),this[$w]=!1}get method(){return this[Ki][D5]}set method(e){e&&(this[Ki][D5]=e.toUpperCase())}get path(){return this[Ki][k5]}set path(e){e&&(this[Ki][k5]=e)}get _mustNotHaveABody(){return this.method===\"GET\"||this.method===\"HEAD\"||this.method===\"DELETE\"}_write(e,t,i){if(this._mustNotHaveABody){i(new Error(\"The GET, HEAD and DELETE methods must NOT have a body\"));return}this.flushHeaders();let n=()=>this._request.write(e,t,i);this._request?n():this[EC].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?t():this[EC].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit(\"abort\")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[$w]||this.destroyed)return;this[$w]=!0;let e=this.method===yPe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||pPe(i,this,[\"timeout\",\"continue\",\"close\",\"error\"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once(\"finish\",()=>{o(...a)})};i.once(\"response\",n((o,a,l)=>{let c=new fPe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[P5],c.headers=o,c.rawHeaders=l,c.once(\"end\",()=>{this.aborted?(c.aborted=!0,c.emit(\"aborted\")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit(\"connect\",c,i,Buffer.alloc(0))?this.emit(\"close\"):i.destroy()):(i.on(\"data\",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once(\"end\",()=>{c.push(null)}),this.emit(\"response\",c)||c._dump())})),i.once(\"headers\",n(o=>this.emit(\"information\",{statusCode:o[P5]}))),i.once(\"trailers\",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[EC])o();this.emit(\"socket\",this.socket)};if(this[Wk])try{t(this[Wk].request(this[Ki]))}catch(i){this.emit(\"error\",i)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[Jk],this[R5],this[Ki]))}catch(i){this.emit(\"error\",i)}}}getHeader(e){if(typeof e!=\"string\")throw new qk(\"name\",\"string\",e);return this[Ki][e.toLowerCase()]}get headersSent(){return this[$w]}removeHeader(e){if(typeof e!=\"string\")throw new qk(\"name\",\"string\",e);if(this.headersSent)throw new x5(\"remove\");delete this[Ki][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new x5(\"set\");if(typeof e!=\"string\"||!wPe.test(e)&&!dPe(e))throw new mPe(\"Header name\",e);if(typeof t>\"u\")throw new EPe(t,e);if(BPe.test(t))throw new IPe(\"header content\",e);this[Ki][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._request?i():this[EC].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};F5.exports=zk});var L5=w((Dnt,N5)=>{\"use strict\";var QPe=J(\"tls\");N5.exports=(r={})=>new Promise((e,t)=>{let i=QPe.connect(r,()=>{r.resolveSocket?(i.off(\"error\",t),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on(\"error\",t)})});var O5=w((knt,T5)=>{\"use strict\";var bPe=J(\"net\");T5.exports=r=>{let e=r.host,t=r.headers&&r.headers.host;return t&&(t.startsWith(\"[\")?t.indexOf(\"]\")===-1?e=t:e=t.slice(1,-1):e=t.split(\":\",1)[0]),bPe.isIP(e)?\"\":e}});var K5=w((Rnt,Zk)=>{\"use strict\";var M5=J(\"http\"),Xk=J(\"https\"),SPe=L5(),vPe=Uk(),xPe=Vk(),PPe=O5(),DPe=jk(),eB=new vPe({maxSize:100}),IC=new Map,U5=(r,e,t)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{r.emit(\"free\",e,t)};e.on(\"free\",i);let n=()=>{r.removeSocket(e,t)};e.on(\"close\",n);let s=()=>{r.removeSocket(e,t),e.off(\"close\",n),e.off(\"free\",i),e.off(\"agentRemove\",s)};e.on(\"agentRemove\",s),r.emit(\"free\",e,t)},kPe=async r=>{let e=`${r.host}:${r.port}:${r.ALPNProtocols.sort()}`;if(!eB.has(e)){if(IC.has(e))return(await IC.get(e)).alpnProtocol;let{path:t,agent:i}=r;r.path=r.socketPath;let n=SPe(r);IC.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(eB.set(e,o),r.path=t,o===\"h2\")s.destroy();else{let{globalAgent:a}=Xk,l=Xk.Agent.prototype.createConnection;i?i.createConnection===l?U5(i,s,r):s.destroy():a.createConnection===l?U5(a,s,r):s.destroy()}return IC.delete(e),o}catch(s){throw IC.delete(e),s}}return eB.get(e)};Zk.exports=async(r,e,t)=>{if((typeof r==\"string\"||r instanceof URL)&&(r=DPe(new URL(r))),typeof e==\"function\"&&(t=e,e=void 0),e={ALPNProtocols:[\"h2\",\"http/1.1\"],...r,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error(\"The `ALPNProtocols` option must be an Array with at least one entry\");e.protocol=e.protocol||\"https:\";let i=e.protocol===\"https:\";e.host=e.hostname||e.host||\"localhost\",e.session=e.tlsSession,e.servername=e.servername||PPe(e),e.port=e.port||(i?443:80),e._defaultAgent=i?Xk.globalAgent:M5.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error(\"The `options.agent` object can contain only `http`, `https` or `http2` properties\");e.agent=n[i?\"https\":\"http\"]}return i&&await kPe(e)===\"h2\"?(n&&(e.agent=n.http2),new xPe(e,t)):M5.request(e,t)};Zk.exports.protocolCache=eB});var G5=w((Fnt,H5)=>{\"use strict\";var RPe=J(\"http2\"),FPe=Hk(),_k=Vk(),NPe=Yk(),LPe=K5(),TPe=(r,e,t)=>new _k(r,e,t),OPe=(r,e,t)=>{let i=new _k(r,e,t);return i.end(),i};H5.exports={...RPe,ClientRequest:_k,IncomingMessage:NPe,...FPe,request:TPe,get:OPe,auto:LPe}});var eR=w($k=>{\"use strict\";Object.defineProperty($k,\"__esModule\",{value:!0});var Y5=Ga();$k.default=r=>Y5.default.nodeStream(r)&&Y5.default.function_(r.getBoundary)});var W5=w(tR=>{\"use strict\";Object.defineProperty(tR,\"__esModule\",{value:!0});var q5=J(\"fs\"),J5=J(\"util\"),j5=Ga(),MPe=eR(),UPe=J5.promisify(q5.stat);tR.default=async(r,e)=>{if(e&&\"content-length\"in e)return Number(e[\"content-length\"]);if(!r)return 0;if(j5.default.string(r))return Buffer.byteLength(r);if(j5.default.buffer(r))return r.length;if(MPe.default(r))return J5.promisify(r.getLength.bind(r))();if(r instanceof q5.ReadStream){let{size:t}=await UPe(r.path);return t===0?void 0:t}}});var iR=w(rR=>{\"use strict\";Object.defineProperty(rR,\"__esModule\",{value:!0});function KPe(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)},r.on(n,i[n]);return()=>{for(let n of t)r.off(n,i[n])}}rR.default=KPe});var z5=w(nR=>{\"use strict\";Object.defineProperty(nR,\"__esModule\",{value:!0});nR.default=()=>{let r=[];return{once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})},unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListener(i,n)}r.length=0}}}});var X5=w(yC=>{\"use strict\";Object.defineProperty(yC,\"__esModule\",{value:!0});yC.TimeoutError=void 0;var HPe=J(\"net\"),GPe=z5(),V5=Symbol(\"reentry\"),YPe=()=>{},tB=class extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`),this.event=t,this.name=\"TimeoutError\",this.code=\"ETIMEDOUT\"}};yC.TimeoutError=tB;yC.default=(r,e,t)=>{if(V5 in r)return YPe;r[V5]=!0;let i=[],{once:n,unhandleAll:s}=GPe.default(),o=(g,f,h)=>{var p;let C=setTimeout(f,g,g,h);(p=C.unref)===null||p===void 0||p.call(C);let y=()=>{clearTimeout(C)};return i.push(y),y},{host:a,hostname:l}=t,c=(g,f)=>{r.destroy(new tB(g,f))},u=()=>{for(let g of i)g();s()};if(r.once(\"error\",g=>{if(u(),r.listenerCount(\"error\")===0)throw g}),r.once(\"close\",u),n(r,\"response\",g=>{n(g,\"end\",u)}),typeof e.request<\"u\"&&o(e.request,c,\"request\"),typeof e.socket<\"u\"){let g=()=>{c(e.socket,\"socket\")};r.setTimeout(e.socket,g),i.push(()=>{r.removeListener(\"timeout\",g)})}return n(r,\"socket\",g=>{var f;let{socketPath:h}=r;if(g.connecting){let p=Boolean(h!=null?h:HPe.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:\"\")!==0);if(typeof e.lookup<\"u\"&&!p&&typeof g.address().address>\"u\"){let C=o(e.lookup,c,\"lookup\");n(g,\"lookup\",C)}if(typeof e.connect<\"u\"){let C=()=>o(e.connect,c,\"connect\");p?n(g,\"connect\",C()):n(g,\"lookup\",y=>{y===null&&n(g,\"connect\",C())})}typeof e.secureConnect<\"u\"&&t.protocol===\"https:\"&&n(g,\"connect\",()=>{let C=o(e.secureConnect,c,\"secureConnect\");n(g,\"secureConnect\",C)})}if(typeof e.send<\"u\"){let p=()=>o(e.send,c,\"send\");g.connecting?n(g,\"connect\",()=>{n(r,\"upload-complete\",p())}):n(r,\"upload-complete\",p())}}),typeof e.response<\"u\"&&n(r,\"upload-complete\",()=>{let g=o(e.response,c,\"response\");n(r,\"response\",g)}),u}});var _5=w(sR=>{\"use strict\";Object.defineProperty(sR,\"__esModule\",{value:!0});var Z5=Ga();sR.default=r=>{r=r;let e={protocol:r.protocol,hostname:Z5.default.string(r.hostname)&&r.hostname.startsWith(\"[\")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||\"\"}${r.search||\"\"}`};return Z5.default.string(r.port)&&r.port.length>0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||\"\"}:${r.password||\"\"}`),e}});var $5=w(oR=>{\"use strict\";Object.defineProperty(oR,\"__esModule\",{value:!0});var jPe=J(\"url\"),qPe=[\"protocol\",\"host\",\"hostname\",\"port\",\"pathname\",\"search\"];oR.default=(r,e)=>{var t,i;if(e.path){if(e.pathname)throw new TypeError(\"Parameters `path` and `pathname` are mutually exclusive.\");if(e.search)throw new TypeError(\"Parameters `path` and `search` are mutually exclusive.\");if(e.searchParams)throw new TypeError(\"Parameters `path` and `searchParams` are mutually exclusive.\")}if(e.search&&e.searchParams)throw new TypeError(\"Parameters `search` and `searchParams` are mutually exclusive.\");if(!r){if(!e.protocol)throw new TypeError(\"No URL protocol specified\");r=`${e.protocol}//${(i=(t=e.hostname)!==null&&t!==void 0?t:e.host)!==null&&i!==void 0?i:\"\"}`}let n=new jPe.URL(r);if(e.path){let s=e.path.indexOf(\"?\");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of qPe)e[s]&&(n[s]=e[s].toString());return n}});var e6=w(AR=>{\"use strict\";Object.defineProperty(AR,\"__esModule\",{value:!0});var aR=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){typeof e==\"object\"?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return typeof e==\"object\"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e==\"object\"?this.weakMap.has(e):this.map.has(e)}};AR.default=aR});var cR=w(lR=>{\"use strict\";Object.defineProperty(lR,\"__esModule\",{value:!0});var JPe=async r=>{let e=[],t=0;for await(let i of r)e.push(i),t+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,t):Buffer.from(e.join(\"\"))};lR.default=JPe});var r6=w(Oc=>{\"use strict\";Object.defineProperty(Oc,\"__esModule\",{value:!0});Oc.dnsLookupIpVersionToFamily=Oc.isDnsLookupIpVersion=void 0;var t6={auto:0,ipv4:4,ipv6:6};Oc.isDnsLookupIpVersion=r=>r in t6;Oc.dnsLookupIpVersionToFamily=r=>{if(Oc.isDnsLookupIpVersion(r))return t6[r];throw new Error(\"Invalid DNS lookup IP version\")}});var uR=w(rB=>{\"use strict\";Object.defineProperty(rB,\"__esModule\",{value:!0});rB.isResponseOk=void 0;rB.isResponseOk=r=>{let{statusCode:e}=r,t=r.request.options.followRedirect?299:399;return e>=200&&e<=t||e===304}});var n6=w(gR=>{\"use strict\";Object.defineProperty(gR,\"__esModule\",{value:!0});var i6=new Set;gR.default=r=>{i6.has(r)||(i6.add(r),process.emitWarning(`Got: ${r}`,{type:\"DeprecationWarning\"}))}});var s6=w(fR=>{\"use strict\";Object.defineProperty(fR,\"__esModule\",{value:!0});var mr=Ga(),WPe=(r,e)=>{if(mr.default.null_(r.encoding))throw new TypeError(\"To get a Buffer, set `options.responseType` to `buffer` instead\");mr.assert.any([mr.default.string,mr.default.undefined],r.encoding),mr.assert.any([mr.default.boolean,mr.default.undefined],r.resolveBodyOnly),mr.assert.any([mr.default.boolean,mr.default.undefined],r.methodRewriting),mr.assert.any([mr.default.boolean,mr.default.undefined],r.isStream),mr.assert.any([mr.default.string,mr.default.undefined],r.responseType),r.responseType===void 0&&(r.responseType=\"text\");let{retry:t}=r;if(e?r.retry={...e.retry}:r.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},mr.default.object(t)?(r.retry={...r.retry,...t},r.retry.methods=[...new Set(r.retry.methods.map(i=>i.toUpperCase()))],r.retry.statusCodes=[...new Set(r.retry.statusCodes)],r.retry.errorCodes=[...new Set(r.retry.errorCodes)]):mr.default.number(t)&&(r.retry.limit=t),mr.default.undefined(r.retry.maxRetryAfter)&&(r.retry.maxRetryAfter=Math.min(...[r.timeout.request,r.timeout.connect].filter(mr.default.number))),mr.default.object(r.pagination)){e&&(r.pagination={...e.pagination,...r.pagination});let{pagination:i}=r;if(!mr.default.function_(i.transform))throw new Error(\"`options.pagination.transform` must be implemented\");if(!mr.default.function_(i.shouldContinue))throw new Error(\"`options.pagination.shouldContinue` must be implemented\");if(!mr.default.function_(i.filter))throw new TypeError(\"`options.pagination.filter` must be implemented\");if(!mr.default.function_(i.paginate))throw new Error(\"`options.pagination.paginate` must be implemented\")}return r.responseType===\"json\"&&r.headers.accept===void 0&&(r.headers.accept=\"application/json\"),r};fR.default=WPe});var o6=w(wC=>{\"use strict\";Object.defineProperty(wC,\"__esModule\",{value:!0});wC.retryAfterStatusCodes=void 0;wC.retryAfterStatusCodes=new Set([413,429,503]);var zPe=({attemptCount:r,retryOptions:e,error:t,retryAfter:i})=>{if(r>e.limit)return 0;let n=e.methods.includes(t.options.method),s=e.errorCodes.includes(t.code),o=t.response&&e.statusCodes.includes(t.response.statusCode);if(!n||!s&&!o)return 0;if(t.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(t.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(r-1)*1e3+a};wC.default=zPe});var bC=w(Yt=>{\"use strict\";Object.defineProperty(Yt,\"__esModule\",{value:!0});Yt.UnsupportedProtocolError=Yt.ReadError=Yt.TimeoutError=Yt.UploadError=Yt.CacheError=Yt.HTTPError=Yt.MaxRedirectsError=Yt.RequestError=Yt.setNonEnumerableProperties=Yt.knownHookEvents=Yt.withoutBody=Yt.kIsNormalizedAlready=void 0;var a6=J(\"util\"),A6=J(\"stream\"),VPe=J(\"fs\"),VA=J(\"url\"),l6=J(\"http\"),hR=J(\"http\"),XPe=J(\"https\"),ZPe=Qz(),_Pe=kz(),c6=l5(),$Pe=f5(),eDe=G5(),tDe=Zw(),Ee=Ga(),rDe=W5(),u6=eR(),iDe=iR(),g6=X5(),nDe=_5(),f6=$5(),sDe=e6(),oDe=cR(),h6=r6(),aDe=uR(),XA=n6(),ADe=s6(),lDe=o6(),pR,Pi=Symbol(\"request\"),sB=Symbol(\"response\"),Gf=Symbol(\"responseSize\"),Yf=Symbol(\"downloadedSize\"),jf=Symbol(\"bodySize\"),qf=Symbol(\"uploadedSize\"),iB=Symbol(\"serverResponsesPiped\"),p6=Symbol(\"unproxyEvents\"),d6=Symbol(\"isFromCache\"),dR=Symbol(\"cancelTimeouts\"),C6=Symbol(\"startedReading\"),Jf=Symbol(\"stopReading\"),nB=Symbol(\"triggerRead\"),ZA=Symbol(\"body\"),BC=Symbol(\"jobs\"),m6=Symbol(\"originalResponse\"),E6=Symbol(\"retryTimeout\");Yt.kIsNormalizedAlready=Symbol(\"isNormalizedAlready\");var cDe=Ee.default.string(process.versions.brotli);Yt.withoutBody=new Set([\"GET\",\"HEAD\"]);Yt.knownHookEvents=[\"init\",\"beforeRequest\",\"beforeRedirect\",\"beforeError\",\"beforeRetry\",\"afterResponse\"];function uDe(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee.default.number(t)&&!Ee.default.boolean(t)&&!Ee.default.null_(t)&&!Ee.default.undefined(t))throw new TypeError(`The \\`searchParams\\` value '${String(t)}' must be a string, number, boolean or null`)}}function gDe(r){return Ee.default.object(r)&&!(\"statusCode\"in r)}var CR=new sDe.default,fDe=async r=>new Promise((e,t)=>{let i=n=>{t(n)};r.pending||e(),r.once(\"error\",i),r.once(\"ready\",()=>{r.off(\"error\",i),e()})}),hDe=new Set([300,301,302,303,304,307,308]),pDe=[\"context\",\"body\",\"json\",\"form\"];Yt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of pDe)n in i&&(t[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,t)};var ei=class extends Error{constructor(e,t,i){var n;if(super(e),Error.captureStackTrace(this,this.constructor),this.name=\"RequestError\",this.code=t.code,i instanceof gB?(Object.defineProperty(this,\"request\",{enumerable:!1,value:i}),Object.defineProperty(this,\"response\",{enumerable:!1,value:i[sB]}),Object.defineProperty(this,\"options\",{enumerable:!1,value:i.options})):Object.defineProperty(this,\"options\",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ee.default.string(t.stack)&&Ee.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(`\n`).reverse(),a=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split(`\n`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(`\n`)}${a.reverse().join(`\n`)}`}}};Yt.RequestError=ei;var oB=class extends ei{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name=\"MaxRedirectsError\"}};Yt.MaxRedirectsError=oB;var aB=class extends ei{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name=\"HTTPError\"}};Yt.HTTPError=aB;var AB=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"CacheError\"}};Yt.CacheError=AB;var lB=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"UploadError\"}};Yt.UploadError=lB;var cB=class extends ei{constructor(e,t,i){super(e.message,e,i),this.name=\"TimeoutError\",this.event=e.event,this.timings=t}};Yt.TimeoutError=cB;var QC=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"ReadError\"}};Yt.ReadError=QC;var uB=class extends ei{constructor(e){super(`Unsupported protocol \"${e.url.protocol}\"`,{},e),this.name=\"UnsupportedProtocolError\"}};Yt.UnsupportedProtocolError=uB;var dDe=[\"socket\",\"connect\",\"continue\",\"information\",\"upgrade\",\"timeout\"],gB=class extends A6.Duplex{constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0}),this[Yf]=0,this[qf]=0,this.requestInitialized=!1,this[iB]=new Set,this.redirects=[],this[Jf]=!1,this[nB]=!1,this[BC]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on(\"pipe\",c=>{c.prependListener(\"data\",n),c.on(\"data\",s),c.prependListener(\"end\",n),c.on(\"end\",s)}),this.on(\"unpipe\",c=>{c.off(\"data\",n),c.off(\"data\",s),c.off(\"end\",n),c.off(\"end\",s)}),this.on(\"pipe\",c=>{c instanceof hR.IncomingMessage&&(this.options.headers={...c.headers,...this.options.headers})});let{json:o,body:a,form:l}=t;if((o||a||l)&&this._lockWrite(),Yt.kIsNormalizedAlready in t)this.options=t;else try{this.options=this.constructor.normalizeArguments(e,t,i)}catch(c){Ee.default.nodeStream(t.body)&&t.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof VPe.ReadStream&&await fDe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError(\"Missing `url` property\");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Pi])===null||c===void 0||c.destroy();return}for(let g of this[BC])g();this[BC].length=0,this.requestInitialized=!0}catch(u){if(u instanceof ei){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.object(e)&&!Ee.default.urlInstance(e))t={...i,...e,...t};else{if(e&&t&&t.url!==void 0)throw new TypeError(\"The `url` option is mutually exclusive with the `input` argument\");t={...i,...t},e!==void 0&&(t.url=e),Ee.default.urlInstance(t.url)&&(t.url=new VA.URL(t.url.toString()))}if(t.cache===!1&&(t.cache=void 0),t.dnsCache===!1&&(t.dnsCache=void 0),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.method),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.headers),Ee.assert.any([Ee.default.string,Ee.default.urlInstance,Ee.default.undefined],t.prefixUrl),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cookieJar),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.searchParams),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.cache),Ee.assert.any([Ee.default.object,Ee.default.number,Ee.default.undefined],t.timeout),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.context),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.hooks),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.decompress),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.ignoreInvalidCookies),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.followRedirect),Ee.assert.any([Ee.default.number,Ee.default.undefined],t.maxRedirects),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.throwHttpErrors),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.http2),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.allowGetBody),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.localAddress),Ee.assert.any([h6.isDnsLookupIpVersion,Ee.default.undefined],t.dnsLookupIpVersion),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.https),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.rejectUnauthorized),t.https&&(Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.https.rejectUnauthorized),Ee.assert.any([Ee.default.function_,Ee.default.undefined],t.https.checkServerIdentity),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificateAuthority),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.key),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificate),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.https.passphrase),Ee.assert.any([Ee.default.string,Ee.default.buffer,Ee.default.array,Ee.default.undefined],t.https.pfx)),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cacheOptions),Ee.default.string(t.method)?t.method=t.method.toUpperCase():t.method=\"GET\",t.headers===(i==null?void 0:i.headers)?t.headers={...t.headers}:t.headers=tDe({...i==null?void 0:i.headers,...t.headers}),\"slashes\"in t)throw new TypeError(\"The legacy `url.Url` has been deprecated. Use `URL` instead.\");if(\"auth\"in t)throw new TypeError(\"Parameter `auth` is deprecated. Use `username` / `password` instead.\");if(\"searchParams\"in t&&t.searchParams&&t.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ee.default.string(t.searchParams)||t.searchParams instanceof VA.URLSearchParams)h=new VA.URLSearchParams(t.searchParams);else{uDe(t.searchParams),h=new VA.URLSearchParams;for(let p in t.searchParams){let C=t.searchParams[p];C===null?h.append(p,\"\"):C!==void 0&&h.append(p,C)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,C)=>{h.has(C)||h.append(C,p)}),t.searchParams=h}if(t.username=(s=t.username)!==null&&s!==void 0?s:\"\",t.password=(o=t.password)!==null&&o!==void 0?o:\"\",Ee.default.undefined(t.prefixUrl)?t.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:\"\":(t.prefixUrl=t.prefixUrl.toString(),t.prefixUrl!==\"\"&&!t.prefixUrl.endsWith(\"/\")&&(t.prefixUrl+=\"/\")),Ee.default.string(t.url)){if(t.url.startsWith(\"/\"))throw new Error(\"`input` must not start with a slash when using `prefixUrl`\");t.url=f6.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==\"\"||t.protocol)&&(t.url=f6.default(t.prefixUrl,t));if(t.url){\"port\"in t&&delete t.port;let{prefixUrl:h}=t;Object.defineProperty(t,\"prefixUrl\",{set:C=>{let y=t.url;if(!y.href.startsWith(C))throw new Error(`Cannot change \\`prefixUrl\\` from ${h} to ${C}: ${y.href}`);t.url=new VA.URL(C+y.href.slice(h.length)),h=C},get:()=>h});let{protocol:p}=t.url;if(p===\"unix:\"&&(p=\"http:\",t.url=new VA.URL(`http://unix${t.url.pathname}${t.url.search}`)),t.searchParams&&(t.url.search=t.searchParams.toString()),p!==\"http:\"&&p!==\"https:\")throw new uB(t);t.username===\"\"?t.username=t.url.username:t.url.username=t.username,t.password===\"\"?t.password=t.url.password:t.url.password=t.password}let{cookieJar:u}=t;if(u){let{setCookie:h,getCookieString:p}=u;Ee.assert.function_(h),Ee.assert.function_(p),h.length===4&&p.length===0&&(h=a6.promisify(h.bind(t.cookieJar)),p=a6.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(CR.has(g)||CR.set(g,new c6((h,p)=>{let C=h[Pi](h,p);return Ee.default.promise(C)&&(C.once=(y,B)=>{if(y===\"error\")C.catch(B);else if(y===\"abort\")(async()=>{try{(await C).once(\"abort\",B)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return C}),C},g))),t.cacheOptions={...t.cacheOptions},t.dnsCache===!0)pR||(pR=new _Pe.default),t.dnsCache=pR;else if(!Ee.default.undefined(t.dnsCache)&&!t.dnsCache.lookup)throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${Ee.default(t.dnsCache)}`);Ee.default.number(t.timeout)?t.timeout={request:t.timeout}:i&&t.timeout!==i.timeout?t.timeout={...i.timeout,...t.timeout}:t.timeout={...t.timeout},t.context||(t.context={});let f=t.hooks===(i==null?void 0:i.hooks);t.hooks={...t.hooks};for(let h of Yt.knownHookEvents)if(h in t.hooks)if(Ee.default.array(t.hooks[h]))t.hooks[h]=[...t.hooks[h]];else throw new TypeError(`Parameter \\`${h}\\` must be an Array, got ${Ee.default(t.hooks[h])}`);else t.hooks[h]=[];if(i&&!f)for(let h of Yt.knownHookEvents)i.hooks[h].length>0&&(t.hooks[h]=[...i.hooks[h],...t.hooks[h]]);if(\"family\"in t&&XA.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"'),i!=null&&i.https&&(t.https={...i.https,...t.https}),\"rejectUnauthorized\"in t&&XA.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"'),\"checkServerIdentity\"in t&&XA.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"'),\"ca\"in t&&XA.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"'),\"key\"in t&&XA.default('\"options.key\" was never documented, please use \"options.https.key\"'),\"cert\"in t&&XA.default('\"options.cert\" was never documented, please use \"options.https.certificate\"'),\"passphrase\"in t&&XA.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"'),\"pfx\"in t&&XA.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"'),\"followRedirects\"in t)throw new TypeError(\"The `followRedirects` option does not exist. Use `followRedirect` instead.\");if(t.agent){for(let h in t.agent)if(h!==\"http\"&&h!==\"https\"&&h!==\"http2\")throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${h}\\``)}return t.maxRedirects=(l=t.maxRedirects)!==null&&l!==void 0?l:0,Yt.setNonEnumerableProperties([i,c],t),ADe.default(t,i)}_lockWrite(){let e=()=>{throw new TypeError(\"The payload has been already provided\")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.undefined(e.form),n=!Ee.default.undefined(e.json),s=!Ee.default.undefined(e.body),o=i||n||s,a=Yt.withoutBody.has(e.method)&&!(e.method===\"GET\"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \\`${e.method}\\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError(\"The `body`, `json` and `form` options are mutually exclusive\");if(s&&!(e.body instanceof A6.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!u6.default(e.body))throw new TypeError(\"The `body` option must be a stream.Readable, string or Buffer\");if(i&&!Ee.default.object(e.form))throw new TypeError(\"The `form` option must be an Object\");{let l=!Ee.default.string(t[\"content-type\"]);s?(u6.default(e.body)&&l&&(t[\"content-type\"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[ZA]=e.body):i?(l&&(t[\"content-type\"]=\"application/x-www-form-urlencoded\"),this[ZA]=new VA.URLSearchParams(e.form).toString()):(l&&(t[\"content-type\"]=\"application/json\"),this[ZA]=e.stringifyJson(e.json));let c=await rDe.default(this[ZA],e.headers);Ee.default.undefined(t[\"content-length\"])&&Ee.default.undefined(t[\"transfer-encoding\"])&&!a&&!Ee.default.undefined(c)&&(t[\"content-length\"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[jf]=Number(t[\"content-length\"])||void 0}async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[m6]=e,t.decompress&&(e=$Pe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:l6.STATUS_CODES[n],s.url=t.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[d6]=s.isFromCache,this[Gf]=Number(e.headers[\"content-length\"])||void 0,this[sB]=e,e.once(\"end\",()=>{this[Gf]=this[Yf],this.emit(\"downloadProgress\",this.downloadProgress)}),e.once(\"error\",a=>{e.destroy(),this._beforeError(new QC(a,this))}),e.once(\"aborted\",()=>{this._beforeError(new QC({name:\"Error\",message:\"The server aborted pending request\",code:\"ECONNRESET\"},this))}),this.emit(\"downloadProgress\",this.downloadProgress);let o=e.headers[\"set-cookie\"];if(Ee.default.object(t.cookieJar)&&o){let a=o.map(async l=>t.cookieJar.setCookie(l,i.toString()));t.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(t.followRedirect&&e.headers.location&&hDe.has(n)){if(e.resume(),this[Pi]&&(this[dR](),delete this[Pi],this[p6]()),(n===303&&t.method!==\"GET\"&&t.method!==\"HEAD\"||!t.methodRewriting)&&(t.method=\"GET\",\"body\"in t&&delete t.body,\"json\"in t&&delete t.json,\"form\"in t&&delete t.form,this[ZA]=void 0,delete t.headers[\"content-length\"]),this.redirects.length>=t.maxRedirects){this._beforeError(new oB(this));return}try{let l=Buffer.from(e.headers.location,\"binary\").toString(),c=new VA.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?(\"host\"in t.headers&&delete t.headers.host,\"cookie\"in t.headers&&delete t.headers.cookie,\"authorization\"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username=\"\",t.password=\"\")):(c.username=t.username,c.password=t.password),this.redirects.push(u),t.url=c;for(let g of t.hooks.beforeRedirect)await g(t,s);this.emit(\"redirect\",s,t),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(t.isStream&&t.throwHttpErrors&&!aDe.isResponseOk(s)){this._beforeError(new aB(s));return}e.on(\"readable\",()=>{this[nB]&&this._read()}),this.on(\"resume\",()=>{e.resume()}),this.on(\"pause\",()=>{e.pause()}),e.once(\"end\",()=>{this.push(null)}),this.emit(\"response\",e);for(let a of this[iB])if(!a.headersSent){for(let l in e.headers){let c=t.decompress?l!==\"content-encoding\":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._beforeError(t)}}_onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;ZPe.default(e),this[dR]=g6.default(e,i,n);let s=t.cache?\"cacheableResponse\":\"response\";e.once(s,l=>{this._onResponse(l)}),e.once(\"error\",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners(\"end\"),l=l instanceof g6.TimeoutError?new cB(l,this.timings,this):new ei(l.message,l,this),this._beforeError(l)}),this[p6]=iDe.default(e,this,dDe),this[Pi]=e,this.emit(\"uploadProgress\",this.uploadProgress);let o=this[ZA],a=this.redirects.length===0?this:e;Ee.default.nodeStream(o)?(o.pipe(a),o.once(\"error\",l=>{this._beforeError(new lB(l,this))})):(this._unlockWrite(),Ee.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit(\"request\",e)}async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.assign(t,nDe.default(e)),delete t.url;let s,o=CR.get(t.cache)(t,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit(\"cacheableResponse\",a),i(a)});t.url=e,o.once(\"error\",n),o.once(\"request\",async a=>{s=a,i(s)})})}async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for(let B in a)if(Ee.default.undefined(a[B]))delete a[B];else if(Ee.default.null_(a[B]))throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${B}\\` header`);if(o.decompress&&Ee.default.undefined(a[\"accept-encoding\"])&&(a[\"accept-encoding\"]=cDe?\"gzip, deflate, br\":\"gzip, deflate\"),o.cookieJar){let B=await o.cookieJar.getCookieString(o.url.toString());Ee.default.nonEmptyString(B)&&(o.headers.cookie=B)}for(let B of o.hooks.beforeRequest){let v=await B(o);if(!Ee.default.undefined(v)){o.request=()=>v;break}}o.body&&this[ZA]!==o.body&&(this[ZA]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!(\"lookup\"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname===\"unix\"){let B=/(?<socketPath>.+?):(?<path>.+)/.exec(`${g.pathname}${g.search}`);if(B!=null&&B.groups){let{socketPath:v,path:D}=B.groups;Object.assign(o,{socketPath:v,path:D,host:\"\"})}}let f=g.protocol===\"https:\",h;o.http2?h=eDe.auto:h=f?XPe.request:l6.request;let p=(e=o.request)!==null&&e!==void 0?e:h,C=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?\"https\":\"http\"]),o[Pi]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(t=o.cacheOptions)===null||t===void 0?void 0:t.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=h6.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch{throw new Error(\"Invalid `dnsLookupIpVersion` option value\")}o.https&&(\"rejectUnauthorized\"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let B=await C(g,y);Ee.default.undefined(B)&&(B=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&(\"rejectUnauthorized\"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),gDe(B)?this._onRequest(B):this.writable?(this.once(\"finish\",()=>{this._onResponse(B)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(B)}catch(B){throw B instanceof c6.CacheError?new AB(B,this):new ei(B.message,B,this)}}async _error(e){try{for(let t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new ei(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[Jf])return;let{options:t}=this,i=this.retryCount+1;this[Jf]=!0,e instanceof ei||(e=new ei(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await oDe.default(s),s.body=s.rawBody.toString()}catch{}}if(this.listenerCount(\"retry\")!==0){let o;try{let a;s&&\"retry-after\"in s.headers&&(a=Number(s.headers[\"retry-after\"]),Number.isNaN(a)?(a=Date.parse(s.headers[\"retry-after\"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await t.retry.calculateDelay({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:lDe.default({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new ei(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new ei(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit(\"retry\",i,e))};this[E6]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[nB]=!0;let e=this[sB];if(e&&!this[Jf]){e.readableLength&&(this[nB]=!1);let t;for(;(t=e.read())!==null;){this[Yf]+=t.length,this[C6]=!0;let i=this.downloadProgress;i.percent<1&&this.emit(\"downloadProgress\",i),this.push(t)}}}_write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitialized?n():this[BC].push(n)}_writeRequest(e,t,i){this[Pi].destroyed||(this._progressCallbacks.push(()=>{this[qf]+=Buffer.byteLength(e,t);let n=this.uploadProgress;n.percent<1&&this.emit(\"uploadProgress\",n)}),this[Pi].write(e,t,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Pi in this)){e();return}if(this[Pi].destroyed){e();return}this[Pi].end(i=>{i||(this[jf]=this[qf],this.emit(\"uploadProgress\",this.uploadProgress),this[Pi].emit(\"upload-complete\")),e(i)})};this.requestInitialized?t():this[BC].push(t)}_destroy(e,t){var i;this[Jf]=!0,clearTimeout(this[E6]),Pi in this&&(this[dR](),!((i=this[sB])===null||i===void 0)&&i.complete||this[Pi].destroy()),e!==null&&!Ee.default.undefined(e)&&!(e instanceof ei)&&(e=new ei(e.message,e,this)),t(e)}get _isAboutToError(){return this[Jf]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,t,i;return((t=(e=this[Pi])===null||e===void 0?void 0:e.destroyed)!==null&&t!==void 0?t:this.destroyed)&&!(!((i=this[m6])===null||i===void 0)&&i.complete)}get socket(){var e,t;return(t=(e=this[Pi])===null||e===void 0?void 0:e.socket)!==null&&t!==void 0?t:void 0}get downloadProgress(){let e;return this[Gf]?e=this[Yf]/this[Gf]:this[Gf]===this[Yf]?e=1:e=0,{percent:e,transferred:this[Yf],total:this[Gf]}}get uploadProgress(){let e;return this[jf]?e=this[qf]/this[jf]:this[jf]===this[qf]?e=1:e=0,{percent:e,transferred:this[qf],total:this[jf]}}get timings(){var e;return(e=this[Pi])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[d6]}pipe(e,t){if(this[C6])throw new Error(\"Failed to pipe. The response has been emitted already.\");return e instanceof hR.ServerResponse&&this[iB].add(e),super.pipe(e,t)}unpipe(e){return e instanceof hR.ServerResponse&&this[iB].delete(e),super.unpipe(e),this}};Yt.default=gB});var SC=w(ao=>{\"use strict\";var CDe=ao&&ao.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),mDe=ao&&ao.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&CDe(e,r,t)};Object.defineProperty(ao,\"__esModule\",{value:!0});ao.CancelError=ao.ParseError=void 0;var I6=bC(),mR=class extends I6.RequestError{constructor(e,t){let{options:i}=t.request;super(`${e.message} in \"${i.url.toString()}\"`,e,t.request),this.name=\"ParseError\"}};ao.ParseError=mR;var ER=class extends I6.RequestError{constructor(e){super(\"Promise was canceled\",{},e),this.name=\"CancelError\"}get isCanceled(){return!0}};ao.CancelError=ER;mDe(bC(),ao)});var w6=w(IR=>{\"use strict\";Object.defineProperty(IR,\"__esModule\",{value:!0});var y6=SC(),EDe=(r,e,t,i)=>{let{rawBody:n}=r;try{if(e===\"text\")return n.toString(i);if(e===\"json\")return n.length===0?\"\":t(n.toString());if(e===\"buffer\")return n;throw new y6.ParseError({message:`Unknown body type '${e}'`,name:\"Error\"},r)}catch(s){throw new y6.ParseError(s,r)}};IR.default=EDe});var yR=w(_A=>{\"use strict\";var IDe=_A&&_A.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),yDe=_A&&_A.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&IDe(e,r,t)};Object.defineProperty(_A,\"__esModule\",{value:!0});var wDe=J(\"events\"),BDe=Ga(),QDe=wz(),fB=SC(),B6=w6(),Q6=bC(),bDe=iR(),SDe=cR(),b6=uR(),vDe=[\"request\",\"response\",\"redirect\",\"uploadProgress\",\"downloadProgress\"];function S6(r){let e,t,i=new wDe.EventEmitter,n=new QDe((o,a,l)=>{let c=u=>{let g=new Q6.default(void 0,r);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new fB.CancelError(g))),e=g,g.once(\"response\",async p=>{var C;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await SDe.default(g),p.rawBody=y}catch{return}if(g._isAboutToError)return;let B=((C=p.headers[\"content-encoding\"])!==null&&C!==void 0?C:\"\").toLowerCase(),v=[\"gzip\",\"deflate\",\"br\"].includes(B),{options:D}=g;if(v&&!D.decompress)p.body=y;else try{p.body=B6.default(p,D.responseType,D.parseJson,D.encoding)}catch(L){if(p.body=y.toString(),b6.isResponseOk(p)){g._beforeError(L);return}}try{for(let[L,H]of D.hooks.afterResponse.entries())p=await H(p,async j=>{let $=Q6.default.normalizeArguments(void 0,{...j,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},D);$.hooks.afterResponse=$.hooks.afterResponse.slice(0,L);for(let W of $.hooks.beforeRetry)await W($);let V=S6($);return l(()=>{V.catch(()=>{}),V.cancel()}),V})}catch(L){g._beforeError(new fB.RequestError(L.message,L,g));return}if(!b6.isResponseOk(p)){g._beforeError(new fB.HTTPError(p));return}t=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:C}=g;if(p instanceof fB.HTTPError&&!C.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once(\"error\",f);let h=g.options.body;g.once(\"retry\",(p,C)=>{var y,B;if(h===((y=C.request)===null||y===void 0?void 0:y.options.body)&&BDe.default.nodeStream((B=C.request)===null||B===void 0?void 0:B.options.body)){f(C);return}c(p)}),bDe.default(g,i,vDe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=t.request;return B6.default(t,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept=\"application/json\"),s(\"json\")},n.buffer=()=>s(\"buffer\"),n.text=()=>s(\"text\"),n}_A.default=S6;yDe(SC(),_A)});var v6=w(wR=>{\"use strict\";Object.defineProperty(wR,\"__esModule\",{value:!0});var xDe=SC();function PDe(r,...e){let t=(async()=>{if(r instanceof xDe.RequestError)try{for(let n of e)if(n)for(let s of n)r=await s(r)}catch(n){r=n}throw r})(),i=()=>t;return t.json=i,t.text=i,t.buffer=i,t.on=i,t}wR.default=PDe});var D6=w(BR=>{\"use strict\";Object.defineProperty(BR,\"__esModule\",{value:!0});var x6=Ga();function P6(r){for(let e of Object.values(r))(x6.default.plainObject(e)||x6.default.array(e))&&P6(e);return Object.freeze(r)}BR.default=P6});var R6=w(k6=>{\"use strict\";Object.defineProperty(k6,\"__esModule\",{value:!0})});var QR=w(bs=>{\"use strict\";var DDe=bs&&bs.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),kDe=bs&&bs.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&DDe(e,r,t)};Object.defineProperty(bs,\"__esModule\",{value:!0});bs.defaultHandler=void 0;var F6=Ga(),Qs=yR(),RDe=v6(),pB=bC(),FDe=D6(),NDe={RequestError:Qs.RequestError,CacheError:Qs.CacheError,ReadError:Qs.ReadError,HTTPError:Qs.HTTPError,MaxRedirectsError:Qs.MaxRedirectsError,TimeoutError:Qs.TimeoutError,ParseError:Qs.ParseError,CancelError:Qs.CancelError,UnsupportedProtocolError:Qs.UnsupportedProtocolError,UploadError:Qs.UploadError},LDe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:hB}=pB.default,N6=(...r)=>{let e;for(let t of r)e=hB(void 0,t,e);return e},TDe=r=>r.isStream?new pB.default(void 0,r):Qs.default(r),ODe=r=>\"defaults\"in r&&\"options\"in r.defaults,MDe=[\"get\",\"post\",\"put\",\"patch\",\"head\",\"delete\"];bs.defaultHandler=(r,e)=>e(r);var L6=(r,e)=>{if(r)for(let t of r)t(e)},T6=r=>{r._rawHandlers=r.handlers,r.handlers=r.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>r.handlers[l++](u,l===r.handlers.length?TDe:c);if(F6.default.plainObject(i)){let u={...i,...n};pB.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{L6(r.options.hooks.init,n),L6((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=hB(i,n,s!=null?s:r.options);if(g[pB.kIsNormalizedAlready]=!0,u)throw new Qs.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return RDe.default(u,r.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[r.options],s=[...r._rawHandlers],o;for(let a of i)ODe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),\"handlers\"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==bs.defaultHandler),s.length===0&&s.push(bs.defaultHandler),T6({options:N6(...n),handlers:s,mutableDefaults:Boolean(o)})};let t=async function*(i,n){let s=hB(i,n,r.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!F6.default.object(o))throw new TypeError(\"`options.pagination` must be implemented\");let a=[],{countLimit:l}=o,c=0;for(;c<o.requestLimit;){c!==0&&await LDe(o.backoff);let u=await e(void 0,void 0,s),g=await o.transform(u),f=[];for(let p of g)if(o.filter(p,a,f)&&(!o.shouldContinue(p,a,f)||(yield p,o.stackAllItems&&a.push(p),f.push(p),--l<=0)))return;let h=o.paginate(u,a,f);if(h===!1)return;h===u.request.options?s=u.request.options:h!==void 0&&(s=hB(void 0,h,s)),c++}};e.paginate=t,e.paginate.all=async(i,n)=>{let s=[];for await(let o of t(i,n))s.push(o);return s},e.paginate.each=t,e.stream=(i,n)=>e(i,{...n,isStream:!0});for(let i of MDe)e[i]=(n,s)=>e(n,{...s,method:i}),e.stream[i]=(n,s)=>e(n,{...s,method:i,isStream:!0});return Object.assign(e,NDe),Object.defineProperty(e,\"defaults\",{value:r.mutableDefaults?r:FDe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=N6,e};bs.default=T6;kDe(R6(),bs)});var CB=w((Ya,dB)=>{\"use strict\";var UDe=Ya&&Ya.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),O6=Ya&&Ya.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&UDe(e,r,t)};Object.defineProperty(Ya,\"__esModule\",{value:!0});var KDe=J(\"url\"),M6=QR(),HDe={options:{method:\"GET\",retry:{limit:2,methods:[\"GET\",\"PUT\",\"HEAD\",\"DELETE\",\"OPTIONS\",\"TRACE\"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:[\"ETIMEDOUT\",\"ECONNRESET\",\"EADDRINUSE\",\"ECONNREFUSED\",\"EPIPE\",\"ENOTFOUND\",\"ENETUNREACH\",\"EAI_AGAIN\"],maxRetryAfter:void 0,calculateDelay:({computedValue:r})=>r},timeout:{},headers:{\"user-agent\":\"got (https://github.com/sindresorhus/got)\"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:\"text\",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:\"\",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:r=>r.request.options.responseType===\"json\"?r.body:JSON.parse(r.body),paginate:r=>{if(!Reflect.has(r.headers,\"link\"))return!1;let e=r.headers.link.split(\",\"),t;for(let i of e){let n=i.split(\";\");if(n[1].includes(\"next\")){t=n[0].trimStart().trim(),t=t.slice(1,-1);break}}return t?{url:new KDe.URL(t)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:r=>JSON.parse(r),stringifyJson:r=>JSON.stringify(r),cacheOptions:{}},handlers:[M6.defaultHandler],mutableDefaults:!1},bR=M6.default(HDe);Ya.default=bR;dB.exports=bR;dB.exports.default=bR;dB.exports.__esModule=!0;O6(QR(),Ya);O6(yR(),Ya)});var G6=w(Wf=>{\"use strict\";var rst=J(\"net\"),GDe=J(\"tls\"),SR=J(\"http\"),U6=J(\"https\"),YDe=J(\"events\"),ist=J(\"assert\"),jDe=J(\"util\");Wf.httpOverHttp=qDe;Wf.httpsOverHttp=JDe;Wf.httpOverHttps=WDe;Wf.httpsOverHttps=zDe;function qDe(r){var e=new ja(r);return e.request=SR.request,e}function JDe(r){var e=new ja(r);return e.request=SR.request,e.createSocket=K6,e.defaultPort=443,e}function WDe(r){var e=new ja(r);return e.request=U6.request,e}function zDe(r){var e=new ja(r);return e.request=U6.request,e.createSocket=K6,e.defaultPort=443,e}function ja(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||SR.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on(\"free\",function(i,n,s,o){for(var a=H6(n,s,o),l=0,c=e.requests.length;l<c;++l){var u=e.requests[l];if(u.host===a.host&&u.port===a.port){e.requests.splice(l,1),u.request.onSocket(i);return}}i.destroy(),e.removeSocket(i)})}jDe.inherits(ja,YDe.EventEmitter);ja.prototype.addRequest=function(e,t,i,n){var s=this,o=vR({request:e},s.options,H6(t,i,n));if(s.sockets.length>=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on(\"free\",l),a.on(\"close\",c),a.on(\"agentRemove\",c),e.onSocket(a);function l(){s.emit(\"free\",a,o)}function c(u){s.removeSocket(a),a.removeListener(\"free\",l),a.removeListener(\"close\",c),a.removeListener(\"agentRemove\",c)}})};ja.prototype.createSocket=function(e,t){var i=this,n={};i.sockets.push(n);var s=vR({},i.proxyOptions,{method:\"CONNECT\",path:e.host+\":\"+e.port,agent:!1,headers:{host:e.host+\":\"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers[\"Proxy-Authorization\"]=\"Basic \"+new Buffer(s.proxyAuth).toString(\"base64\")),$A(\"making CONNECT request\");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once(\"response\",a),o.once(\"upgrade\",l),o.once(\"connect\",c),o.once(\"error\",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){$A(\"tunneling socket could not be established, statusCode=%d\",g.statusCode),f.destroy();var p=new Error(\"tunneling socket could not be established, statusCode=\"+g.statusCode);p.code=\"ECONNRESET\",e.request.emit(\"error\",p),i.removeSocket(n);return}if(h.length>0){$A(\"got illegal response body from proxy\"),f.destroy();var p=new Error(\"got illegal response body from proxy\");p.code=\"ECONNRESET\",e.request.emit(\"error\",p),i.removeSocket(n);return}return $A(\"tunneling connection has established\"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),$A(`tunneling socket could not be established, cause=%s\n`,g.message,g.stack);var f=new Error(\"tunneling socket could not be established, cause=\"+g.message);f.code=\"ECONNRESET\",e.request.emit(\"error\",f),i.removeSocket(n)}};ja.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(t!==-1){this.sockets.splice(t,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function K6(r,e){var t=this;ja.prototype.createSocket.call(t,r,function(i){var n=r.request.getHeader(\"host\"),s=vR({},t.options,{socket:i,servername:n?n.replace(/:.*$/,\"\"):r.host}),o=GDe.connect(0,s);t.sockets[t.sockets.indexOf(i)]=o,e(o)})}function H6(r,e,t){return typeof r==\"string\"?{host:r,port:e,localAddress:t}:r}function vR(r){for(var e=1,t=arguments.length;e<t;++e){var i=arguments[e];if(typeof i==\"object\")for(var n=Object.keys(i),s=0,o=n.length;s<o;++s){var a=n[s];i[a]!==void 0&&(r[a]=i[a])}}return r}var $A;process.env.NODE_DEBUG&&/\\btunnel\\b/.test(process.env.NODE_DEBUG)?$A=function(){var r=Array.prototype.slice.call(arguments);typeof r[0]==\"string\"?r[0]=\"TUNNEL: \"+r[0]:r.unshift(\"TUNNEL:\"),console.error.apply(console,r)}:$A=function(){};Wf.debug=$A});var j6=w((sst,Y6)=>{Y6.exports=G6()});var tV=w((IB,FR)=>{var eV=Object.assign({},J(\"fs\")),RR=function(){var r=typeof document<\"u\"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<\"u\"&&(r=r||__filename),function(e){e=e||{};var t=typeof e<\"u\"?e:{},i,n;t.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in t)t.hasOwnProperty(o)&&(s[o]=t[o]);var a=[],l=\"./this.program\",c=function(d,E){throw E},u=!1,g=!0,f=\"\";function h(d){return t.locateFile?t.locateFile(d,f):f+d}var p,C,y,B;g&&(u?f=J(\"path\").dirname(f)+\"/\":f=__dirname+\"/\",p=function(E,I){var k=da(E);return k?I?k:k.toString():(y||(y=eV),B||(B=J(\"path\")),E=B.normalize(E),y.readFileSync(E,I?null:\"utf8\"))},C=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),re(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\\\/g,\"/\")),a=process.argv.slice(2),c=function(d){process.exit(d)},t.inspect=function(){return\"[Emscripten Module object]\"});var v=t.print||console.log.bind(console),D=t.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);s=null,t.arguments&&(a=t.arguments),t.thisProgram&&(l=t.thisProgram),t.quit&&(c=t.quit);var L=16;function H(d,E){return E||(E=L),Math.ceil(d/E)*E}var j=0,$=function(d){j=d},V;t.wasmBinary&&(V=t.wasmBinary);var W=t.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&wr(\"no native wasm support detected\");function _(d,E,I){switch(E=E||\"i8\",E.charAt(E.length-1)===\"*\"&&(E=\"i32\"),E){case\"i1\":return ne[d>>0];case\"i8\":return ne[d>>0];case\"i16\":return he[d>>1];case\"i32\":return de[d>>2];case\"i64\":return de[d>>2];case\"float\":return Pt[d>>2];case\"double\":return It[d>>3];default:wr(\"invalid type for getValue: \"+E)}return null}var A,Ae=!1,ge;function re(d,E){d||wr(\"Assertion failed: \"+E)}function O(d){var E=t[\"_\"+d];return re(E,\"Cannot call unknown function \"+d+\", make sure it is exported\"),E}function F(d,E,I,k,T){var Z={string:function(it){var Et=0;if(it!=null&&it!==0){var Qe=(it.length<<2)+1;Et=Q(Qe),oe(it,Et,Qe)}return Et},array:function(it){var Et=Q(it.length);return fe(it,Et),Et}};function te(it){return E===\"string\"?Fe(it):E===\"boolean\"?Boolean(it):it}var we=O(d),me=[],Je=0;if(k)for(var nt=0;nt<k.length;nt++){var wt=Z[I[nt]];wt?(Je===0&&(Je=YE()),me[nt]=wt(k[nt])):me[nt]=k[nt]}var lt=we.apply(null,me);return lt=te(lt),Je!==0&&jE(Je),lt}function ue(d,E,I,k){I=I||[];var T=I.every(function(te){return te===\"number\"}),Z=E!==\"string\";return Z&&T&&!k?O(d):function(){return F(d,E,I,arguments,k)}}var pe=typeof TextDecoder<\"u\"?new TextDecoder(\"utf8\"):void 0;function ke(d,E,I){for(var k=E+I,T=E;d[T]&&!(T>=k);)++T;if(T-E>16&&d.subarray&&pe)return pe.decode(d.subarray(E,T));for(var Z=\"\";E<T;){var te=d[E++];if(!(te&128)){Z+=String.fromCharCode(te);continue}var we=d[E++]&63;if((te&224)==192){Z+=String.fromCharCode((te&31)<<6|we);continue}var me=d[E++]&63;if((te&240)==224?te=(te&15)<<12|we<<6|me:te=(te&7)<<18|we<<12|me<<6|d[E++]&63,te<65536)Z+=String.fromCharCode(te);else{var Je=te-65536;Z+=String.fromCharCode(55296|Je>>10,56320|Je&1023)}}return Z}function Fe(d,E){return d?ke(Y,d,E):\"\"}function Ne(d,E,I,k){if(!(k>0))return 0;for(var T=I,Z=I+k-1,te=0;te<d.length;++te){var we=d.charCodeAt(te);if(we>=55296&&we<=57343){var me=d.charCodeAt(++te);we=65536+((we&1023)<<10)|me&1023}if(we<=127){if(I>=Z)break;E[I++]=we}else if(we<=2047){if(I+1>=Z)break;E[I++]=192|we>>6,E[I++]=128|we&63}else if(we<=65535){if(I+2>=Z)break;E[I++]=224|we>>12,E[I++]=128|we>>6&63,E[I++]=128|we&63}else{if(I+3>=Z)break;E[I++]=240|we>>18,E[I++]=128|we>>12&63,E[I++]=128|we>>6&63,E[I++]=128|we&63}}return E[I]=0,I-T}function oe(d,E,I){return Ne(d,Y,E,I)}function le(d){for(var E=0,I=0;I<d.length;++I){var k=d.charCodeAt(I);k>=55296&&k<=57343&&(k=65536+((k&1023)<<10)|d.charCodeAt(++I)&1023),k<=127?++E:k<=2047?E+=2:k<=65535?E+=3:E+=4}return E}function Be(d){var E=le(d)+1,I=dt(E);return I&&Ne(d,ne,I,E),I}function fe(d,E){ne.set(d,E)}function ae(d,E){return d%E>0&&(d+=E-d%E),d}var qe,ne,Y,he,ie,de,_e,Pt,It;function Or(d){qe=d,t.HEAP8=ne=new Int8Array(d),t.HEAP16=he=new Int16Array(d),t.HEAP32=de=new Int32Array(d),t.HEAPU8=Y=new Uint8Array(d),t.HEAPU16=ie=new Uint16Array(d),t.HEAPU32=_e=new Uint32Array(d),t.HEAPF32=Pt=new Float32Array(d),t.HEAPF64=It=new Float64Array(d)}var ii=t.INITIAL_MEMORY||16777216,gi,hr=[],fi=[],ni=[],Us=!1;function pr(){if(t.preRun)for(typeof t.preRun==\"function\"&&(t.preRun=[t.preRun]);t.preRun.length;)ga(t.preRun.shift());yo(hr)}function Ii(){Us=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ns.init(),yo(fi)}function rs(){if(t.postRun)for(typeof t.postRun==\"function\"&&(t.postRun=[t.postRun]);t.postRun.length;)cg(t.postRun.shift());yo(ni)}function ga(d){hr.unshift(d)}function dA(d){fi.unshift(d)}function cg(d){ni.unshift(d)}var is=0,CA=null,fa=null;function wp(d){return d}function mA(d){is++,t.monitorRunDependencies&&t.monitorRunDependencies(is)}function EA(d){if(is--,t.monitorRunDependencies&&t.monitorRunDependencies(is),is==0&&(CA!==null&&(clearInterval(CA),CA=null),fa)){var E=fa;fa=null,E()}}t.preloadedImages={},t.preloadedAudios={};function wr(d){t.onAbort&&t.onAbort(d),d+=\"\",D(d),Ae=!0,ge=1,d=\"abort(\"+d+\"). Build with -s ASSERTIONS=1 for more info.\";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var Ll=\"data:application/octet-stream;base64,\";function ug(d){return d.startsWith(Ll)}var Io=\"data:application/octet-stream;base64,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ACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAkgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQALIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAwgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAOIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA8gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFEEQajYCFAwBCwsDQCAAIAAoAhAiAUEBazYCECABBEAgACAAKAIUIgFBAWo2AhQgACABLQAAIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDAwBCwsgACAAKAIYQfH/A3A2AhggACAAKAIMQfH/A3A2AgwLIAAgACgCGCAAKAIMQRB0cjYCHAsgACgCHCEAIANBEGokACAAC1IBAn9BkJcBKAIAIgEgAEEDakF8cSICaiEAAkAgAkEAIAAgAU0bDQAgAD8AQRB0SwRAIAAQDEUNAQtBkJcBIAA2AgAgAQ8LQbSbAUEwNgIAQX8LvAIBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQoAghFBEAgBCAEKAIYQQhqNgIICwJAIAQpAxAgBCgCGCkDMFoEQCAEKAIIQRJBABAUIARBADYCHAwBCwJAIAQoAgxBCHFFBEAgBCgCGCgCQCAEKQMQp0EEdGooAgQNAQsgBCgCGCgCQCAEKQMQp0EEdGooAgBFBEAgBCgCCEESQQAQFCAEQQA2AhwMAgsCQCAEKAIYKAJAIAQpAxCnQQR0ai0ADEEBcUUNACAEKAIMQQhxDQAgBCgCCEEXQQAQFCAEQQA2AhwMAgsgBCAEKAIYKAJAIAQpAxCnQQR0aigCADYCHAwBCyAEIAQoAhgoAkAgBCkDEKdBBHRqKAIENgIcCyAEKAIcIQAgBEEgaiQAIAALhAEBAX8jAEEQayIBJAAgASAANgIIIAFB2AAQGCIANgIEAkAgAEUEQCABQQA2AgwMAQsCQCABKAIIBEAgASgCBCABKAIIQdgAEBkaDAELIAEoAgQQUwsgASgCBEEANgIAIAEoAgRBAToABSABIAEoAgQ2AgwLIAEoAgwhACABQRBqJAAgAAtvAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGCADKAIQrRAeNgIMAkAgAygCDEUEQCADQX82AhwMAQsgAygCDCADKAIUIAMoAhAQGRogA0EANgIcCyADKAIcGiADQSBqJAALogEBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCDCAEKQMQECkiADYCBAJAIABFBEAgBCgCCEEOQQAQFCAEQQA2AhwMAQsgBCgCGCAEKAIEKAIEIAQpAxAgBCgCCBBkQQBIBEAgBCgCBBAWIARBADYCHAwBCyAEIAQoAgQ2AhwLIAQoAhwhACAEQSBqJAAgAAugAQEBfyMAQSBrIgMkACADIAA2AhQgAyABNgIQIAMgAjcDCCADIAMoAhA2AgQCQCADKQMIQghUBEAgA0J/NwMYDAELIwBBEGsiACADKAIUNgIMIAAoAgwoAgAhACADKAIEIAA2AgAjAEEQayIAIAMoAhQ2AgwgACgCDCgCBCEAIAMoAgQgADYCBCADQgg3AxgLIAMpAxghAiADQSBqJAAgAguDAQIDfwF+AkAgAEKAgICAEFQEQCAAIQUMAQsDQCABQQFrIgEgACAAQgqAIgVCCn59p0EwcjoAACAAQv////+fAVYhAiAFIQAgAg0ACwsgBaciAgRAA0AgAUEBayIBIAIgAkEKbiIDQQpsa0EwcjoAACACQQlLIQQgAyECIAQNAAsLIAELPwEBfyMAQRBrIgIgADYCDCACIAE2AgggAigCDARAIAIoAgwgAigCCCgCADYCACACKAIMIAIoAggoAgQ2AgQLC9IIAQJ/IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNgIQIAQgAzYCDAJAIAQoAhhFBEAgBCgCFARAIAQoAhRBADYCAAsgBEGVFTYCHAwBCyAEKAIQQcAAcUUEQCAEKAIYKAIIRQRAIAQoAhhBABA6GgsCQAJAAkAgBCgCEEGAAXFFDQAgBCgCGCgCCEEBRg0AIAQoAhgoAghBAkcNAQsgBCgCGCgCCEEERw0BCyAEKAIYKAIMRQRAIAQoAhgoAgAhASAEKAIYLwEEIQIgBCgCGEEQaiEDIAQoAgwhBSMAQTBrIgAkACAAIAE2AiggACACNgIkIAAgAzYCICAAIAU2AhwgACAAKAIoNgIYAkAgACgCJEUEQCAAKAIgBEAgACgCIEEANgIACyAAQQA2AiwMAQsgAEEBNgIQIABBADYCDANAIAAoAgwgACgCJEkEQCMAQRBrIgEgACgCGCAAKAIMai0AAEEBdEGgFWovAQA2AggCQCABKAIIQYABSQRAIAFBATYCDAwBCyABKAIIQYAQSQRAIAFBAjYCDAwBCyABKAIIQYCABEkEQCABQQM2AgwMAQsgAUEENgIMCyAAIAEoAgwgACgCEGo2AhAgACAAKAIMQQFqNgIMDAELCyAAIAAoAhAQGCIBNgIUIAFFBEAgACgCHEEOQQAQFCAAQQA2AiwMAQsgAEEANgIIIABBADYCDANAIAAoAgwgACgCJEkEQCAAKAIUIAAoAghqIQIjAEEQayIBIAAoAhggACgCDGotAABBAXRBoBVqLwEANgIIIAEgAjYCBAJAIAEoAghBgAFJBEAgASgCBCABKAIIOgAAIAFBATYCDAwBCyABKAIIQYAQSQRAIAEoAgQgASgCCEEGdkEfcUHAAXI6AAAgASgCBCABKAIIQT9xQYABcjoAASABQQI2AgwMAQsgASgCCEGAgARJBEAgASgCBCABKAIIQQx2QQ9xQeABcjoAACABKAIEIAEoAghBBnZBP3FBgAFyOgABIAEoAgQgASgCCEE/cUGAAXI6AAIgAUEDNgIMDAELIAEoAgQgASgCCEESdkEHcUHwAXI6AAAgASgCBCABKAIIQQx2QT9xQYABcjoAASABKAIEIAEoAghBBnZBP3FBgAFyOgACIAEoAgQgASgCCEE/cUGAAXI6AAMgAUEENgIMCyAAIAEoAgwgACgCCGo2AgggACAAKAIMQQFqNgIMDAELCyAAKAIUIAAoAhBBAWtqQQA6AAAgACgCIARAIAAoAiAgACgCEEEBazYCAAsgACAAKAIUNgIsCyAAKAIsIQEgAEEwaiQAIAQoAhggATYCDCABRQRAIARBADYCHAwECwsgBCgCFARAIAQoAhQgBCgCGCgCEDYCAAsgBCAEKAIYKAIMNgIcDAILCyAEKAIUBEAgBCgCFCAEKAIYLwEENgIACyAEIAQoAhgoAgA2AhwLIAQoAhwhACAEQSBqJAAgAAs5AQF/IwBBEGsiASAANgIMQQAhACABKAIMLQAAQQFxBH8gASgCDCkDECABKAIMKQMIUQVBAAtBAXEL7wIBAX8jAEEQayIBJAAgASAANgIIAkAgASgCCC0AKEEBcQRAIAFBfzYCDAwBCyABKAIIKAIkQQNGBEAgASgCCEEMakEXQQAQFCABQX82AgwMAQsCQCABKAIIKAIgBEACfyMAQRBrIgAgASgCCDYCDCAAKAIMKQMYQsAAg1ALBEAgASgCCEEMakEdQQAQFCABQX82AgwMAwsMAQsgASgCCCgCAARAIAEoAggoAgAQSEEASARAIAEoAghBDGogASgCCCgCABAXIAFBfzYCDAwDCwsgASgCCEEAQgBBABAgQgBTBEAgASgCCCgCAARAIAEoAggoAgAQLxoLIAFBfzYCDAwCCwsgASgCCEEAOgA0IAEoAghBADoANSMAQRBrIgAgASgCCEEMajYCDCAAKAIMBEAgACgCDEEANgIAIAAoAgxBADYCBAsgASgCCCIAIAAoAiBBAWo2AiAgAUEANgIMCyABKAIMIQAgAUEQaiQAIAALdQIBfwF+IwBBEGsiASQAIAEgADYCBAJAIAEoAgQtAChBAXEEQCABQn83AwgMAQsgASgCBCgCIEUEQCABKAIEQQxqQRJBABAUIAFCfzcDCAwBCyABIAEoAgRBAEIAQQcQIDcDCAsgASkDCCECIAFBEGokACACC50BAQF/IwBBEGsiASAANgIIAkACQAJAIAEoAghFDQAgASgCCCgCIEUNACABKAIIKAIkDQELIAFBATYCDAwBCyABIAEoAggoAhw2AgQCQAJAIAEoAgRFDQAgASgCBCgCACABKAIIRw0AIAEoAgQoAgRBtP4ASQ0AIAEoAgQoAgRB0/4ATQ0BCyABQQE2AgwMAQsgAUEANgIMCyABKAIMC4ABAQN/IwBBEGsiAiAANgIMIAIgATYCCCACKAIIQQh2IQEgAigCDCgCCCEDIAIoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAE6AAAgAigCCEH/AXEhASACKAIMKAIIIQMgAigCDCICKAIUIQAgAiAAQQFqNgIUIAAgA2ogAToAAAuZBQEBfyMAQUBqIgQkACAEIAA2AjggBCABNwMwIAQgAjYCLCAEIAM2AiggBEHIABAYIgA2AiQCQCAARQRAIARBADYCPAwBCyAEKAIkQgA3AzggBCgCJEIANwMYIAQoAiRCADcDMCAEKAIkQQA2AgAgBCgCJEEANgIEIAQoAiRCADcDCCAEKAIkQgA3AxAgBCgCJEEANgIoIAQoAiRCADcDIAJAIAQpAzBQBEBBCBAYIQAgBCgCJCAANgIEIABFBEAgBCgCJBAVIAQoAihBDkEAEBQgBEEANgI8DAMLIAQoAiQoAgRCADcDAAwBCyAEKAIkIAQpAzBBABDCAUEBcUUEQCAEKAIoQQ5BABAUIAQoAiQQMiAEQQA2AjwMAgsgBEIANwMIIARCADcDGCAEQgA3AxADQCAEKQMYIAQpAzBUBEAgBCgCOCAEKQMYp0EEdGopAwhQRQRAIAQoAjggBCkDGKdBBHRqKAIARQRAIAQoAihBEkEAEBQgBCgCJBAyIARBADYCPAwFCyAEKAIkKAIAIAQpAxCnQQR0aiAEKAI4IAQpAxinQQR0aigCADYCACAEKAIkKAIAIAQpAxCnQQR0aiAEKAI4IAQpAxinQQR0aikDCDcDCCAEKAIkKAIEIAQpAxinQQN0aiAEKQMINwMAIAQgBCgCOCAEKQMYp0EEdGopAwggBCkDCHw3AwggBCAEKQMQQgF8NwMQCyAEIAQpAxhCAXw3AxgMAQsLIAQoAiQgBCkDEDcDCCAEKAIkIAQoAiwEfkIABSAEKAIkKQMICzcDGCAEKAIkKAIEIAQoAiQpAwinQQN0aiAEKQMINwMAIAQoAiQgBCkDCDcDMAsgBCAEKAIkNgI8CyAEKAI8IQAgBEFAayQAIAALngEBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCGCAEKQMQIAQoAgwgBCgCCBA/IgA2AgQCQCAARQRAIARBADYCHAwBCyAEIAQoAgQoAjBBACAEKAIMIAQoAggQRiIANgIAIABFBEAgBEEANgIcDAELIAQgBCgCADYCHAsgBCgCHCEAIARBIGokACAAC5wIAQt/IABFBEAgARAYDwsgAUFATwRAQbSbAUEwNgIAQQAPCwJ/QRAgAUELakF4cSABQQtJGyEGIABBCGsiBSgCBCIJQXhxIQQCQCAJQQNxRQRAQQAgBkGAAkkNAhogBkEEaiAETQRAIAUhAiAEIAZrQcSfASgCAEEBdE0NAgtBAAwCCyAEIAVqIQcCQCAEIAZPBEAgBCAGayIDQRBJDQEgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAiADQQNyNgIEIAcgBygCBEEBcjYCBCACIAMQxgEMAQsgB0H8mwEoAgBGBEBB8JsBKAIAIARqIgQgBk0NAiAFIAlBAXEgBnJBAnI2AgQgBSAGaiIDIAQgBmsiAkEBcjYCBEHwmwEgAjYCAEH8mwEgAzYCAAwBCyAHQfibASgCAEYEQEHsmwEoAgAgBGoiAyAGSQ0CAkAgAyAGayICQRBPBEAgBSAJQQFxIAZyQQJyNgIEIAUgBmoiBCACQQFyNgIEIAMgBWoiAyACNgIAIAMgAygCBEF+cTYCBAwBCyAFIAlBAXEgA3JBAnI2AgQgAyAFaiICIAIoAgRBAXI2AgRBACECQQAhBAtB+JsBIAQ2AgBB7JsBIAI2AgAMAQsgBygCBCIDQQJxDQEgA0F4cSAEaiIKIAZJDQEgCiAGayEMAkAgA0H/AU0EQCAHKAIIIgQgA0EDdiICQQN0QYycAWpGGiAEIAcoAgwiA0YEQEHkmwFB5JsBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBygCGCELAkAgByAHKAIMIghHBEAgBygCCCICQfSbASgCAEkaIAIgCDYCDCAIIAI2AggMAQsCQCAHQRRqIgQoAgAiAg0AIAdBEGoiBCgCACICDQBBACEIDAELA0AgBCEDIAIiCEEUaiIEKAIAIgINACAIQRBqIQQgCCgCECICDQALIANBADYCAAsgC0UNAAJAIAcgBygCHCIDQQJ0QZSeAWoiAigCAEYEQCACIAg2AgAgCA0BQeibAUHomwEoAgBBfiADd3E2AgAMAgsgC0EQQRQgCygCECAHRhtqIAg2AgAgCEUNAQsgCCALNgIYIAcoAhAiAgRAIAggAjYCECACIAg2AhgLIAcoAhQiAkUNACAIIAI2AhQgAiAINgIYCyAMQQ9NBEAgBSAJQQFxIApyQQJyNgIEIAUgCmoiAiACKAIEQQFyNgIEDAELIAUgCUEBcSAGckECcjYCBCAFIAZqIgMgDEEDcjYCBCAFIApqIgIgAigCBEEBcjYCBCADIAwQxgELIAUhAgsgAgsiAgRAIAJBCGoPCyABEBgiBUUEQEEADwsgBSAAQXxBeCAAQQRrKAIAIgJBA3EbIAJBeHFqIgIgASABIAJLGxAZGiAAEBUgBQtDAQN/AkAgAkUNAANAIAAtAAAiBCABLQAAIgVGBEAgAUEBaiEBIABBAWohACACQQFrIgINAQwCCwsgBCAFayEDCyADC4wDAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE7ARYgBCACNgIQIAQgAzYCDAJAIAQvARZFBEAgBEEANgIcDAELAkACQAJAAkAgBCgCEEGAMHEiAARAIABBgBBGDQEgAEGAIEYNAgwDCyAEQQA2AgQMAwsgBEECNgIEDAILIARBBDYCBAwBCyAEKAIMQRJBABAUIARBADYCHAwBCyAEQRQQGCIANgIIIABFBEAgBCgCDEEOQQAQFCAEQQA2AhwMAQsgBC8BFkEBahAYIQAgBCgCCCAANgIAIABFBEAgBCgCCBAVIARBADYCHAwBCyAEKAIIKAIAIAQoAhggBC8BFhAZGiAEKAIIKAIAIAQvARZqQQA6AAAgBCgCCCAELwEWOwEEIAQoAghBADYCCCAEKAIIQQA2AgwgBCgCCEEANgIQIAQoAgQEQCAEKAIIIAQoAgQQOkEFRgRAIAQoAggQJCAEKAIMQRJBABAUIARBADYCHAwCCwsgBCAEKAIINgIcCyAEKAIcIQAgBEEgaiQAIAALNwEBfyMAQRBrIgEgADYCCAJAIAEoAghFBEAgAUEAOwEODAELIAEgASgCCC8BBDsBDgsgAS8BDguJAgEBfyMAQRBrIgEkACABIAA2AgwCQCABKAIMLQAFQQFxBEAgASgCDCgCAEECcUUNAQsgASgCDCgCMBAkIAEoAgxBADYCMAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEEIcUUNAQsgASgCDCgCNBAjIAEoAgxBADYCNAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEEEcUUNAQsgASgCDCgCOBAkIAEoAgxBADYCOAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEGAAXFFDQELIAEoAgwoAlQEQCABKAIMKAJUQQAgASgCDCgCVBAuEDMLIAEoAgwoAlQQFSABKAIMQQA2AlQLIAFBEGokAAvxAQEBfyMAQRBrIgEgADYCDCABKAIMQQA2AgAgASgCDEEAOgAEIAEoAgxBADoABSABKAIMQQE6AAYgASgCDEG/BjsBCCABKAIMQQo7AQogASgCDEEAOwEMIAEoAgxBfzYCECABKAIMQQA2AhQgASgCDEEANgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=\";ug(Io)||(Io=h(Io));function gg(d){try{if(d==Io&&V)return new Uint8Array(V);var E=da(d);if(E)return E;if(C)return C(d);throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}catch(I){wr(I)}}function Bp(d,E){var I,k,T;try{T=gg(d),k=new WebAssembly.Module(T),I=new WebAssembly.Instance(k,E)}catch(te){var Z=te.toString();throw D(\"failed to compile wasm module: \"+Z),(Z.includes(\"imported Memory\")||Z.includes(\"memory import\"))&&D(\"Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time).\"),te}return[I,k]}function Qp(){var d={a:Ca};function E(T,Z){var te=T.exports;t.asm=te,A=t.asm.u,Or(A.buffer),gi=t.asm.pa,dA(t.asm.v),EA(\"wasm-instantiate\")}if(mA(\"wasm-instantiate\"),t.instantiateWasm)try{var I=t.instantiateWasm(d,E);return I}catch(T){return D(\"Module.instantiateWasm callback failed with error: \"+T),!1}var k=Bp(Io,d);return E(k[0]),t.asm}var vr,se;function yo(d){for(;d.length>0;){var E=d.shift();if(typeof E==\"function\"){E(t);continue}var I=E.func;typeof I==\"number\"?E.arg===void 0?gi.get(I)():gi.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function Rn(d,E){var I=new Date(de[d>>2]*1e3);de[E>>2]=I.getUTCSeconds(),de[E+4>>2]=I.getUTCMinutes(),de[E+8>>2]=I.getUTCHours(),de[E+12>>2]=I.getUTCDate(),de[E+16>>2]=I.getUTCMonth(),de[E+20>>2]=I.getUTCFullYear()-1900,de[E+24>>2]=I.getUTCDay(),de[E+36>>2]=0,de[E+32>>2]=0;var k=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),T=(I.getTime()-k)/(1e3*60*60*24)|0;return de[E+28>>2]=T,Rn.GMTString||(Rn.GMTString=Be(\"GMT\")),de[E+40>>2]=Rn.GMTString,E}function fg(d,E){return Rn(d,E)}var Qt={splitPath:function(d){var E=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,k=d.length-1;k>=0;k--){var T=d[k];T===\".\"?d.splice(k,1):T===\"..\"?(d.splice(k,1),I++):I&&(d.splice(k,1),I--)}if(E)for(;I;I--)d.unshift(\"..\");return d},normalize:function(d){var E=d.charAt(0)===\"/\",I=d.substr(-1)===\"/\";return d=Qt.normalizeArray(d.split(\"/\").filter(function(k){return!!k}),!E).join(\"/\"),!d&&!E&&(d=\".\"),d&&I&&(d+=\"/\"),(E?\"/\":\"\")+d},dirname:function(d){var E=Qt.splitPath(d),I=E[0],k=E[1];return!I&&!k?\".\":(k&&(k=k.substr(0,k.length-1)),I+k)},basename:function(d){if(d===\"/\")return\"/\";d=Qt.normalize(d),d=d.replace(/\\/$/,\"\");var E=d.lastIndexOf(\"/\");return E===-1?d:d.substr(E+1)},extname:function(d){return Qt.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return Qt.normalize(d.join(\"/\"))},join2:function(d,E){return Qt.normalize(d+\"/\"+E)}};function Tl(){if(typeof crypto==\"object\"&&typeof crypto.getRandomValues==\"function\"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=J(\"crypto\");return function(){return E.randomBytes(1)[0]}}catch{}return function(){wr(\"randomDevice\")}}var Fn={resolve:function(){for(var d=\"\",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var k=I>=0?arguments[I]:S.cwd();if(typeof k!=\"string\")throw new TypeError(\"Arguments to path.resolve must be strings\");if(!k)return\"\";d=k+\"/\"+d,E=k.charAt(0)===\"/\"}return d=Qt.normalizeArray(d.split(\"/\").filter(function(T){return!!T}),!E).join(\"/\"),(E?\"/\":\"\")+d||\".\"},relative:function(d,E){d=Fn.resolve(d).substr(1),E=Fn.resolve(E).substr(1);function I(Je){for(var nt=0;nt<Je.length&&Je[nt]===\"\";nt++);for(var wt=Je.length-1;wt>=0&&Je[wt]===\"\";wt--);return nt>wt?[]:Je.slice(nt,wt-nt+1)}for(var k=I(d.split(\"/\")),T=I(E.split(\"/\")),Z=Math.min(k.length,T.length),te=Z,we=0;we<Z;we++)if(k[we]!==T[we]){te=we;break}for(var me=[],we=te;we<k.length;we++)me.push(\"..\");return me=me.concat(T.slice(te)),me.join(\"/\")}},ns={ttys:[],init:function(){},shutdown:function(){},register:function(d,E){ns.ttys[d]={input:[],output:[],ops:E},S.registerDevice(d,ns.stream_ops)},stream_ops:{open:function(d){var E=ns.ttys[d.node.rdev];if(!E)throw new S.ErrnoError(43);d.tty=E,d.seekable=!1},close:function(d){d.tty.ops.flush(d.tty)},flush:function(d){d.tty.ops.flush(d.tty)},read:function(d,E,I,k,T){if(!d.tty||!d.tty.ops.get_char)throw new S.ErrnoError(60);for(var Z=0,te=0;te<k;te++){var we;try{we=d.tty.ops.get_char(d.tty)}catch{throw new S.ErrnoError(29)}if(we===void 0&&Z===0)throw new S.ErrnoError(6);if(we==null)break;Z++,E[I+te]=we}return Z&&(d.node.timestamp=Date.now()),Z},write:function(d,E,I,k,T){if(!d.tty||!d.tty.ops.put_char)throw new S.ErrnoError(60);try{for(var Z=0;Z<k;Z++)d.tty.ops.put_char(d.tty,E[I+Z])}catch{throw new S.ErrnoError(29)}return k&&(d.node.timestamp=Date.now()),Z}},default_tty_ops:{get_char:function(d){if(!d.input.length){var E=null;if(g){var I=256,k=Buffer.alloc?Buffer.alloc(I):new Buffer(I),T=0;try{T=y.readSync(process.stdin.fd,k,0,I,null)}catch(Z){if(Z.toString().includes(\"EOF\"))T=0;else throw Z}T>0?E=k.slice(0,T).toString(\"utf-8\"):E=null}else typeof window<\"u\"&&typeof window.prompt==\"function\"?(E=window.prompt(\"Input: \"),E!==null&&(E+=`\n`)):typeof readline==\"function\"&&(E=readline(),E!==null&&(E+=`\n`));if(!E)return null;d.input=yA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(v(ke(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(v(ke(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(D(ke(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(D(ke(d.output,0)),d.output=[])}}};function ss(d){for(var E=H(d,65536),I=dt(E);d<E;)ne[I+d++]=0;return I}var gt={ops_table:null,mount:function(d){return gt.createNode(null,\"/\",16895,0)},createNode:function(d,E,I,k){if(S.isBlkdev(I)||S.isFIFO(I))throw new S.ErrnoError(63);gt.ops_table||(gt.ops_table={dir:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr,lookup:gt.node_ops.lookup,mknod:gt.node_ops.mknod,rename:gt.node_ops.rename,unlink:gt.node_ops.unlink,rmdir:gt.node_ops.rmdir,readdir:gt.node_ops.readdir,symlink:gt.node_ops.symlink},stream:{llseek:gt.stream_ops.llseek}},file:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr},stream:{llseek:gt.stream_ops.llseek,read:gt.stream_ops.read,write:gt.stream_ops.write,allocate:gt.stream_ops.allocate,mmap:gt.stream_ops.mmap,msync:gt.stream_ops.msync}},link:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr,readlink:gt.node_ops.readlink},stream:{}},chrdev:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr},stream:S.chrdev_stream_ops}});var T=S.createNode(d,E,I,k);return S.isDir(T.mode)?(T.node_ops=gt.ops_table.dir.node,T.stream_ops=gt.ops_table.dir.stream,T.contents={}):S.isFile(T.mode)?(T.node_ops=gt.ops_table.file.node,T.stream_ops=gt.ops_table.file.stream,T.usedBytes=0,T.contents=null):S.isLink(T.mode)?(T.node_ops=gt.ops_table.link.node,T.stream_ops=gt.ops_table.link.stream):S.isChrdev(T.mode)&&(T.node_ops=gt.ops_table.chrdev.node,T.stream_ops=gt.ops_table.chrdev.stream),T.timestamp=Date.now(),d&&(d.contents[E]=T,d.timestamp=T.timestamp),T},getFileDataAsTypedArray:function(d){return d.contents?d.contents.subarray?d.contents.subarray(0,d.usedBytes):new Uint8Array(d.contents):new Uint8Array(0)},expandFileStorage:function(d,E){var I=d.contents?d.contents.length:0;if(!(I>=E)){var k=1024*1024;E=Math.max(E,I*(I<k?2:1.125)>>>0),I!=0&&(E=Math.max(E,256));var T=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(T.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=S.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,S.isDir(d.mode)?E.size=4096:S.isFile(d.mode)?E.size=d.usedBytes:S.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&gt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw S.genericErrors[44]},mknod:function(d,E,I,k){return gt.createNode(d,E,I,k)},rename:function(d,E,I){if(S.isDir(d.mode)){var k;try{k=S.lookupNode(E,I)}catch{}if(k)for(var T in k.contents)throw new S.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=S.lookupNode(d,E);for(var k in I.contents)throw new S.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[\".\",\"..\"];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var k=gt.createNode(d,E,41471,0);return k.link=I,k},readlink:function(d){if(!S.isLink(d.mode))throw new S.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,k,T){var Z=d.node.contents;if(T>=d.node.usedBytes)return 0;var te=Math.min(d.node.usedBytes-T,k);if(te>8&&Z.subarray)E.set(Z.subarray(T,T+te),I);else for(var we=0;we<te;we++)E[I+we]=Z[T+we];return te},write:function(d,E,I,k,T,Z){if(E.buffer===ne.buffer&&(Z=!1),!k)return 0;var te=d.node;if(te.timestamp=Date.now(),E.subarray&&(!te.contents||te.contents.subarray)){if(Z)return te.contents=E.subarray(I,I+k),te.usedBytes=k,k;if(te.usedBytes===0&&T===0)return te.contents=E.slice(I,I+k),te.usedBytes=k,k;if(T+k<=te.usedBytes)return te.contents.set(E.subarray(I,I+k),T),k}if(gt.expandFileStorage(te,T+k),te.contents.subarray&&E.subarray)te.contents.set(E.subarray(I,I+k),T);else for(var we=0;we<k;we++)te.contents[T+we]=E[I+we];return te.usedBytes=Math.max(te.usedBytes,T+k),k},llseek:function(d,E,I){var k=E;if(I===1?k+=d.position:I===2&&S.isFile(d.node.mode)&&(k+=d.node.usedBytes),k<0)throw new S.ErrnoError(28);return k},allocate:function(d,E,I){gt.expandFileStorage(d.node,E+I),d.node.usedBytes=Math.max(d.node.usedBytes,E+I)},mmap:function(d,E,I,k,T,Z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var te,we,me=d.node.contents;if(!(Z&2)&&me.buffer===qe)we=!1,te=me.byteOffset;else{if((k>0||k+I<me.length)&&(me.subarray?me=me.subarray(k,k+I):me=Array.prototype.slice.call(me,k,k+I)),we=!0,te=ss(I),!te)throw new S.ErrnoError(48);ne.set(me,te)}return{ptr:te,allocated:we}},msync:function(d,E,I,k,T){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(T&2)return 0;var Z=gt.stream_ops.write(d,E,0,k,I,!1);return 0}}},wo={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135},At={isWindows:!1,staticInit:function(){At.isWindows=!!process.platform.match(/^win/);var d={fs:Te.constants};d.fs&&(d=d.fs),At.flagsForNodeMap={1024:d.O_APPEND,64:d.O_CREAT,128:d.O_EXCL,256:d.O_NOCTTY,0:d.O_RDONLY,2:d.O_RDWR,4096:d.O_SYNC,512:d.O_TRUNC,1:d.O_WRONLY}},bufferFrom:function(d){return Buffer.alloc?Buffer.from(d):new Buffer(d)},convertNodeCode:function(d){var E=d.code;return wo[E]},mount:function(d){return At.createNode(null,\"/\",At.getMode(d.opts.root),0)},createNode:function(d,E,I,k){if(!S.isDir(I)&&!S.isFile(I)&&!S.isLink(I))throw new S.ErrnoError(28);var T=S.createNode(d,E,I);return T.node_ops=At.node_ops,T.stream_ops=At.stream_ops,T},getMode:function(d){var E;try{E=Te.lstatSync(d),At.isWindows&&(E.mode=E.mode|(E.mode&292)>>2)}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),Qt.join.apply(null,E)},flagsForNode:function(d){d&=-2097153,d&=-2049,d&=-32769,d&=-524289;var E=0;for(var I in At.flagsForNodeMap)d&I&&(E|=At.flagsForNodeMap[I],d^=I);if(d)throw new S.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=At.realPath(d),I;try{I=Te.lstatSync(E)}catch(k){throw k.code?new S.ErrnoError(At.convertNodeCode(k)):k}return At.isWindows&&!I.blksize&&(I.blksize=4096),At.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=At.realPath(d);try{if(E.mode!==void 0&&(Te.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var k=new Date(E.timestamp);Te.utimesSync(I,k,k)}E.size!==void 0&&Te.truncateSync(I,E.size)}catch(T){throw T.code?new S.ErrnoError(At.convertNodeCode(T)):T}},lookup:function(d,E){var I=Qt.join2(At.realPath(d),E),k=At.getMode(I);return At.createNode(d,E,k)},mknod:function(d,E,I,k){var T=At.createNode(d,E,I,k),Z=At.realPath(T);try{S.isDir(T.mode)?Te.mkdirSync(Z,T.mode):Te.writeFileSync(Z,\"\",{mode:T.mode})}catch(te){throw te.code?new S.ErrnoError(At.convertNodeCode(te)):te}return T},rename:function(d,E,I){var k=At.realPath(d),T=Qt.join2(At.realPath(E),I);try{Te.renameSync(k,T)}catch(Z){throw Z.code?new S.ErrnoError(At.convertNodeCode(Z)):Z}d.name=I},unlink:function(d,E){var I=Qt.join2(At.realPath(d),E);try{Te.unlinkSync(I)}catch(k){throw k.code?new S.ErrnoError(At.convertNodeCode(k)):k}},rmdir:function(d,E){var I=Qt.join2(At.realPath(d),E);try{Te.rmdirSync(I)}catch(k){throw k.code?new S.ErrnoError(At.convertNodeCode(k)):k}},readdir:function(d){var E=At.realPath(d);try{return Te.readdirSync(E)}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}},symlink:function(d,E,I){var k=Qt.join2(At.realPath(d),E);try{Te.symlinkSync(I,k)}catch(T){throw T.code?new S.ErrnoError(At.convertNodeCode(T)):T}},readlink:function(d){var E=At.realPath(d);try{return E=Te.readlinkSync(E),E=dg.relative(dg.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=At.realPath(d.node);try{S.isFile(d.node.mode)&&(d.nfd=Te.openSync(E,At.flagsForNode(d.flags)))}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}},close:function(d){try{S.isFile(d.node.mode)&&d.nfd&&Te.closeSync(d.nfd)}catch(E){throw E.code?new S.ErrnoError(At.convertNodeCode(E)):E}},read:function(d,E,I,k,T){if(k===0)return 0;try{return Te.readSync(d.nfd,At.bufferFrom(E.buffer),I,k,T)}catch(Z){throw new S.ErrnoError(At.convertNodeCode(Z))}},write:function(d,E,I,k,T){try{return Te.writeSync(d.nfd,At.bufferFrom(E.buffer),I,k,T)}catch(Z){throw new S.ErrnoError(At.convertNodeCode(Z))}},llseek:function(d,E,I){var k=E;if(I===1)k+=d.position;else if(I===2&&S.isFile(d.node.mode))try{var T=Te.fstatSync(d.nfd);k+=T.size}catch(Z){throw new S.ErrnoError(At.convertNodeCode(Z))}if(k<0)throw new S.ErrnoError(28);return k},mmap:function(d,E,I,k,T,Z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var te=ss(I);return At.stream_ops.read(d,ne,te,I,k),{ptr:te,allocated:!0}},msync:function(d,E,I,k,T){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(T&2)return 0;var Z=At.stream_ops.write(d,E,0,k,I,!1);return 0}}},An={lookupPath:function(d){return{path:d,node:{mode:At.getMode(d)}}},createStandardStreams:function(){S.streams[0]={fd:0,nfd:0,position:0,path:\"\",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)S.streams[d]={fd:d,nfd:d,position:0,path:\"\",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){S.isDir(d)?Te.mkdirSync(d,E):Te.writeFileSync(d,\"\",{mode:E})},mkdir:function(){Te.mkdirSync.apply(void 0,arguments)},symlink:function(){Te.symlinkSync.apply(void 0,arguments)},rename:function(){Te.renameSync.apply(void 0,arguments)},rmdir:function(){Te.rmdirSync.apply(void 0,arguments)},readdir:function(){Te.readdirSync.apply(void 0,arguments)},unlink:function(){Te.unlinkSync.apply(void 0,arguments)},readlink:function(){return Te.readlinkSync.apply(void 0,arguments)},stat:function(){return Te.statSync.apply(void 0,arguments)},lstat:function(){return Te.lstatSync.apply(void 0,arguments)},chmod:function(){Te.chmodSync.apply(void 0,arguments)},fchmod:function(){Te.fchmodSync.apply(void 0,arguments)},chown:function(){Te.chownSync.apply(void 0,arguments)},fchown:function(){Te.fchownSync.apply(void 0,arguments)},truncate:function(){Te.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new S.ErrnoError(28);Te.ftruncateSync.apply(void 0,arguments)},utime:function(){Te.utimesSync.apply(void 0,arguments)},open:function(d,E,I,k){typeof E==\"string\"&&(E=Hs.modeStringToFlags(E));var T=Te.openSync(d,At.flagsForNode(E),I),Z=k!=null?k:S.nextfd(T),te={fd:Z,nfd:T,position:0,path:d,flags:E,seekable:!0};return S.streams[Z]=te,te},close:function(d){d.stream_ops||Te.closeSync(d.nfd),S.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return Hs.llseek(d,E,I);var k=E;if(I===1)k+=d.position;else if(I===2)k+=Te.fstatSync(d.nfd).size;else if(I!==0)throw new S.ErrnoError(wo.EINVAL);if(k<0)throw new S.ErrnoError(wo.EINVAL);return d.position=k,k},read:function(d,E,I,k,T){if(d.stream_ops)return Hs.read(d,E,I,k,T);var Z=typeof T<\"u\";!Z&&d.seekable&&(T=d.position);var te=Te.readSync(d.nfd,At.bufferFrom(E.buffer),I,k,T);return Z||(d.position+=te),te},write:function(d,E,I,k,T){if(d.stream_ops)return Hs.write(d,E,I,k,T);d.flags&+\"1024\"&&S.llseek(d,0,+\"2\");var Z=typeof T<\"u\";!Z&&d.seekable&&(T=d.position);var te=Te.writeSync(d.nfd,At.bufferFrom(E.buffer),I,k,T);return Z||(d.position+=te),te},allocate:function(){throw new S.ErrnoError(wo.EOPNOTSUPP)},mmap:function(d,E,I,k,T,Z){if(d.stream_ops)return Hs.mmap(d,E,I,k,T,Z);if(E!==0)throw new S.ErrnoError(28);var te=ss(I);return S.read(d,ne,te,I,k),{ptr:te,allocated:!0}},msync:function(d,E,I,k,T){return d.stream_ops?Hs.msync(d,E,I,k,T):(T&2||S.write(d,E,0,k,I),0)},munmap:function(){return 0},ioctl:function(){throw new S.ErrnoError(wo.ENOTTY)}},S={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Fn.resolve(S.cwd(),d),E=E||{},!d)return{path:\"\",node:null};var I={follow_mount:!0,recurse_count:0};for(var k in I)E[k]===void 0&&(E[k]=I[k]);if(E.recurse_count>8)throw new S.ErrnoError(32);for(var T=Qt.normalizeArray(d.split(\"/\").filter(function(lt){return!!lt}),!1),Z=S.root,te=\"/\",we=0;we<T.length;we++){var me=we===T.length-1;if(me&&E.parent)break;if(Z=S.lookupNode(Z,T[we]),te=Qt.join2(te,T[we]),S.isMountpoint(Z)&&(!me||me&&E.follow_mount)&&(Z=Z.mounted.root),!me||E.follow)for(var Je=0;S.isLink(Z.mode);){var nt=S.readlink(te);te=Fn.resolve(Qt.dirname(te),nt);var wt=S.lookupPath(te,{recurse_count:E.recurse_count});if(Z=wt.node,Je++>40)throw new S.ErrnoError(32)}}return{path:te,node:Z}},getPath:function(d){for(var E;;){if(S.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!==\"/\"?I+\"/\"+E:I+E:I}E=E?d.name+\"/\"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,k=0;k<E.length;k++)I=(I<<5)-I+E.charCodeAt(k)|0;return(d+I>>>0)%S.nameTable.length},hashAddNode:function(d){var E=S.hashName(d.parent.id,d.name);d.name_next=S.nameTable[E],S.nameTable[E]=d},hashRemoveNode:function(d){var E=S.hashName(d.parent.id,d.name);if(S.nameTable[E]===d)S.nameTable[E]=d.name_next;else for(var I=S.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=S.mayLookup(d);if(I)throw new S.ErrnoError(I,d);for(var k=S.hashName(d.id,E),T=S.nameTable[k];T;T=T.name_next){var Z=T.name;if(T.parent.id===d.id&&Z===E)return T}return S.lookup(d,E)},createNode:function(d,E,I,k){var T=new S.FSNode(d,E,I,k);return S.hashAddNode(T),T},destroyNode:function(d){S.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)===32768},isDir:function(d){return(d&61440)===16384},isLink:function(d){return(d&61440)===40960},isChrdev:function(d){return(d&61440)===8192},isBlkdev:function(d){return(d&61440)===24576},isFIFO:function(d){return(d&61440)===4096},isSocket:function(d){return(d&49152)===49152},flagModes:{r:0,\"r+\":2,w:577,\"w+\":578,a:1089,\"a+\":1090},modeStringToFlags:function(d){var E=S.flagModes[d];if(typeof E>\"u\")throw new Error(\"Unknown file open mode: \"+d);return E},flagsToPermissionString:function(d){var E=[\"r\",\"w\",\"rw\"][d&3];return d&512&&(E+=\"w\"),E},nodePermissions:function(d,E){return S.ignorePermissions?0:E.includes(\"r\")&&!(d.mode&292)||E.includes(\"w\")&&!(d.mode&146)||E.includes(\"x\")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=S.nodePermissions(d,\"x\");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=S.lookupNode(d,E);return 20}catch{}return S.nodePermissions(d,\"wx\")},mayDelete:function(d,E,I){var k;try{k=S.lookupNode(d,E)}catch(Z){return Z.errno}var T=S.nodePermissions(d,\"wx\");if(T)return T;if(I){if(!S.isDir(k.mode))return 54;if(S.isRoot(k)||S.getPath(k)===S.cwd())return 10}else if(S.isDir(k.mode))return 31;return 0},mayOpen:function(d,E){return d?S.isLink(d.mode)?32:S.isDir(d.mode)&&(S.flagsToPermissionString(E)!==\"r\"||E&512)?31:S.nodePermissions(d,S.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||S.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!S.streams[I])return I;throw new S.ErrnoError(33)},getStream:function(d){return S.streams[d]},createStream:function(d,E,I){S.FSStream||(S.FSStream=function(){},S.FSStream.prototype={object:{get:function(){return this.node},set:function(te){this.node=te}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}});var k=new S.FSStream;for(var T in d)k[T]=d[T];d=k;var Z=S.nextfd(E,I);return d.fd=Z,S.streams[Z]=d,d},closeStream:function(d){S.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=S.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new S.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){S.devices[d]={stream_ops:E}},getDevice:function(d){return S.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var k=I.pop();E.push(k),I.push.apply(I,k.mounts)}return E},syncfs:function(d,E){typeof d==\"function\"&&(E=d,d=!1),S.syncFSRequests++,S.syncFSRequests>1&&D(\"warning: \"+S.syncFSRequests+\" FS.syncfs operations in flight at once, probably just doing extra work\");var I=S.getMounts(S.root.mount),k=0;function T(te){return S.syncFSRequests--,E(te)}function Z(te){if(te)return Z.errored?void 0:(Z.errored=!0,T(te));++k>=I.length&&T(null)}I.forEach(function(te){if(!te.type.syncfs)return Z(null);te.type.syncfs(te,d,Z)})},mount:function(d,E,I){var k=I===\"/\",T=!I,Z;if(k&&S.root)throw new S.ErrnoError(10);if(!k&&!T){var te=S.lookupPath(I,{follow_mount:!1});if(I=te.path,Z=te.node,S.isMountpoint(Z))throw new S.ErrnoError(10);if(!S.isDir(Z.mode))throw new S.ErrnoError(54)}var we={type:d,opts:E,mountpoint:I,mounts:[]},me=d.mount(we);return me.mount=we,we.root=me,k?S.root=me:Z&&(Z.mounted=we,Z.mount&&Z.mount.mounts.push(we)),me},unmount:function(d){var E=S.lookupPath(d,{follow_mount:!1});if(!S.isMountpoint(E.node))throw new S.ErrnoError(28);var I=E.node,k=I.mounted,T=S.getMounts(k);Object.keys(S.nameTable).forEach(function(te){for(var we=S.nameTable[te];we;){var me=we.name_next;T.includes(we.mount)&&S.destroyNode(we),we=me}}),I.mounted=null;var Z=I.mount.mounts.indexOf(k);I.mount.mounts.splice(Z,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var k=S.lookupPath(d,{parent:!0}),T=k.node,Z=Qt.basename(d);if(!Z||Z===\".\"||Z===\"..\")throw new S.ErrnoError(28);var te=S.mayCreate(T,Z);if(te)throw new S.ErrnoError(te);if(!T.node_ops.mknod)throw new S.ErrnoError(63);return T.node_ops.mknod(T,Z,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,S.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=1023,E|=16384,S.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split(\"/\"),k=\"\",T=0;T<I.length;++T)if(!!I[T]){k+=\"/\"+I[T];try{S.mkdir(k,E)}catch(Z){if(Z.errno!=20)throw Z}}},mkdev:function(d,E,I){return typeof I>\"u\"&&(I=E,E=438),E|=8192,S.mknod(d,E,I)},symlink:function(d,E){if(!Fn.resolve(d))throw new S.ErrnoError(44);var I=S.lookupPath(E,{parent:!0}),k=I.node;if(!k)throw new S.ErrnoError(44);var T=Qt.basename(E),Z=S.mayCreate(k,T);if(Z)throw new S.ErrnoError(Z);if(!k.node_ops.symlink)throw new S.ErrnoError(63);return k.node_ops.symlink(k,T,d)},rename:function(d,E){var I=Qt.dirname(d),k=Qt.dirname(E),T=Qt.basename(d),Z=Qt.basename(E),te,we,me;if(te=S.lookupPath(d,{parent:!0}),we=te.node,te=S.lookupPath(E,{parent:!0}),me=te.node,!we||!me)throw new S.ErrnoError(44);if(we.mount!==me.mount)throw new S.ErrnoError(75);var Je=S.lookupNode(we,T),nt=Fn.relative(d,k);if(nt.charAt(0)!==\".\")throw new S.ErrnoError(28);if(nt=Fn.relative(E,I),nt.charAt(0)!==\".\")throw new S.ErrnoError(55);var wt;try{wt=S.lookupNode(me,Z)}catch{}if(Je!==wt){var lt=S.isDir(Je.mode),it=S.mayDelete(we,T,lt);if(it)throw new S.ErrnoError(it);if(it=wt?S.mayDelete(me,Z,lt):S.mayCreate(me,Z),it)throw new S.ErrnoError(it);if(!we.node_ops.rename)throw new S.ErrnoError(63);if(S.isMountpoint(Je)||wt&&S.isMountpoint(wt))throw new S.ErrnoError(10);if(me!==we&&(it=S.nodePermissions(we,\"w\"),it))throw new S.ErrnoError(it);try{S.trackingDelegate.willMovePath&&S.trackingDelegate.willMovePath(d,E)}catch(Et){D(\"FS.trackingDelegate['willMovePath']('\"+d+\"', '\"+E+\"') threw an exception: \"+Et.message)}S.hashRemoveNode(Je);try{we.node_ops.rename(Je,me,Z)}catch(Et){throw Et}finally{S.hashAddNode(Je)}try{S.trackingDelegate.onMovePath&&S.trackingDelegate.onMovePath(d,E)}catch(Et){D(\"FS.trackingDelegate['onMovePath']('\"+d+\"', '\"+E+\"') threw an exception: \"+Et.message)}}},rmdir:function(d){var E=S.lookupPath(d,{parent:!0}),I=E.node,k=Qt.basename(d),T=S.lookupNode(I,k),Z=S.mayDelete(I,k,!0);if(Z)throw new S.ErrnoError(Z);if(!I.node_ops.rmdir)throw new S.ErrnoError(63);if(S.isMountpoint(T))throw new S.ErrnoError(10);try{S.trackingDelegate.willDeletePath&&S.trackingDelegate.willDeletePath(d)}catch(te){D(\"FS.trackingDelegate['willDeletePath']('\"+d+\"') threw an exception: \"+te.message)}I.node_ops.rmdir(I,k),S.destroyNode(T);try{S.trackingDelegate.onDeletePath&&S.trackingDelegate.onDeletePath(d)}catch(te){D(\"FS.trackingDelegate['onDeletePath']('\"+d+\"') threw an exception: \"+te.message)}},readdir:function(d){var E=S.lookupPath(d,{follow:!0}),I=E.node;if(!I.node_ops.readdir)throw new S.ErrnoError(54);return I.node_ops.readdir(I)},unlink:function(d){var E=S.lookupPath(d,{parent:!0}),I=E.node,k=Qt.basename(d),T=S.lookupNode(I,k),Z=S.mayDelete(I,k,!1);if(Z)throw new S.ErrnoError(Z);if(!I.node_ops.unlink)throw new S.ErrnoError(63);if(S.isMountpoint(T))throw new S.ErrnoError(10);try{S.trackingDelegate.willDeletePath&&S.trackingDelegate.willDeletePath(d)}catch(te){D(\"FS.trackingDelegate['willDeletePath']('\"+d+\"') threw an exception: \"+te.message)}I.node_ops.unlink(I,k),S.destroyNode(T);try{S.trackingDelegate.onDeletePath&&S.trackingDelegate.onDeletePath(d)}catch(te){D(\"FS.trackingDelegate['onDeletePath']('\"+d+\"') threw an exception: \"+te.message)}},readlink:function(d){var E=S.lookupPath(d),I=E.node;if(!I)throw new S.ErrnoError(44);if(!I.node_ops.readlink)throw new S.ErrnoError(28);return Fn.resolve(S.getPath(I.parent),I.node_ops.readlink(I))},stat:function(d,E){var I=S.lookupPath(d,{follow:!E}),k=I.node;if(!k)throw new S.ErrnoError(44);if(!k.node_ops.getattr)throw new S.ErrnoError(63);return k.node_ops.getattr(k)},lstat:function(d){return S.stat(d,!0)},chmod:function(d,E,I){var k;if(typeof d==\"string\"){var T=S.lookupPath(d,{follow:!I});k=T.node}else k=d;if(!k.node_ops.setattr)throw new S.ErrnoError(63);k.node_ops.setattr(k,{mode:E&4095|k.mode&-4096,timestamp:Date.now()})},lchmod:function(d,E){S.chmod(d,E,!0)},fchmod:function(d,E){var I=S.getStream(d);if(!I)throw new S.ErrnoError(8);S.chmod(I.node,E)},chown:function(d,E,I,k){var T;if(typeof d==\"string\"){var Z=S.lookupPath(d,{follow:!k});T=Z.node}else T=d;if(!T.node_ops.setattr)throw new S.ErrnoError(63);T.node_ops.setattr(T,{timestamp:Date.now()})},lchown:function(d,E,I){S.chown(d,E,I,!0)},fchown:function(d,E,I){var k=S.getStream(d);if(!k)throw new S.ErrnoError(8);S.chown(k.node,E,I)},truncate:function(d,E){if(E<0)throw new S.ErrnoError(28);var I;if(typeof d==\"string\"){var k=S.lookupPath(d,{follow:!0});I=k.node}else I=d;if(!I.node_ops.setattr)throw new S.ErrnoError(63);if(S.isDir(I.mode))throw new S.ErrnoError(31);if(!S.isFile(I.mode))throw new S.ErrnoError(28);var T=S.nodePermissions(I,\"w\");if(T)throw new S.ErrnoError(T);I.node_ops.setattr(I,{size:E,timestamp:Date.now()})},ftruncate:function(d,E){var I=S.getStream(d);if(!I)throw new S.ErrnoError(8);if((I.flags&2097155)===0)throw new S.ErrnoError(28);S.truncate(I.node,E)},utime:function(d,E,I){var k=S.lookupPath(d,{follow:!0}),T=k.node;T.node_ops.setattr(T,{timestamp:Math.max(E,I)})},open:function(d,E,I,k,T){if(d===\"\")throw new S.ErrnoError(44);E=typeof E==\"string\"?S.modeStringToFlags(E):E,I=typeof I>\"u\"?438:I,E&64?I=I&4095|32768:I=0;var Z;if(typeof d==\"object\")Z=d;else{d=Qt.normalize(d);try{var te=S.lookupPath(d,{follow:!(E&131072)});Z=te.node}catch{}}var we=!1;if(E&64)if(Z){if(E&128)throw new S.ErrnoError(20)}else Z=S.mknod(d,I,0),we=!0;if(!Z)throw new S.ErrnoError(44);if(S.isChrdev(Z.mode)&&(E&=-513),E&65536&&!S.isDir(Z.mode))throw new S.ErrnoError(54);if(!we){var me=S.mayOpen(Z,E);if(me)throw new S.ErrnoError(me)}E&512&&S.truncate(Z,0),E&=-131713;var Je=S.createStream({node:Z,path:S.getPath(Z),flags:E,seekable:!0,position:0,stream_ops:Z.stream_ops,ungotten:[],error:!1},k,T);Je.stream_ops.open&&Je.stream_ops.open(Je),t.logReadFiles&&!(E&1)&&(S.readFiles||(S.readFiles={}),d in S.readFiles||(S.readFiles[d]=1,D(\"FS.trackingDelegate error on read file: \"+d)));try{if(S.trackingDelegate.onOpenFile){var nt=0;(E&2097155)!==1&&(nt|=S.tracking.openFlags.READ),(E&2097155)!==0&&(nt|=S.tracking.openFlags.WRITE),S.trackingDelegate.onOpenFile(d,nt)}}catch(wt){D(\"FS.trackingDelegate['onOpenFile']('\"+d+\"', flags) threw an exception: \"+wt.message)}return Je},close:function(d){if(S.isClosed(d))throw new S.ErrnoError(8);d.getdents&&(d.getdents=null);try{d.stream_ops.close&&d.stream_ops.close(d)}catch(E){throw E}finally{S.closeStream(d.fd)}d.fd=null},isClosed:function(d){return d.fd===null},llseek:function(d,E,I){if(S.isClosed(d))throw new S.ErrnoError(8);if(!d.seekable||!d.stream_ops.llseek)throw new S.ErrnoError(70);if(I!=0&&I!=1&&I!=2)throw new S.ErrnoError(28);return d.position=d.stream_ops.llseek(d,E,I),d.ungotten=[],d.position},read:function(d,E,I,k,T){if(k<0||T<0)throw new S.ErrnoError(28);if(S.isClosed(d))throw new S.ErrnoError(8);if((d.flags&2097155)===1)throw new S.ErrnoError(8);if(S.isDir(d.node.mode))throw new S.ErrnoError(31);if(!d.stream_ops.read)throw new S.ErrnoError(28);var Z=typeof T<\"u\";if(!Z)T=d.position;else if(!d.seekable)throw new S.ErrnoError(70);var te=d.stream_ops.read(d,E,I,k,T);return Z||(d.position+=te),te},write:function(d,E,I,k,T,Z){if(k<0||T<0)throw new S.ErrnoError(28);if(S.isClosed(d))throw new S.ErrnoError(8);if((d.flags&2097155)===0)throw new S.ErrnoError(8);if(S.isDir(d.node.mode))throw new S.ErrnoError(31);if(!d.stream_ops.write)throw new S.ErrnoError(28);d.seekable&&d.flags&1024&&S.llseek(d,0,2);var te=typeof T<\"u\";if(!te)T=d.position;else if(!d.seekable)throw new S.ErrnoError(70);var we=d.stream_ops.write(d,E,I,k,T,Z);te||(d.position+=we);try{d.path&&S.trackingDelegate.onWriteToFile&&S.trackingDelegate.onWriteToFile(d.path)}catch(me){D(\"FS.trackingDelegate['onWriteToFile']('\"+d.path+\"') threw an exception: \"+me.message)}return we},allocate:function(d,E,I){if(S.isClosed(d))throw new S.ErrnoError(8);if(E<0||I<=0)throw new S.ErrnoError(28);if((d.flags&2097155)===0)throw new S.ErrnoError(8);if(!S.isFile(d.node.mode)&&!S.isDir(d.node.mode))throw new S.ErrnoError(43);if(!d.stream_ops.allocate)throw new S.ErrnoError(138);d.stream_ops.allocate(d,E,I)},mmap:function(d,E,I,k,T,Z){if((T&2)!==0&&(Z&2)===0&&(d.flags&2097155)!==2)throw new S.ErrnoError(2);if((d.flags&2097155)===1)throw new S.ErrnoError(2);if(!d.stream_ops.mmap)throw new S.ErrnoError(43);return d.stream_ops.mmap(d,E,I,k,T,Z)},msync:function(d,E,I,k,T){return!d||!d.stream_ops.msync?0:d.stream_ops.msync(d,E,I,k,T)},munmap:function(d){return 0},ioctl:function(d,E,I){if(!d.stream_ops.ioctl)throw new S.ErrnoError(59);return d.stream_ops.ioctl(d,E,I)},readFile:function(d,E){if(E=E||{},E.flags=E.flags||0,E.encoding=E.encoding||\"binary\",E.encoding!==\"utf8\"&&E.encoding!==\"binary\")throw new Error('Invalid encoding type \"'+E.encoding+'\"');var I,k=S.open(d,E.flags),T=S.stat(d),Z=T.size,te=new Uint8Array(Z);return S.read(k,te,0,Z,0),E.encoding===\"utf8\"?I=ke(te,0):E.encoding===\"binary\"&&(I=te),S.close(k),I},writeFile:function(d,E,I){I=I||{},I.flags=I.flags||577;var k=S.open(d,I.flags,I.mode);if(typeof E==\"string\"){var T=new Uint8Array(le(E)+1),Z=Ne(E,T,0,T.length);S.write(k,T,0,Z,void 0,I.canOwn)}else if(ArrayBuffer.isView(E))S.write(k,E,0,E.byteLength,void 0,I.canOwn);else throw new Error(\"Unsupported data type\");S.close(k)},cwd:function(){return S.currentPath},chdir:function(d){var E=S.lookupPath(d,{follow:!0});if(E.node===null)throw new S.ErrnoError(44);if(!S.isDir(E.node.mode))throw new S.ErrnoError(54);var I=S.nodePermissions(E.node,\"x\");if(I)throw new S.ErrnoError(I);S.currentPath=E.path},createDefaultDirectories:function(){S.mkdir(\"/tmp\"),S.mkdir(\"/home\"),S.mkdir(\"/home/web_user\")},createDefaultDevices:function(){S.mkdir(\"/dev\"),S.registerDevice(S.makedev(1,3),{read:function(){return 0},write:function(E,I,k,T,Z){return T}}),S.mkdev(\"/dev/null\",S.makedev(1,3)),ns.register(S.makedev(5,0),ns.default_tty_ops),ns.register(S.makedev(6,0),ns.default_tty1_ops),S.mkdev(\"/dev/tty\",S.makedev(5,0)),S.mkdev(\"/dev/tty1\",S.makedev(6,0));var d=Tl();S.createDevice(\"/dev\",\"random\",d),S.createDevice(\"/dev\",\"urandom\",d),S.mkdir(\"/dev/shm\"),S.mkdir(\"/dev/shm/tmp\")},createSpecialDirectories:function(){S.mkdir(\"/proc\");var d=S.mkdir(\"/proc/self\");S.mkdir(\"/proc/self/fd\"),S.mount({mount:function(){var E=S.createNode(d,\"fd\",16895,73);return E.node_ops={lookup:function(I,k){var T=+k,Z=S.getStream(T);if(!Z)throw new S.ErrnoError(8);var te={parent:null,mount:{mountpoint:\"fake\"},node_ops:{readlink:function(){return Z.path}}};return te.parent=te,te}},E}},{},\"/proc/self/fd\")},createStandardStreams:function(){t.stdin?S.createDevice(\"/dev\",\"stdin\",t.stdin):S.symlink(\"/dev/tty\",\"/dev/stdin\"),t.stdout?S.createDevice(\"/dev\",\"stdout\",null,t.stdout):S.symlink(\"/dev/tty\",\"/dev/stdout\"),t.stderr?S.createDevice(\"/dev\",\"stderr\",null,t.stderr):S.symlink(\"/dev/tty1\",\"/dev/stderr\");var d=S.open(\"/dev/stdin\",0),E=S.open(\"/dev/stdout\",1),I=S.open(\"/dev/stderr\",1)},ensureErrnoError:function(){S.ErrnoError||(S.ErrnoError=function(E,I){this.node=I,this.setErrno=function(k){this.errno=k},this.setErrno(E),this.message=\"FS error\"},S.ErrnoError.prototype=new Error,S.ErrnoError.prototype.constructor=S.ErrnoError,[44].forEach(function(d){S.genericErrors[d]=new S.ErrnoError(d),S.genericErrors[d].stack=\"<generic error, no stack>\"}))},staticInit:function(){S.ensureErrnoError(),S.nameTable=new Array(4096),S.mount(gt,{},\"/\"),S.createDefaultDirectories(),S.createDefaultDevices(),S.createSpecialDirectories(),S.filesystems={MEMFS:gt,NODEFS:At}},init:function(d,E,I){S.init.initialized=!0,S.ensureErrnoError(),t.stdin=d||t.stdin,t.stdout=E||t.stdout,t.stderr=I||t.stderr,S.createStandardStreams()},quit:function(){S.init.initialized=!1;var d=t._fflush;d&&d(0);for(var E=0;E<S.streams.length;E++){var I=S.streams[E];!I||S.close(I)}},getMode:function(d,E){var I=0;return d&&(I|=365),E&&(I|=146),I},findObject:function(d,E){var I=S.analyzePath(d,E);return I.exists?I.object:null},analyzePath:function(d,E){try{var I=S.lookupPath(d,{follow:!E});d=I.path}catch{}var k={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var I=S.lookupPath(d,{parent:!0});k.parentExists=!0,k.parentPath=I.path,k.parentObject=I.node,k.name=Qt.basename(d),I=S.lookupPath(d,{follow:!E}),k.exists=!0,k.path=I.path,k.object=I.node,k.name=I.node.name,k.isRoot=I.path===\"/\"}catch(T){k.error=T.errno}return k},createPath:function(d,E,I,k){d=typeof d==\"string\"?d:S.getPath(d);for(var T=E.split(\"/\").reverse();T.length;){var Z=T.pop();if(!!Z){var te=Qt.join2(d,Z);try{S.mkdir(te)}catch{}d=te}}return te},createFile:function(d,E,I,k,T){var Z=Qt.join2(typeof d==\"string\"?d:S.getPath(d),E),te=S.getMode(k,T);return S.create(Z,te)},createDataFile:function(d,E,I,k,T,Z){var te=E?Qt.join2(typeof d==\"string\"?d:S.getPath(d),E):d,we=S.getMode(k,T),me=S.create(te,we);if(I){if(typeof I==\"string\"){for(var Je=new Array(I.length),nt=0,wt=I.length;nt<wt;++nt)Je[nt]=I.charCodeAt(nt);I=Je}S.chmod(me,we|146);var lt=S.open(me,577);S.write(lt,I,0,I.length,0,Z),S.close(lt),S.chmod(me,we)}return me},createDevice:function(d,E,I,k){var T=Qt.join2(typeof d==\"string\"?d:S.getPath(d),E),Z=S.getMode(!!I,!!k);S.createDevice.major||(S.createDevice.major=64);var te=S.makedev(S.createDevice.major++,0);return S.registerDevice(te,{open:function(we){we.seekable=!1},close:function(we){k&&k.buffer&&k.buffer.length&&k(10)},read:function(we,me,Je,nt,wt){for(var lt=0,it=0;it<nt;it++){var Et;try{Et=I()}catch{throw new S.ErrnoError(29)}if(Et===void 0&&lt===0)throw new S.ErrnoError(6);if(Et==null)break;lt++,me[Je+it]=Et}return lt&&(we.node.timestamp=Date.now()),lt},write:function(we,me,Je,nt,wt){for(var lt=0;lt<nt;lt++)try{k(me[Je+lt])}catch{throw new S.ErrnoError(29)}return nt&&(we.node.timestamp=Date.now()),lt}}),S.mkdev(T,Z,te)},forceLoadFile:function(d){if(d.isDevice||d.isFolder||d.link||d.contents)return!0;if(typeof XMLHttpRequest<\"u\")throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");if(p)try{d.contents=yA(p(d.url),!0),d.usedBytes=d.contents.length}catch{throw new S.ErrnoError(29)}else throw new Error(\"Cannot load without read() or XMLHttpRequest.\")},createLazyFile:function(d,E,I,k,T){function Z(){this.lengthKnown=!1,this.chunks=[]}if(Z.prototype.get=function(lt){if(!(lt>this.length-1||lt<0)){var it=lt%this.chunkSize,Et=lt/this.chunkSize|0;return this.getter(Et)[it]}},Z.prototype.setDataGetter=function(lt){this.getter=lt},Z.prototype.cacheLength=function(){var lt=new XMLHttpRequest;if(lt.open(\"HEAD\",I,!1),lt.send(null),!(lt.status>=200&&lt.status<300||lt.status===304))throw new Error(\"Couldn't load \"+I+\". Status: \"+lt.status);var it=Number(lt.getResponseHeader(\"Content-length\")),Et,Qe=(Et=lt.getResponseHeader(\"Accept-Ranges\"))&&Et===\"bytes\",Tn=(Et=lt.getResponseHeader(\"Content-Encoding\"))&&Et===\"gzip\",Ri=1024*1024;Qe||(Ri=it);var SA=function(os,ma){if(os>ma)throw new Error(\"invalid range (\"+os+\", \"+ma+\") or no bytes requested!\");if(ma>it-1)throw new Error(\"only \"+it+\" bytes available! programmer error!\");var Ur=new XMLHttpRequest;if(Ur.open(\"GET\",I,!1),it!==Ri&&Ur.setRequestHeader(\"Range\",\"bytes=\"+os+\"-\"+ma),typeof Uint8Array<\"u\"&&(Ur.responseType=\"arraybuffer\"),Ur.overrideMimeType&&Ur.overrideMimeType(\"text/plain; charset=x-user-defined\"),Ur.send(null),!(Ur.status>=200&&Ur.status<300||Ur.status===304))throw new Error(\"Couldn't load \"+I+\". Status: \"+Ur.status);return Ur.response!==void 0?new Uint8Array(Ur.response||[]):yA(Ur.responseText||\"\",!0)},Mr=this;Mr.setDataGetter(function(os){var ma=os*Ri,Ur=(os+1)*Ri-1;if(Ur=Math.min(Ur,it-1),typeof Mr.chunks[os]>\"u\"&&(Mr.chunks[os]=SA(ma,Ur)),typeof Mr.chunks[os]>\"u\")throw new Error(\"doXHR failed!\");return Mr.chunks[os]}),(Tn||!it)&&(Ri=it=1,it=this.getter(0).length,Ri=it,v(\"LazyFiles on gzip forces download of the whole file when length is accessed\")),this._length=it,this._chunkSize=Ri,this.lengthKnown=!0},typeof XMLHttpRequest<\"u\"){if(!u)throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var te=new Z;Object.defineProperties(te,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var we={isDevice:!1,contents:te}}else var we={isDevice:!1,url:I};var me=S.createFile(d,E,we,k,T);we.contents?me.contents=we.contents:we.url&&(me.contents=null,me.url=we.url),Object.defineProperties(me,{usedBytes:{get:function(){return this.contents.length}}});var Je={},nt=Object.keys(me.stream_ops);return nt.forEach(function(wt){var lt=me.stream_ops[wt];Je[wt]=function(){return S.forceLoadFile(me),lt.apply(null,arguments)}}),Je.read=function(lt,it,Et,Qe,Tn){S.forceLoadFile(me);var Ri=lt.node.contents;if(Tn>=Ri.length)return 0;var SA=Math.min(Ri.length-Tn,Qe);if(Ri.slice)for(var Mr=0;Mr<SA;Mr++)it[Et+Mr]=Ri[Tn+Mr];else for(var Mr=0;Mr<SA;Mr++)it[Et+Mr]=Ri.get(Tn+Mr);return SA},me.stream_ops=Je,me},createPreloadedFile:function(d,E,I,k,T,Z,te,we,me,Je){Browser.init();var nt=E?Fn.resolve(Qt.join2(d,E)):d,wt=\"cp \"+nt;function lt(it){function Et(Tn){Je&&Je(),we||S.createDataFile(d,E,Tn,k,T,me),Z&&Z(),EA(wt)}var Qe=!1;t.preloadPlugins.forEach(function(Tn){Qe||Tn.canHandle(nt)&&(Tn.handle(it,nt,Et,function(){te&&te(),EA(wt)}),Qe=!0)}),Qe||Et(it)}mA(wt),typeof I==\"string\"?Browser.asyncLoad(I,function(it){lt(it)},te):lt(I)},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:function(){return\"EM_FS_\"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function(d,E,I){E=E||function(){},I=I||function(){};var k=S.indexedDB();try{var T=k.open(S.DB_NAME(),S.DB_VERSION)}catch(Z){return I(Z)}T.onupgradeneeded=function(){v(\"creating db\");var te=T.result;te.createObjectStore(S.DB_STORE_NAME)},T.onsuccess=function(){var te=T.result,we=te.transaction([S.DB_STORE_NAME],\"readwrite\"),me=we.objectStore(S.DB_STORE_NAME),Je=0,nt=0,wt=d.length;function lt(){nt==0?E():I()}d.forEach(function(it){var Et=me.put(S.analyzePath(it).object.contents,it);Et.onsuccess=function(){Je++,Je+nt==wt&&lt()},Et.onerror=function(){nt++,Je+nt==wt&&lt()}}),we.onerror=I},T.onerror=I},loadFilesFromDB:function(d,E,I){E=E||function(){},I=I||function(){};var k=S.indexedDB();try{var T=k.open(S.DB_NAME(),S.DB_VERSION)}catch(Z){return I(Z)}T.onupgradeneeded=I,T.onsuccess=function(){var te=T.result;try{var we=te.transaction([S.DB_STORE_NAME],\"readonly\")}catch(it){I(it);return}var me=we.objectStore(S.DB_STORE_NAME),Je=0,nt=0,wt=d.length;function lt(){nt==0?E():I()}d.forEach(function(it){var Et=me.get(it);Et.onsuccess=function(){S.analyzePath(it).exists&&S.unlink(it),S.createDataFile(Qt.dirname(it),Qt.basename(it),Et.result,!0,!0,!0),Je++,Je+nt==wt&&lt()},Et.onerror=function(){nt++,Je+nt==wt&&lt()}}),we.onerror=I},T.onerror=I}},Tt={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(d,E,I){if(E[0]===\"/\")return E;var k;if(d===-100)k=S.cwd();else{var T=S.getStream(d);if(!T)throw new S.ErrnoError(8);k=T.path}if(E.length==0){if(!I)throw new S.ErrnoError(44);return k}return Qt.join2(k,E)},doStat:function(d,E,I){try{var k=d(E)}catch(T){if(T&&T.node&&Qt.normalize(E)!==Qt.normalize(S.getPath(T.node)))return-54;throw T}return de[I>>2]=k.dev,de[I+4>>2]=0,de[I+8>>2]=k.ino,de[I+12>>2]=k.mode,de[I+16>>2]=k.nlink,de[I+20>>2]=k.uid,de[I+24>>2]=k.gid,de[I+28>>2]=k.rdev,de[I+32>>2]=0,se=[k.size>>>0,(vr=k.size,+Math.abs(vr)>=1?vr>0?(Math.min(+Math.floor(vr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((vr-+(~~vr>>>0))/4294967296)>>>0:0)],de[I+40>>2]=se[0],de[I+44>>2]=se[1],de[I+48>>2]=4096,de[I+52>>2]=k.blocks,de[I+56>>2]=k.atime.getTime()/1e3|0,de[I+60>>2]=0,de[I+64>>2]=k.mtime.getTime()/1e3|0,de[I+68>>2]=0,de[I+72>>2]=k.ctime.getTime()/1e3|0,de[I+76>>2]=0,se=[k.ino>>>0,(vr=k.ino,+Math.abs(vr)>=1?vr>0?(Math.min(+Math.floor(vr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((vr-+(~~vr>>>0))/4294967296)>>>0:0)],de[I+80>>2]=se[0],de[I+84>>2]=se[1],0},doMsync:function(d,E,I,k,T){var Z=Y.slice(d,d+I);S.msync(E,Z,T,I,k)},doMkdir:function(d,E){return d=Qt.normalize(d),d[d.length-1]===\"/\"&&(d=d.substr(0,d.length-1)),S.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return S.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var k=S.readlink(d),T=Math.min(I,le(k)),Z=ne[E+T];return oe(k,E,I+1),ne[E+T]=Z,T},doAccess:function(d,E){if(E&-8)return-28;var I,k=S.lookupPath(d,{follow:!0});if(I=k.node,!I)return-44;var T=\"\";return E&4&&(T+=\"r\"),E&2&&(T+=\"w\"),E&1&&(T+=\"x\"),T&&S.nodePermissions(I,T)?-2:0},doDup:function(d,E,I){var k=S.getStream(I);return k&&S.close(k),S.open(d,E,0,I,I).fd},doReadv:function(d,E,I,k){for(var T=0,Z=0;Z<I;Z++){var te=de[E+Z*8>>2],we=de[E+(Z*8+4)>>2],me=S.read(d,ne,te,we,k);if(me<0)return-1;if(T+=me,me<we)break}return T},doWritev:function(d,E,I,k){for(var T=0,Z=0;Z<I;Z++){var te=de[E+Z*8>>2],we=de[E+(Z*8+4)>>2],me=S.write(d,ne,te,we,k);if(me<0)return-1;T+=me}return T},varargs:void 0,get:function(){Tt.varargs+=4;var d=de[Tt.varargs-4>>2];return d},getStr:function(d){var E=Fe(d);return E},getStreamFromFD:function(d){var E=S.getStream(d);if(!E)throw new S.ErrnoError(8);return E},get64:function(d,E){return d}};function hg(d,E){try{return d=Tt.getStr(d),S.chmod(d,E),0}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),-I.errno}}function Ol(d){return de[Ft()>>2]=d,d}function bp(d,E,I){Tt.varargs=I;try{var k=Tt.getStreamFromFD(d);switch(E){case 0:{var T=Tt.get();if(T<0)return-28;var Z;return Z=S.open(k.path,k.flags,0,T),Z.fd}case 1:case 2:return 0;case 3:return k.flags;case 4:{var T=Tt.get();return k.flags|=T,0}case 12:{var T=Tt.get(),te=0;return he[T+te>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Ol(28),-1;default:return-28}}catch(we){return(typeof S>\"u\"||!(we instanceof S.ErrnoError))&&wr(we),-we.errno}}function Sp(d,E){try{var I=Tt.getStreamFromFD(d);return Tt.doStat(S.stat,I.path,E)}catch(k){return(typeof S>\"u\"||!(k instanceof S.ErrnoError))&&wr(k),-k.errno}}function vp(d,E,I){Tt.varargs=I;try{var k=Tt.getStreamFromFD(d);switch(E){case 21509:case 21505:return k.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return k.tty?0:-59;case 21519:{if(!k.tty)return-59;var T=Tt.get();return de[T>>2]=0,0}case 21520:return k.tty?-28:-59;case 21531:{var T=Tt.get();return S.ioctl(k,E,T)}case 21523:return k.tty?0:-59;case 21524:return k.tty?0:-59;default:wr(\"bad ioctl syscall \"+E)}}catch(Z){return(typeof S>\"u\"||!(Z instanceof S.ErrnoError))&&wr(Z),-Z.errno}}function xp(d,E,I){Tt.varargs=I;try{var k=Tt.getStr(d),T=I?Tt.get():0,Z=S.open(k,E,T);return Z.fd}catch(te){return(typeof S>\"u\"||!(te instanceof S.ErrnoError))&&wr(te),-te.errno}}function Pp(d,E){try{return d=Tt.getStr(d),E=Tt.getStr(E),S.rename(d,E),0}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),-I.errno}}function G(d){try{return d=Tt.getStr(d),S.rmdir(d),0}catch(E){return(typeof S>\"u\"||!(E instanceof S.ErrnoError))&&wr(E),-E.errno}}function yt(d,E){try{return d=Tt.getStr(d),Tt.doStat(S.stat,d,E)}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),-I.errno}}function IA(d){try{return d=Tt.getStr(d),S.unlink(d),0}catch(E){return(typeof S>\"u\"||!(E instanceof S.ErrnoError))&&wr(E),-E.errno}}function Wi(d,E,I){Y.copyWithin(d,E,E+I)}function Ml(d){try{return A.grow(d-qe.byteLength+65535>>>16),Or(A.buffer),1}catch{}}function Xe(d){var E=Y.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var k=1;k<=4;k*=2){var T=E*(1+.2/k);T=Math.min(T,d+100663296);var Z=Math.min(I,ae(Math.max(d,T),65536)),te=Ml(Z);if(te)return!0}return!1}function ha(d){try{var E=Tt.getStreamFromFD(d);return S.close(E),0}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),I.errno}}function pg(d,E){try{var I=Tt.getStreamFromFD(d),k=I.tty?2:S.isDir(I.mode)?3:S.isLink(I.mode)?7:4;return ne[E>>0]=k,0}catch(T){return(typeof S>\"u\"||!(T instanceof S.ErrnoError))&&wr(T),T.errno}}function OE(d,E,I,k){try{var T=Tt.getStreamFromFD(d),Z=Tt.doReadv(T,E,I);return de[k>>2]=Z,0}catch(te){return(typeof S>\"u\"||!(te instanceof S.ErrnoError))&&wr(te),te.errno}}function Dp(d,E,I,k,T){try{var Z=Tt.getStreamFromFD(d),te=4294967296,we=I*te+(E>>>0),me=9007199254740992;return we<=-me||we>=me?-61:(S.llseek(Z,we,k),se=[Z.position>>>0,(vr=Z.position,+Math.abs(vr)>=1?vr>0?(Math.min(+Math.floor(vr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((vr-+(~~vr>>>0))/4294967296)>>>0:0)],de[T>>2]=se[0],de[T+4>>2]=se[1],Z.getdents&&we===0&&k===0&&(Z.getdents=null),0)}catch(Je){return(typeof S>\"u\"||!(Je instanceof S.ErrnoError))&&wr(Je),Je.errno}}function ME(d,E,I,k){try{var T=Tt.getStreamFromFD(d),Z=Tt.doWritev(T,E,I);return de[k>>2]=Z,0}catch(te){return(typeof S>\"u\"||!(te instanceof S.ErrnoError))&&wr(te),te.errno}}function ar(d){$(d)}function Nn(d){var E=Date.now()/1e3|0;return d&&(de[d>>2]=E),E}function Ul(){if(Ul.called)return;Ul.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),k=E.getTimezoneOffset(),T=I.getTimezoneOffset(),Z=Math.max(k,T);de[iS()>>2]=Z*60,de[rS()>>2]=Number(k!=T);function te(wt){var lt=wt.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return lt?lt[1]:\"GMT\"}var we=te(E),me=te(I),Je=Be(we),nt=Be(me);T<k?(de[wg()>>2]=Je,de[wg()+4>>2]=nt):(de[wg()>>2]=nt,de[wg()+4>>2]=Je)}function kp(d){Ul();var E=Date.UTC(de[d+20>>2]+1900,de[d+16>>2],de[d+12>>2],de[d+8>>2],de[d+4>>2],de[d>>2],0),I=new Date(E);de[d+24>>2]=I.getUTCDay();var k=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),T=(I.getTime()-k)/(1e3*60*60*24)|0;return de[d+28>>2]=T,I.getTime()/1e3|0}var Ks=function(d,E,I,k){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=S.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=k},pa=365,ln=146;if(Object.defineProperties(Ks.prototype,{read:{get:function(){return(this.mode&pa)===pa},set:function(d){d?this.mode|=pa:this.mode&=~pa}},write:{get:function(){return(this.mode&ln)===ln},set:function(d){d?this.mode|=ln:this.mode&=~ln}},isFolder:{get:function(){return S.isDir(this.mode)}},isDevice:{get:function(){return S.isChrdev(this.mode)}}}),S.FSNode=Ks,S.staticInit(),g){var Te=eV,dg=J(\"path\");At.staticInit()}if(g){var Kl=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new S.ErrnoError(wo[E.code]):E}}},Hs=Object.assign({},S);for(var Hl in An)S[Hl]=Kl(An[Hl])}else throw new Error(\"NODERAWFS is currently only supported on Node.js environment.\");function yA(d,E,I){var k=I>0?I:le(d)+1,T=new Array(k),Z=Ne(d,T,0,T.length);return E&&(T.length=Z),T}var Cg=typeof atob==\"function\"?atob:function(d){var E=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",I=\"\",k,T,Z,te,we,me,Je,nt=0;d=d.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do te=E.indexOf(d.charAt(nt++)),we=E.indexOf(d.charAt(nt++)),me=E.indexOf(d.charAt(nt++)),Je=E.indexOf(d.charAt(nt++)),k=te<<2|we>>4,T=(we&15)<<4|me>>2,Z=(me&3)<<6|Je,I=I+String.fromCharCode(k),me!==64&&(I=I+String.fromCharCode(T)),Je!==64&&(I=I+String.fromCharCode(Z));while(nt<d.length);return I};function mg(d){if(typeof g==\"boolean\"&&g){var E;try{E=Buffer.from(d,\"base64\")}catch{E=new Buffer(d,\"base64\")}return new Uint8Array(E.buffer,E.byteOffset,E.byteLength)}try{for(var I=Cg(d),k=new Uint8Array(I.length),T=0;T<I.length;++T)k[T]=I.charCodeAt(T);return k}catch{throw new Error(\"Converting base64 string to bytes failed.\")}}function da(d){if(!!ug(d))return mg(d.slice(Ll.length))}var Ca={s:fg,p:hg,e:bp,k:Sp,o:vp,q:xp,i:Pp,r:G,c:yt,h:IA,l:Wi,m:Xe,f:ha,j:pg,g:OE,n:Dp,d:ME,a:ar,b:Nn,t:kp},rt=Qp(),Bo=t.___wasm_call_ctors=rt.v,wA=t._zip_ext_count_symlinks=rt.w,Gl=t._zip_file_get_external_attributes=rt.x,Gs=t._zipstruct_stat=rt.y,Yl=t._zipstruct_statS=rt.z,UE=t._zipstruct_stat_name=rt.A,Rp=t._zipstruct_stat_index=rt.B,Eg=t._zipstruct_stat_size=rt.C,Fp=t._zipstruct_stat_mtime=rt.D,KE=t._zipstruct_stat_crc=rt.E,jl=t._zipstruct_error=rt.F,HE=t._zipstruct_errorS=rt.G,Ig=t._zipstruct_error_code_zip=rt.H,BA=t._zipstruct_stat_comp_size=rt.I,Rr=t._zipstruct_stat_comp_method=rt.J,GE=t._zip_close=rt.K,Ys=t._zip_delete=rt.L,js=t._zip_dir_add=rt.M,yg=t._zip_discard=rt.N,QA=t._zip_error_init_with_code=rt.O,R=t._zip_get_error=rt.P,q=t._zip_file_get_error=rt.Q,Ce=t._zip_error_strerror=rt.R,Ue=t._zip_fclose=rt.S,Re=t._zip_file_add=rt.T,ze=t._free=rt.U,dt=t._malloc=rt.V,Ft=t.___errno_location=rt.W,Ln=t._zip_source_error=rt.X,Jb=t._zip_source_seek=rt.Y,P1=t._zip_file_set_external_attributes=rt.Z,D1=t._zip_file_set_mtime=rt._,Wb=t._zip_fopen=rt.$,k1=t._zip_fopen_index=rt.aa,R1=t._zip_fread=rt.ba,zb=t._zip_get_name=rt.ca,F1=t._zip_get_num_entries=rt.da,N1=t._zip_source_read=rt.ea,Vb=t._zip_name_locate=rt.fa,L1=t._zip_open=rt.ga,T1=t._zip_open_from_source=rt.ha,Xb=t._zip_set_file_compression=rt.ia,O1=t._zip_source_buffer=rt.ja,M1=t._zip_source_buffer_create=rt.ka,U1=t._zip_source_close=rt.la,K1=t._zip_source_free=rt.ma,Zb=t._zip_source_keep=rt.na,_b=t._zip_source_open=rt.oa,$b=t._zip_source_set_mtime=rt.qa,eS=t._zip_source_tell=rt.ra,tS=t._zip_stat=rt.sa,H1=t._zip_stat_index=rt.ta,wg=t.__get_tzname=rt.ua,rS=t.__get_daylight=rt.va,iS=t.__get_timezone=rt.wa,YE=t.stackSave=rt.xa,jE=t.stackRestore=rt.ya,Q=t.stackAlloc=rt.za;t.cwrap=ue,t.getValue=_;var Me;fa=function d(){Me||bA(),Me||(fa=d)};function bA(d){if(d=d||a,is>0||(pr(),is>0))return;function E(){Me||(Me=!0,t.calledRun=!0,!Ae&&(Ii(),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),rs()))}t.setStatus?(t.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){t.setStatus(\"\")},1),E()},1)):E()}if(t.run=bA,t.preInit)for(typeof t.preInit==\"function\"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return bA(),e}}();typeof IB==\"object\"&&typeof FR==\"object\"?FR.exports=RR:typeof define==\"function\"&&define.amd?define([],function(){return RR}):typeof IB==\"object\"&&(IB.createModule=RR)});var bV=w((Kst,QV)=>{function gke(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t<i;)n[t]=e(r[t],t,r);return n}QV.exports=gke});var vs=w((Hst,SV)=>{var fke=Array.isArray;SV.exports=fke});var RV=w((Gst,kV)=>{var vV=Rc(),hke=bV(),pke=vs(),dke=gC(),Cke=1/0,xV=vV?vV.prototype:void 0,PV=xV?xV.toString:void 0;function DV(r){if(typeof r==\"string\")return r;if(pke(r))return hke(r,DV)+\"\";if(dke(r))return PV?PV.call(r):\"\";var e=r+\"\";return e==\"0\"&&1/r==-Cke?\"-0\":e}kV.exports=DV});var Vf=w((Yst,FV)=>{var mke=RV();function Eke(r){return r==null?\"\":mke(r)}FV.exports=Eke});var HR=w((jst,NV)=>{function Ike(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<0&&(t+=n),n=e>t?0:t-e>>>0,e>>>=0;for(var s=Array(n);++i<n;)s[i]=r[i+e];return s}NV.exports=Ike});var TV=w((qst,LV)=>{var yke=HR();function wke(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:yke(r,e,t)}LV.exports=wke});var GR=w((Jst,OV)=>{var Bke=\"\\\\ud800-\\\\udfff\",Qke=\"\\\\u0300-\\\\u036f\",bke=\"\\\\ufe20-\\\\ufe2f\",Ske=\"\\\\u20d0-\\\\u20ff\",vke=Qke+bke+Ske,xke=\"\\\\ufe0e\\\\ufe0f\",Pke=\"\\\\u200d\",Dke=RegExp(\"[\"+Pke+Bke+vke+xke+\"]\");function kke(r){return Dke.test(r)}OV.exports=kke});var UV=w((Wst,MV)=>{function Rke(r){return r.split(\"\")}MV.exports=Rke});var WV=w((zst,JV)=>{var KV=\"\\\\ud800-\\\\udfff\",Fke=\"\\\\u0300-\\\\u036f\",Nke=\"\\\\ufe20-\\\\ufe2f\",Lke=\"\\\\u20d0-\\\\u20ff\",Tke=Fke+Nke+Lke,Oke=\"\\\\ufe0e\\\\ufe0f\",Mke=\"[\"+KV+\"]\",YR=\"[\"+Tke+\"]\",jR=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",Uke=\"(?:\"+YR+\"|\"+jR+\")\",HV=\"[^\"+KV+\"]\",GV=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",YV=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Kke=\"\\\\u200d\",jV=Uke+\"?\",qV=\"[\"+Oke+\"]?\",Hke=\"(?:\"+Kke+\"(?:\"+[HV,GV,YV].join(\"|\")+\")\"+qV+jV+\")*\",Gke=qV+jV+Hke,Yke=\"(?:\"+[HV+YR+\"?\",YR,GV,YV,Mke].join(\"|\")+\")\",jke=RegExp(jR+\"(?=\"+jR+\")|\"+Yke+Gke,\"g\");function qke(r){return r.match(jke)||[]}JV.exports=qke});var VV=w((Vst,zV)=>{var Jke=UV(),Wke=GR(),zke=WV();function Vke(r){return Wke(r)?zke(r):Jke(r)}zV.exports=Vke});var ZV=w((Xst,XV)=>{var Xke=TV(),Zke=GR(),_ke=VV(),$ke=Vf();function eRe(r){return function(e){e=$ke(e);var t=Zke(e)?_ke(e):void 0,i=t?t[0]:e.charAt(0),n=t?Xke(t,1).join(\"\"):e.slice(1);return i[r]()+n}}XV.exports=eRe});var $V=w((Zst,_V)=>{var tRe=ZV(),rRe=tRe(\"toUpperCase\");_V.exports=rRe});var PB=w((_st,e9)=>{var iRe=Vf(),nRe=$V();function sRe(r){return nRe(iRe(r).toLowerCase())}e9.exports=sRe});var t9=w(($st,DB)=>{function oRe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,C=15,y=16,B=17,v=0,D=1,L=2,H=3,j=4;function $(A,Ae){return 55296<=A.charCodeAt(Ae)&&A.charCodeAt(Ae)<=56319&&56320<=A.charCodeAt(Ae+1)&&A.charCodeAt(Ae+1)<=57343}function V(A,Ae){Ae===void 0&&(Ae=0);var ge=A.charCodeAt(Ae);if(55296<=ge&&ge<=56319&&Ae<A.length-1){var re=ge,O=A.charCodeAt(Ae+1);return 56320<=O&&O<=57343?(re-55296)*1024+(O-56320)+65536:re}if(56320<=ge&&ge<=57343&&Ae>=1){var re=A.charCodeAt(Ae-1),O=ge;return 55296<=re&&re<=56319?(re-55296)*1024+(O-56320)+65536:O}return ge}function W(A,Ae,ge){var re=[A].concat(Ae).concat([ge]),O=re[re.length-2],F=ge,ue=re.lastIndexOf(p);if(ue>1&&re.slice(1,ue).every(function(Fe){return Fe==i})&&[i,h,B].indexOf(A)==-1)return L;var pe=re.lastIndexOf(n);if(pe>0&&re.slice(1,pe).every(function(Fe){return Fe==n})&&[f,n].indexOf(O)==-1)return re.filter(function(Fe){return Fe==n}).length%2==1?H:j;if(O==r&&F==e)return v;if(O==t||O==r||O==e)return F==p&&Ae.every(function(Fe){return Fe==i})?L:D;if(F==t||F==r||F==e)return D;if(O==o&&(F==o||F==a||F==c||F==u))return v;if((O==c||O==a)&&(F==a||F==l))return v;if((O==u||O==l)&&F==l)return v;if(F==i||F==C)return v;if(F==s)return v;if(O==f)return v;var ke=re.indexOf(i)!=-1?re.lastIndexOf(i)-1:re.length-2;return[h,B].indexOf(re[ke])!=-1&&re.slice(ke+1,-1).every(function(Fe){return Fe==i})&&F==p||O==C&&[y,B].indexOf(F)!=-1?v:Ae.indexOf(n)!=-1?L:O==n&&F==n?v:D}this.nextBreak=function(A,Ae){if(Ae===void 0&&(Ae=0),Ae<0)return 0;if(Ae>=A.length-1)return A.length;for(var ge=_(V(A,Ae)),re=[],O=Ae+1;O<A.length;O++)if(!$(A,O-1)){var F=_(V(A,O));if(W(ge,re,F))return O;re.push(F)}return A.length},this.splitGraphemes=function(A){for(var Ae=[],ge=0,re;(re=this.nextBreak(A,ge))<A.length;)Ae.push(A.slice(ge,re)),ge=re;return ge<A.length&&Ae.push(A.slice(ge)),Ae},this.iterateGraphemes=function(A){var Ae=0,ge={next:function(){var re,O;return(O=this.nextBreak(A,Ae))<A.length?(re=A.slice(Ae,O),Ae=O,{value:re,done:!1}):Ae<A.length?(re=A.slice(Ae),Ae=A.length,{value:re,done:!1}):{value:void 0,done:!0}}.bind(this)};return typeof Symbol<\"u\"&&Symbol.iterator&&(ge[Symbol.iterator]=function(){return ge}),ge},this.countGraphemes=function(A){for(var Ae=0,ge=0,re;(re=this.nextBreak(A,ge))<A.length;)ge=re,Ae++;return ge<A.length&&Ae++,Ae};function _(A){return 1536<=A&&A<=1541||A==1757||A==1807||A==2274||A==3406||A==69821||70082<=A&&A<=70083||A==72250||72326<=A&&A<=72329||A==73030?f:A==13?r:A==10?e:0<=A&&A<=9||11<=A&&A<=12||14<=A&&A<=31||127<=A&&A<=159||A==173||A==1564||A==6158||A==8203||8206<=A&&A<=8207||A==8232||A==8233||8234<=A&&A<=8238||8288<=A&&A<=8292||A==8293||8294<=A&&A<=8303||55296<=A&&A<=57343||A==65279||65520<=A&&A<=65528||65529<=A&&A<=65531||113824<=A&&A<=113827||119155<=A&&A<=119162||A==917504||A==917505||917506<=A&&A<=917535||917632<=A&&A<=917759||918e3<=A&&A<=921599?t:768<=A&&A<=879||1155<=A&&A<=1159||1160<=A&&A<=1161||1425<=A&&A<=1469||A==1471||1473<=A&&A<=1474||1476<=A&&A<=1477||A==1479||1552<=A&&A<=1562||1611<=A&&A<=1631||A==1648||1750<=A&&A<=1756||1759<=A&&A<=1764||1767<=A&&A<=1768||1770<=A&&A<=1773||A==1809||1840<=A&&A<=1866||1958<=A&&A<=1968||2027<=A&&A<=2035||2070<=A&&A<=2073||2075<=A&&A<=2083||2085<=A&&A<=2087||2089<=A&&A<=2093||2137<=A&&A<=2139||2260<=A&&A<=2273||2275<=A&&A<=2306||A==2362||A==2364||2369<=A&&A<=2376||A==2381||2385<=A&&A<=2391||2402<=A&&A<=2403||A==2433||A==2492||A==2494||2497<=A&&A<=2500||A==2509||A==2519||2530<=A&&A<=2531||2561<=A&&A<=2562||A==2620||2625<=A&&A<=2626||2631<=A&&A<=2632||2635<=A&&A<=2637||A==2641||2672<=A&&A<=2673||A==2677||2689<=A&&A<=2690||A==2748||2753<=A&&A<=2757||2759<=A&&A<=2760||A==2765||2786<=A&&A<=2787||2810<=A&&A<=2815||A==2817||A==2876||A==2878||A==2879||2881<=A&&A<=2884||A==2893||A==2902||A==2903||2914<=A&&A<=2915||A==2946||A==3006||A==3008||A==3021||A==3031||A==3072||3134<=A&&A<=3136||3142<=A&&A<=3144||3146<=A&&A<=3149||3157<=A&&A<=3158||3170<=A&&A<=3171||A==3201||A==3260||A==3263||A==3266||A==3270||3276<=A&&A<=3277||3285<=A&&A<=3286||3298<=A&&A<=3299||3328<=A&&A<=3329||3387<=A&&A<=3388||A==3390||3393<=A&&A<=3396||A==3405||A==3415||3426<=A&&A<=3427||A==3530||A==3535||3538<=A&&A<=3540||A==3542||A==3551||A==3633||3636<=A&&A<=3642||3655<=A&&A<=3662||A==3761||3764<=A&&A<=3769||3771<=A&&A<=3772||3784<=A&&A<=3789||3864<=A&&A<=3865||A==3893||A==3895||A==3897||3953<=A&&A<=3966||3968<=A&&A<=3972||3974<=A&&A<=3975||3981<=A&&A<=3991||3993<=A&&A<=4028||A==4038||4141<=A&&A<=4144||4146<=A&&A<=4151||4153<=A&&A<=4154||4157<=A&&A<=4158||4184<=A&&A<=4185||4190<=A&&A<=4192||4209<=A&&A<=4212||A==4226||4229<=A&&A<=4230||A==4237||A==4253||4957<=A&&A<=4959||5906<=A&&A<=5908||5938<=A&&A<=5940||5970<=A&&A<=5971||6002<=A&&A<=6003||6068<=A&&A<=6069||6071<=A&&A<=6077||A==6086||6089<=A&&A<=6099||A==6109||6155<=A&&A<=6157||6277<=A&&A<=6278||A==6313||6432<=A&&A<=6434||6439<=A&&A<=6440||A==6450||6457<=A&&A<=6459||6679<=A&&A<=6680||A==6683||A==6742||6744<=A&&A<=6750||A==6752||A==6754||6757<=A&&A<=6764||6771<=A&&A<=6780||A==6783||6832<=A&&A<=6845||A==6846||6912<=A&&A<=6915||A==6964||6966<=A&&A<=6970||A==6972||A==6978||7019<=A&&A<=7027||7040<=A&&A<=7041||7074<=A&&A<=7077||7080<=A&&A<=7081||7083<=A&&A<=7085||A==7142||7144<=A&&A<=7145||A==7149||7151<=A&&A<=7153||7212<=A&&A<=7219||7222<=A&&A<=7223||7376<=A&&A<=7378||7380<=A&&A<=7392||7394<=A&&A<=7400||A==7405||A==7412||7416<=A&&A<=7417||7616<=A&&A<=7673||7675<=A&&A<=7679||A==8204||8400<=A&&A<=8412||8413<=A&&A<=8416||A==8417||8418<=A&&A<=8420||8421<=A&&A<=8432||11503<=A&&A<=11505||A==11647||11744<=A&&A<=11775||12330<=A&&A<=12333||12334<=A&&A<=12335||12441<=A&&A<=12442||A==42607||42608<=A&&A<=42610||42612<=A&&A<=42621||42654<=A&&A<=42655||42736<=A&&A<=42737||A==43010||A==43014||A==43019||43045<=A&&A<=43046||43204<=A&&A<=43205||43232<=A&&A<=43249||43302<=A&&A<=43309||43335<=A&&A<=43345||43392<=A&&A<=43394||A==43443||43446<=A&&A<=43449||A==43452||A==43493||43561<=A&&A<=43566||43569<=A&&A<=43570||43573<=A&&A<=43574||A==43587||A==43596||A==43644||A==43696||43698<=A&&A<=43700||43703<=A&&A<=43704||43710<=A&&A<=43711||A==43713||43756<=A&&A<=43757||A==43766||A==44005||A==44008||A==44013||A==64286||65024<=A&&A<=65039||65056<=A&&A<=65071||65438<=A&&A<=65439||A==66045||A==66272||66422<=A&&A<=66426||68097<=A&&A<=68099||68101<=A&&A<=68102||68108<=A&&A<=68111||68152<=A&&A<=68154||A==68159||68325<=A&&A<=68326||A==69633||69688<=A&&A<=69702||69759<=A&&A<=69761||69811<=A&&A<=69814||69817<=A&&A<=69818||69888<=A&&A<=69890||69927<=A&&A<=69931||69933<=A&&A<=69940||A==70003||70016<=A&&A<=70017||70070<=A&&A<=70078||70090<=A&&A<=70092||70191<=A&&A<=70193||A==70196||70198<=A&&A<=70199||A==70206||A==70367||70371<=A&&A<=70378||70400<=A&&A<=70401||A==70460||A==70462||A==70464||A==70487||70502<=A&&A<=70508||70512<=A&&A<=70516||70712<=A&&A<=70719||70722<=A&&A<=70724||A==70726||A==70832||70835<=A&&A<=70840||A==70842||A==70845||70847<=A&&A<=70848||70850<=A&&A<=70851||A==71087||71090<=A&&A<=71093||71100<=A&&A<=71101||71103<=A&&A<=71104||71132<=A&&A<=71133||71219<=A&&A<=71226||A==71229||71231<=A&&A<=71232||A==71339||A==71341||71344<=A&&A<=71349||A==71351||71453<=A&&A<=71455||71458<=A&&A<=71461||71463<=A&&A<=71467||72193<=A&&A<=72198||72201<=A&&A<=72202||72243<=A&&A<=72248||72251<=A&&A<=72254||A==72263||72273<=A&&A<=72278||72281<=A&&A<=72283||72330<=A&&A<=72342||72344<=A&&A<=72345||72752<=A&&A<=72758||72760<=A&&A<=72765||A==72767||72850<=A&&A<=72871||72874<=A&&A<=72880||72882<=A&&A<=72883||72885<=A&&A<=72886||73009<=A&&A<=73014||A==73018||73020<=A&&A<=73021||73023<=A&&A<=73029||A==73031||92912<=A&&A<=92916||92976<=A&&A<=92982||94095<=A&&A<=94098||113821<=A&&A<=113822||A==119141||119143<=A&&A<=119145||119150<=A&&A<=119154||119163<=A&&A<=119170||119173<=A&&A<=119179||119210<=A&&A<=119213||119362<=A&&A<=119364||121344<=A&&A<=121398||121403<=A&&A<=121452||A==121461||A==121476||121499<=A&&A<=121503||121505<=A&&A<=121519||122880<=A&&A<=122886||122888<=A&&A<=122904||122907<=A&&A<=122913||122915<=A&&A<=122916||122918<=A&&A<=122922||125136<=A&&A<=125142||125252<=A&&A<=125258||917536<=A&&A<=917631||917760<=A&&A<=917999?i:127462<=A&&A<=127487?n:A==2307||A==2363||2366<=A&&A<=2368||2377<=A&&A<=2380||2382<=A&&A<=2383||2434<=A&&A<=2435||2495<=A&&A<=2496||2503<=A&&A<=2504||2507<=A&&A<=2508||A==2563||2622<=A&&A<=2624||A==2691||2750<=A&&A<=2752||A==2761||2763<=A&&A<=2764||2818<=A&&A<=2819||A==2880||2887<=A&&A<=2888||2891<=A&&A<=2892||A==3007||3009<=A&&A<=3010||3014<=A&&A<=3016||3018<=A&&A<=3020||3073<=A&&A<=3075||3137<=A&&A<=3140||3202<=A&&A<=3203||A==3262||3264<=A&&A<=3265||3267<=A&&A<=3268||3271<=A&&A<=3272||3274<=A&&A<=3275||3330<=A&&A<=3331||3391<=A&&A<=3392||3398<=A&&A<=3400||3402<=A&&A<=3404||3458<=A&&A<=3459||3536<=A&&A<=3537||3544<=A&&A<=3550||3570<=A&&A<=3571||A==3635||A==3763||3902<=A&&A<=3903||A==3967||A==4145||4155<=A&&A<=4156||4182<=A&&A<=4183||A==4228||A==6070||6078<=A&&A<=6085||6087<=A&&A<=6088||6435<=A&&A<=6438||6441<=A&&A<=6443||6448<=A&&A<=6449||6451<=A&&A<=6456||6681<=A&&A<=6682||A==6741||A==6743||6765<=A&&A<=6770||A==6916||A==6965||A==6971||6973<=A&&A<=6977||6979<=A&&A<=6980||A==7042||A==7073||7078<=A&&A<=7079||A==7082||A==7143||7146<=A&&A<=7148||A==7150||7154<=A&&A<=7155||7204<=A&&A<=7211||7220<=A&&A<=7221||A==7393||7410<=A&&A<=7411||A==7415||43043<=A&&A<=43044||A==43047||43136<=A&&A<=43137||43188<=A&&A<=43203||43346<=A&&A<=43347||A==43395||43444<=A&&A<=43445||43450<=A&&A<=43451||43453<=A&&A<=43456||43567<=A&&A<=43568||43571<=A&&A<=43572||A==43597||A==43755||43758<=A&&A<=43759||A==43765||44003<=A&&A<=44004||44006<=A&&A<=44007||44009<=A&&A<=44010||A==44012||A==69632||A==69634||A==69762||69808<=A&&A<=69810||69815<=A&&A<=69816||A==69932||A==70018||70067<=A&&A<=70069||70079<=A&&A<=70080||70188<=A&&A<=70190||70194<=A&&A<=70195||A==70197||70368<=A&&A<=70370||70402<=A&&A<=70403||A==70463||70465<=A&&A<=70468||70471<=A&&A<=70472||70475<=A&&A<=70477||70498<=A&&A<=70499||70709<=A&&A<=70711||70720<=A&&A<=70721||A==70725||70833<=A&&A<=70834||A==70841||70843<=A&&A<=70844||A==70846||A==70849||71088<=A&&A<=71089||71096<=A&&A<=71099||A==71102||71216<=A&&A<=71218||71227<=A&&A<=71228||A==71230||A==71340||71342<=A&&A<=71343||A==71350||71456<=A&&A<=71457||A==71462||72199<=A&&A<=72200||A==72249||72279<=A&&A<=72280||A==72343||A==72751||A==72766||A==72873||A==72881||A==72884||94033<=A&&A<=94078||A==119142||A==119149?s:4352<=A&&A<=4447||43360<=A&&A<=43388?o:4448<=A&&A<=4519||55216<=A&&A<=55238?a:4520<=A&&A<=4607||55243<=A&&A<=55291?l:A==44032||A==44060||A==44088||A==44116||A==44144||A==44172||A==44200||A==44228||A==44256||A==44284||A==44312||A==44340||A==44368||A==44396||A==44424||A==44452||A==44480||A==44508||A==44536||A==44564||A==44592||A==44620||A==44648||A==44676||A==44704||A==44732||A==44760||A==44788||A==44816||A==44844||A==44872||A==44900||A==44928||A==44956||A==44984||A==45012||A==45040||A==45068||A==45096||A==45124||A==45152||A==45180||A==45208||A==45236||A==45264||A==45292||A==45320||A==45348||A==45376||A==45404||A==45432||A==45460||A==45488||A==45516||A==45544||A==45572||A==45600||A==45628||A==45656||A==45684||A==45712||A==45740||A==45768||A==45796||A==45824||A==45852||A==45880||A==45908||A==45936||A==45964||A==45992||A==46020||A==46048||A==46076||A==46104||A==46132||A==46160||A==46188||A==46216||A==46244||A==46272||A==46300||A==46328||A==46356||A==46384||A==46412||A==46440||A==46468||A==46496||A==46524||A==46552||A==46580||A==46608||A==46636||A==46664||A==46692||A==46720||A==46748||A==46776||A==46804||A==46832||A==46860||A==46888||A==46916||A==46944||A==46972||A==47e3||A==47028||A==47056||A==47084||A==47112||A==47140||A==47168||A==47196||A==47224||A==47252||A==47280||A==47308||A==47336||A==47364||A==47392||A==47420||A==47448||A==47476||A==47504||A==47532||A==47560||A==47588||A==47616||A==47644||A==47672||A==47700||A==47728||A==47756||A==47784||A==47812||A==47840||A==47868||A==47896||A==47924||A==47952||A==47980||A==48008||A==48036||A==48064||A==48092||A==48120||A==48148||A==48176||A==48204||A==48232||A==48260||A==48288||A==48316||A==48344||A==48372||A==48400||A==48428||A==48456||A==48484||A==48512||A==48540||A==48568||A==48596||A==48624||A==48652||A==48680||A==48708||A==48736||A==48764||A==48792||A==48820||A==48848||A==48876||A==48904||A==48932||A==48960||A==48988||A==49016||A==49044||A==49072||A==49100||A==49128||A==49156||A==49184||A==49212||A==49240||A==49268||A==49296||A==49324||A==49352||A==49380||A==49408||A==49436||A==49464||A==49492||A==49520||A==49548||A==49576||A==49604||A==49632||A==49660||A==49688||A==49716||A==49744||A==49772||A==49800||A==49828||A==49856||A==49884||A==49912||A==49940||A==49968||A==49996||A==50024||A==50052||A==50080||A==50108||A==50136||A==50164||A==50192||A==50220||A==50248||A==50276||A==50304||A==50332||A==50360||A==50388||A==50416||A==50444||A==50472||A==50500||A==50528||A==50556||A==50584||A==50612||A==50640||A==50668||A==50696||A==50724||A==50752||A==50780||A==50808||A==50836||A==50864||A==50892||A==50920||A==50948||A==50976||A==51004||A==51032||A==51060||A==51088||A==51116||A==51144||A==51172||A==51200||A==51228||A==51256||A==51284||A==51312||A==51340||A==51368||A==51396||A==51424||A==51452||A==51480||A==51508||A==51536||A==51564||A==51592||A==51620||A==51648||A==51676||A==51704||A==51732||A==51760||A==51788||A==51816||A==51844||A==51872||A==51900||A==51928||A==51956||A==51984||A==52012||A==52040||A==52068||A==52096||A==52124||A==52152||A==52180||A==52208||A==52236||A==52264||A==52292||A==52320||A==52348||A==52376||A==52404||A==52432||A==52460||A==52488||A==52516||A==52544||A==52572||A==52600||A==52628||A==52656||A==52684||A==52712||A==52740||A==52768||A==52796||A==52824||A==52852||A==52880||A==52908||A==52936||A==52964||A==52992||A==53020||A==53048||A==53076||A==53104||A==53132||A==53160||A==53188||A==53216||A==53244||A==53272||A==53300||A==53328||A==53356||A==53384||A==53412||A==53440||A==53468||A==53496||A==53524||A==53552||A==53580||A==53608||A==53636||A==53664||A==53692||A==53720||A==53748||A==53776||A==53804||A==53832||A==53860||A==53888||A==53916||A==53944||A==53972||A==54e3||A==54028||A==54056||A==54084||A==54112||A==54140||A==54168||A==54196||A==54224||A==54252||A==54280||A==54308||A==54336||A==54364||A==54392||A==54420||A==54448||A==54476||A==54504||A==54532||A==54560||A==54588||A==54616||A==54644||A==54672||A==54700||A==54728||A==54756||A==54784||A==54812||A==54840||A==54868||A==54896||A==54924||A==54952||A==54980||A==55008||A==55036||A==55064||A==55092||A==55120||A==55148||A==55176?c:44033<=A&&A<=44059||44061<=A&&A<=44087||44089<=A&&A<=44115||44117<=A&&A<=44143||44145<=A&&A<=44171||44173<=A&&A<=44199||44201<=A&&A<=44227||44229<=A&&A<=44255||44257<=A&&A<=44283||44285<=A&&A<=44311||44313<=A&&A<=44339||44341<=A&&A<=44367||44369<=A&&A<=44395||44397<=A&&A<=44423||44425<=A&&A<=44451||44453<=A&&A<=44479||44481<=A&&A<=44507||44509<=A&&A<=44535||44537<=A&&A<=44563||44565<=A&&A<=44591||44593<=A&&A<=44619||44621<=A&&A<=44647||44649<=A&&A<=44675||44677<=A&&A<=44703||44705<=A&&A<=44731||44733<=A&&A<=44759||44761<=A&&A<=44787||44789<=A&&A<=44815||44817<=A&&A<=44843||44845<=A&&A<=44871||44873<=A&&A<=44899||44901<=A&&A<=44927||44929<=A&&A<=44955||44957<=A&&A<=44983||44985<=A&&A<=45011||45013<=A&&A<=45039||45041<=A&&A<=45067||45069<=A&&A<=45095||45097<=A&&A<=45123||45125<=A&&A<=45151||45153<=A&&A<=45179||45181<=A&&A<=45207||45209<=A&&A<=45235||45237<=A&&A<=45263||45265<=A&&A<=45291||45293<=A&&A<=45319||45321<=A&&A<=45347||45349<=A&&A<=45375||45377<=A&&A<=45403||45405<=A&&A<=45431||45433<=A&&A<=45459||45461<=A&&A<=45487||45489<=A&&A<=45515||45517<=A&&A<=45543||45545<=A&&A<=45571||45573<=A&&A<=45599||45601<=A&&A<=45627||45629<=A&&A<=45655||45657<=A&&A<=45683||45685<=A&&A<=45711||45713<=A&&A<=45739||45741<=A&&A<=45767||45769<=A&&A<=45795||45797<=A&&A<=45823||45825<=A&&A<=45851||45853<=A&&A<=45879||45881<=A&&A<=45907||45909<=A&&A<=45935||45937<=A&&A<=45963||45965<=A&&A<=45991||45993<=A&&A<=46019||46021<=A&&A<=46047||46049<=A&&A<=46075||46077<=A&&A<=46103||46105<=A&&A<=46131||46133<=A&&A<=46159||46161<=A&&A<=46187||46189<=A&&A<=46215||46217<=A&&A<=46243||46245<=A&&A<=46271||46273<=A&&A<=46299||46301<=A&&A<=46327||46329<=A&&A<=46355||46357<=A&&A<=46383||46385<=A&&A<=46411||46413<=A&&A<=46439||46441<=A&&A<=46467||46469<=A&&A<=46495||46497<=A&&A<=46523||46525<=A&&A<=46551||46553<=A&&A<=46579||46581<=A&&A<=46607||46609<=A&&A<=46635||46637<=A&&A<=46663||46665<=A&&A<=46691||46693<=A&&A<=46719||46721<=A&&A<=46747||46749<=A&&A<=46775||46777<=A&&A<=46803||46805<=A&&A<=46831||46833<=A&&A<=46859||46861<=A&&A<=46887||46889<=A&&A<=46915||46917<=A&&A<=46943||46945<=A&&A<=46971||46973<=A&&A<=46999||47001<=A&&A<=47027||47029<=A&&A<=47055||47057<=A&&A<=47083||47085<=A&&A<=47111||47113<=A&&A<=47139||47141<=A&&A<=47167||47169<=A&&A<=47195||47197<=A&&A<=47223||47225<=A&&A<=47251||47253<=A&&A<=47279||47281<=A&&A<=47307||47309<=A&&A<=47335||47337<=A&&A<=47363||47365<=A&&A<=47391||47393<=A&&A<=47419||47421<=A&&A<=47447||47449<=A&&A<=47475||47477<=A&&A<=47503||47505<=A&&A<=47531||47533<=A&&A<=47559||47561<=A&&A<=47587||47589<=A&&A<=47615||47617<=A&&A<=47643||47645<=A&&A<=47671||47673<=A&&A<=47699||47701<=A&&A<=47727||47729<=A&&A<=47755||47757<=A&&A<=47783||47785<=A&&A<=47811||47813<=A&&A<=47839||47841<=A&&A<=47867||47869<=A&&A<=47895||47897<=A&&A<=47923||47925<=A&&A<=47951||47953<=A&&A<=47979||47981<=A&&A<=48007||48009<=A&&A<=48035||48037<=A&&A<=48063||48065<=A&&A<=48091||48093<=A&&A<=48119||48121<=A&&A<=48147||48149<=A&&A<=48175||48177<=A&&A<=48203||48205<=A&&A<=48231||48233<=A&&A<=48259||48261<=A&&A<=48287||48289<=A&&A<=48315||48317<=A&&A<=48343||48345<=A&&A<=48371||48373<=A&&A<=48399||48401<=A&&A<=48427||48429<=A&&A<=48455||48457<=A&&A<=48483||48485<=A&&A<=48511||48513<=A&&A<=48539||48541<=A&&A<=48567||48569<=A&&A<=48595||48597<=A&&A<=48623||48625<=A&&A<=48651||48653<=A&&A<=48679||48681<=A&&A<=48707||48709<=A&&A<=48735||48737<=A&&A<=48763||48765<=A&&A<=48791||48793<=A&&A<=48819||48821<=A&&A<=48847||48849<=A&&A<=48875||48877<=A&&A<=48903||48905<=A&&A<=48931||48933<=A&&A<=48959||48961<=A&&A<=48987||48989<=A&&A<=49015||49017<=A&&A<=49043||49045<=A&&A<=49071||49073<=A&&A<=49099||49101<=A&&A<=49127||49129<=A&&A<=49155||49157<=A&&A<=49183||49185<=A&&A<=49211||49213<=A&&A<=49239||49241<=A&&A<=49267||49269<=A&&A<=49295||49297<=A&&A<=49323||49325<=A&&A<=49351||49353<=A&&A<=49379||49381<=A&&A<=49407||49409<=A&&A<=49435||49437<=A&&A<=49463||49465<=A&&A<=49491||49493<=A&&A<=49519||49521<=A&&A<=49547||49549<=A&&A<=49575||49577<=A&&A<=49603||49605<=A&&A<=49631||49633<=A&&A<=49659||49661<=A&&A<=49687||49689<=A&&A<=49715||49717<=A&&A<=49743||49745<=A&&A<=49771||49773<=A&&A<=49799||49801<=A&&A<=49827||49829<=A&&A<=49855||49857<=A&&A<=49883||49885<=A&&A<=49911||49913<=A&&A<=49939||49941<=A&&A<=49967||49969<=A&&A<=49995||49997<=A&&A<=50023||50025<=A&&A<=50051||50053<=A&&A<=50079||50081<=A&&A<=50107||50109<=A&&A<=50135||50137<=A&&A<=50163||50165<=A&&A<=50191||50193<=A&&A<=50219||50221<=A&&A<=50247||50249<=A&&A<=50275||50277<=A&&A<=50303||50305<=A&&A<=50331||50333<=A&&A<=50359||50361<=A&&A<=50387||50389<=A&&A<=50415||50417<=A&&A<=50443||50445<=A&&A<=50471||50473<=A&&A<=50499||50501<=A&&A<=50527||50529<=A&&A<=50555||50557<=A&&A<=50583||50585<=A&&A<=50611||50613<=A&&A<=50639||50641<=A&&A<=50667||50669<=A&&A<=50695||50697<=A&&A<=50723||50725<=A&&A<=50751||50753<=A&&A<=50779||50781<=A&&A<=50807||50809<=A&&A<=50835||50837<=A&&A<=50863||50865<=A&&A<=50891||50893<=A&&A<=50919||50921<=A&&A<=50947||50949<=A&&A<=50975||50977<=A&&A<=51003||51005<=A&&A<=51031||51033<=A&&A<=51059||51061<=A&&A<=51087||51089<=A&&A<=51115||51117<=A&&A<=51143||51145<=A&&A<=51171||51173<=A&&A<=51199||51201<=A&&A<=51227||51229<=A&&A<=51255||51257<=A&&A<=51283||51285<=A&&A<=51311||51313<=A&&A<=51339||51341<=A&&A<=51367||51369<=A&&A<=51395||51397<=A&&A<=51423||51425<=A&&A<=51451||51453<=A&&A<=51479||51481<=A&&A<=51507||51509<=A&&A<=51535||51537<=A&&A<=51563||51565<=A&&A<=51591||51593<=A&&A<=51619||51621<=A&&A<=51647||51649<=A&&A<=51675||51677<=A&&A<=51703||51705<=A&&A<=51731||51733<=A&&A<=51759||51761<=A&&A<=51787||51789<=A&&A<=51815||51817<=A&&A<=51843||51845<=A&&A<=51871||51873<=A&&A<=51899||51901<=A&&A<=51927||51929<=A&&A<=51955||51957<=A&&A<=51983||51985<=A&&A<=52011||52013<=A&&A<=52039||52041<=A&&A<=52067||52069<=A&&A<=52095||52097<=A&&A<=52123||52125<=A&&A<=52151||52153<=A&&A<=52179||52181<=A&&A<=52207||52209<=A&&A<=52235||52237<=A&&A<=52263||52265<=A&&A<=52291||52293<=A&&A<=52319||52321<=A&&A<=52347||52349<=A&&A<=52375||52377<=A&&A<=52403||52405<=A&&A<=52431||52433<=A&&A<=52459||52461<=A&&A<=52487||52489<=A&&A<=52515||52517<=A&&A<=52543||52545<=A&&A<=52571||52573<=A&&A<=52599||52601<=A&&A<=52627||52629<=A&&A<=52655||52657<=A&&A<=52683||52685<=A&&A<=52711||52713<=A&&A<=52739||52741<=A&&A<=52767||52769<=A&&A<=52795||52797<=A&&A<=52823||52825<=A&&A<=52851||52853<=A&&A<=52879||52881<=A&&A<=52907||52909<=A&&A<=52935||52937<=A&&A<=52963||52965<=A&&A<=52991||52993<=A&&A<=53019||53021<=A&&A<=53047||53049<=A&&A<=53075||53077<=A&&A<=53103||53105<=A&&A<=53131||53133<=A&&A<=53159||53161<=A&&A<=53187||53189<=A&&A<=53215||53217<=A&&A<=53243||53245<=A&&A<=53271||53273<=A&&A<=53299||53301<=A&&A<=53327||53329<=A&&A<=53355||53357<=A&&A<=53383||53385<=A&&A<=53411||53413<=A&&A<=53439||53441<=A&&A<=53467||53469<=A&&A<=53495||53497<=A&&A<=53523||53525<=A&&A<=53551||53553<=A&&A<=53579||53581<=A&&A<=53607||53609<=A&&A<=53635||53637<=A&&A<=53663||53665<=A&&A<=53691||53693<=A&&A<=53719||53721<=A&&A<=53747||53749<=A&&A<=53775||53777<=A&&A<=53803||53805<=A&&A<=53831||53833<=A&&A<=53859||53861<=A&&A<=53887||53889<=A&&A<=53915||53917<=A&&A<=53943||53945<=A&&A<=53971||53973<=A&&A<=53999||54001<=A&&A<=54027||54029<=A&&A<=54055||54057<=A&&A<=54083||54085<=A&&A<=54111||54113<=A&&A<=54139||54141<=A&&A<=54167||54169<=A&&A<=54195||54197<=A&&A<=54223||54225<=A&&A<=54251||54253<=A&&A<=54279||54281<=A&&A<=54307||54309<=A&&A<=54335||54337<=A&&A<=54363||54365<=A&&A<=54391||54393<=A&&A<=54419||54421<=A&&A<=54447||54449<=A&&A<=54475||54477<=A&&A<=54503||54505<=A&&A<=54531||54533<=A&&A<=54559||54561<=A&&A<=54587||54589<=A&&A<=54615||54617<=A&&A<=54643||54645<=A&&A<=54671||54673<=A&&A<=54699||54701<=A&&A<=54727||54729<=A&&A<=54755||54757<=A&&A<=54783||54785<=A&&A<=54811||54813<=A&&A<=54839||54841<=A&&A<=54867||54869<=A&&A<=54895||54897<=A&&A<=54923||54925<=A&&A<=54951||54953<=A&&A<=54979||54981<=A&&A<=55007||55009<=A&&A<=55035||55037<=A&&A<=55063||55065<=A&&A<=55091||55093<=A&&A<=55119||55121<=A&&A<=55147||55149<=A&&A<=55175||55177<=A&&A<=55203?u:A==9757||A==9977||9994<=A&&A<=9997||A==127877||127938<=A&&A<=127940||A==127943||127946<=A&&A<=127948||128066<=A&&A<=128067||128070<=A&&A<=128080||A==128110||128112<=A&&A<=128120||A==128124||128129<=A&&A<=128131||128133<=A&&A<=128135||A==128170||128372<=A&&A<=128373||A==128378||A==128400||128405<=A&&A<=128406||128581<=A&&A<=128583||128587<=A&&A<=128591||A==128675||128692<=A&&A<=128694||A==128704||A==128716||129304<=A&&A<=129308||129310<=A&&A<=129311||A==129318||129328<=A&&A<=129337||129341<=A&&A<=129342||129489<=A&&A<=129501?h:127995<=A&&A<=127999?p:A==8205?C:A==9792||A==9794||9877<=A&&A<=9878||A==9992||A==10084||A==127752||A==127806||A==127859||A==127891||A==127908||A==127912||A==127979||A==127981||A==128139||128187<=A&&A<=128188||A==128295||A==128300||A==128488||A==128640||A==128658?y:128102<=A&&A<=128105?B:g}return this}typeof DB<\"u\"&&DB.exports&&(DB.exports=oRe)});var i9=w((eot,r9)=>{var aRe=/^(.*?)(\\x1b\\[[^m]+m|\\x1b\\]8;;.*?(\\x1b\\\\|\\u0007))/,kB;function ARe(){if(kB)return kB;if(typeof Intl.Segmenter<\"u\"){let r=new Intl.Segmenter(\"en\",{granularity:\"grapheme\"});return kB=e=>Array.from(r.segment(e),({segment:t})=>t)}else{let r=t9(),e=new r;return kB=t=>e.splitGraphemes(t)}}r9.exports=(r,e=0,t=r.length)=>{if(e<0||t<0)throw new RangeError(\"Negative indices aren't supported by this implementation\");let i=t-e,n=\"\",s=0,o=0;for(;r.length>0;){let a=r.match(aRe)||[r,r,void 0],l=ARe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(\"\"),s+=c,o+=u,typeof a[2]<\"u\"&&(n+=a[2]),r=r.slice(a[0].length)}return n}});var Xf=w((Iot,E9)=>{\"use strict\";var m9=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\"]]);E9.exports=r=>r?Object.keys(r).map(e=>[m9.has(e)?m9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var _f=w((yot,x9)=>{\"use strict\";var I9=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},yRe=J(\"events\"),y9=J(\"stream\"),w9=J(\"string_decoder\").StringDecoder,Wa=Symbol(\"EOF\"),za=Symbol(\"maybeEmitEnd\"),tl=Symbol(\"emittedEnd\"),OB=Symbol(\"emittingEnd\"),NC=Symbol(\"emittedError\"),MB=Symbol(\"closed\"),B9=Symbol(\"read\"),UB=Symbol(\"flush\"),Q9=Symbol(\"flushChunk\"),vn=Symbol(\"encoding\"),Va=Symbol(\"decoder\"),KB=Symbol(\"flowing\"),LC=Symbol(\"paused\"),Zf=Symbol(\"resume\"),Ci=Symbol(\"bufferLength\"),zR=Symbol(\"bufferPush\"),VR=Symbol(\"bufferShift\"),Hi=Symbol(\"objectMode\"),Gi=Symbol(\"destroyed\"),XR=Symbol(\"emitData\"),b9=Symbol(\"emitEnd\"),ZR=Symbol(\"emitEnd2\"),Xa=Symbol(\"async\"),TC=r=>Promise.resolve().then(r),S9=global._MP_NO_ITERATOR_SYMBOLS_!==\"1\",wRe=S9&&Symbol.asyncIterator||Symbol(\"asyncIterator not implemented\"),BRe=S9&&Symbol.iterator||Symbol(\"iterator not implemented\"),QRe=r=>r===\"end\"||r===\"finish\"||r===\"prefinish\",bRe=r=>r instanceof ArrayBuffer||typeof r==\"object\"&&r.constructor&&r.constructor.name===\"ArrayBuffer\"&&r.byteLength>=0,SRe=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r),HB=class{constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e[Zf](),t.on(\"drain\",this.ondrain)}unpipe(){this.dest.removeListener(\"drain\",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},_R=class extends HB{unpipe(){this.src.removeListener(\"error\",this.proxyErrors),super.unpipe()}constructor(e,t,i){super(e,t,i),this.proxyErrors=n=>t.emit(\"error\",n),e.on(\"error\",this.proxyErrors)}};x9.exports=class v9 extends y9{constructor(e){super(),this[KB]=!1,this[LC]=!1,this.pipes=[],this.buffer=[],this[Hi]=e&&e.objectMode||!1,this[Hi]?this[vn]=null:this[vn]=e&&e.encoding||null,this[vn]===\"buffer\"&&(this[vn]=null),this[Xa]=e&&!!e.async||!1,this[Va]=this[vn]?new w9(this[vn]):null,this[Wa]=!1,this[tl]=!1,this[OB]=!1,this[MB]=!1,this[NC]=null,this.writable=!0,this.readable=!0,this[Ci]=0,this[Gi]=!1}get bufferLength(){return this[Ci]}get encoding(){return this[vn]}set encoding(e){if(this[Hi])throw new Error(\"cannot set encoding in objectMode\");if(this[vn]&&e!==this[vn]&&(this[Va]&&this[Va].lastNeed||this[Ci]))throw new Error(\"cannot change encoding\");this[vn]!==e&&(this[Va]=e?new w9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[Va].write(t)))),this[vn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Hi]}set objectMode(e){this[Hi]=this[Hi]||!!e}get async(){return this[Xa]}set async(e){this[Xa]=this[Xa]||!!e}write(e,t,i){if(this[Wa])throw new Error(\"write after end\");if(this[Gi])return this.emit(\"error\",Object.assign(new Error(\"Cannot call write after a stream was destroyed\"),{code:\"ERR_STREAM_DESTROYED\"})),!0;typeof t==\"function\"&&(i=t,t=\"utf8\"),t||(t=\"utf8\");let n=this[Xa]?TC:s=>s();return!this[Hi]&&!Buffer.isBuffer(e)&&(SRe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):bRe(e)?e=Buffer.from(e):typeof e!=\"string\"&&(this.objectMode=!0)),this[Hi]?(this.flowing&&this[Ci]!==0&&this[UB](!0),this.flowing?this.emit(\"data\",e):this[zR](e),this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing):e.length?(typeof e==\"string\"&&!(t===this[vn]&&!this[Va].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[vn]&&(e=this[Va].write(e)),this.flowing&&this[Ci]!==0&&this[UB](!0),this.flowing?this.emit(\"data\",e):this[zR](e),this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing):(this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing)}read(e){if(this[Gi])return null;if(this[Ci]===0||e===0||e>this[Ci])return this[za](),null;this[Hi]&&(e=null),this.buffer.length>1&&!this[Hi]&&(this.encoding?this.buffer=[this.buffer.join(\"\")]:this.buffer=[Buffer.concat(this.buffer,this[Ci])]);let t=this[B9](e||null,this.buffer[0]);return this[za](),t}[B9](e,t){return e===t.length||e===null?this[VR]():(this.buffer[0]=t.slice(e),t=t.slice(0,e),this[Ci]-=e),this.emit(\"data\",t),!this.buffer.length&&!this[Wa]&&this.emit(\"drain\"),t}end(e,t,i){return typeof e==\"function\"&&(i=e,e=null),typeof t==\"function\"&&(i=t,t=\"utf8\"),e&&this.write(e,t),i&&this.once(\"end\",i),this[Wa]=!0,this.writable=!1,(this.flowing||!this[LC])&&this[za](),this}[Zf](){this[Gi]||(this[LC]=!1,this[KB]=!0,this.emit(\"resume\"),this.buffer.length?this[UB]():this[Wa]?this[za]():this.emit(\"drain\"))}resume(){return this[Zf]()}pause(){this[KB]=!1,this[LC]=!0}get destroyed(){return this[Gi]}get flowing(){return this[KB]}get paused(){return this[LC]}[zR](e){this[Hi]?this[Ci]+=1:this[Ci]+=e.length,this.buffer.push(e)}[VR](){return this.buffer.length&&(this[Hi]?this[Ci]-=1:this[Ci]-=this.buffer[0].length),this.buffer.shift()}[UB](e){do;while(this[Q9](this[VR]()));!e&&!this.buffer.length&&!this[Wa]&&this.emit(\"drain\")}[Q9](e){return e?(this.emit(\"data\",e),this.flowing):!1}pipe(e,t){if(this[Gi])return;let i=this[tl];return t=t||{},e===I9.stdout||e===I9.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this.pipes.push(t.proxyErrors?new _R(this,e,t):new HB(this,e,t)),this[Xa]?TC(()=>this[Zf]()):this[Zf]()),e}unpipe(e){let t=this.pipes.find(i=>i.dest===e);t&&(this.pipes.splice(this.pipes.indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let i=super.on(e,t);return e===\"data\"&&!this.pipes.length&&!this.flowing?this[Zf]():e===\"readable\"&&this[Ci]!==0?super.emit(\"readable\"):QRe(e)&&this[tl]?(super.emit(e),this.removeAllListeners(e)):e===\"error\"&&this[NC]&&(this[Xa]?TC(()=>t.call(this,this[NC])):t.call(this,this[NC])),i}get emittedEnd(){return this[tl]}[za](){!this[OB]&&!this[tl]&&!this[Gi]&&this.buffer.length===0&&this[Wa]&&(this[OB]=!0,this.emit(\"end\"),this.emit(\"prefinish\"),this.emit(\"finish\"),this[MB]&&this.emit(\"close\"),this[OB]=!1)}emit(e,t,...i){if(e!==\"error\"&&e!==\"close\"&&e!==Gi&&this[Gi])return;if(e===\"data\")return t?this[Xa]?TC(()=>this[XR](t)):this[XR](t):!1;if(e===\"end\")return this[b9]();if(e===\"close\"){if(this[MB]=!0,!this[tl]&&!this[Gi])return;let s=super.emit(\"close\");return this.removeAllListeners(\"close\"),s}else if(e===\"error\"){this[NC]=t;let s=super.emit(\"error\",t);return this[za](),s}else if(e===\"resume\"){let s=super.emit(\"resume\");return this[za](),s}else if(e===\"finish\"||e===\"prefinish\"){let s=super.emit(e);return this.removeAllListeners(e),s}let n=super.emit(e,t,...i);return this[za](),n}[XR](e){for(let i of this.pipes)i.dest.write(e)===!1&&this.pause();let t=super.emit(\"data\",e);return this[za](),t}[b9](){this[tl]||(this[tl]=!0,this.readable=!1,this[Xa]?TC(()=>this[ZR]()):this[ZR]())}[ZR](){if(this[Va]){let t=this[Va].end();if(t){for(let i of this.pipes)i.dest.write(t);super.emit(\"data\",t)}}for(let t of this.pipes)t.end();let e=super.emit(\"end\");return this.removeAllListeners(\"end\"),e}collect(){let e=[];this[Hi]||(e.dataLength=0);let t=this.promise();return this.on(\"data\",i=>{e.push(i),this[Hi]||(e.dataLength+=i.length)}),t.then(()=>e)}concat(){return this[Hi]?Promise.reject(new Error(\"cannot concat in objectMode\")):this.collect().then(e=>this[Hi]?Promise.reject(new Error(\"cannot concat in objectMode\")):this[vn]?e.join(\"\"):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(Gi,()=>t(new Error(\"stream destroyed\"))),this.on(\"error\",i=>t(i)),this.on(\"end\",()=>e())})}[wRe](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[Wa])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener(\"data\",o),this.removeListener(\"end\",a),n(c)},o=c=>{this.removeListener(\"error\",s),this.removeListener(\"end\",a),this.pause(),i({value:c,done:!!this[Wa]})},a=()=>{this.removeListener(\"error\",s),this.removeListener(\"data\",o),i({done:!0})},l=()=>s(new Error(\"stream destroyed\"));return new Promise((c,u)=>{n=u,i=c,this.once(Gi,l),this.once(\"error\",s),this.once(\"end\",a),this.once(\"data\",o)})}}}[BRe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}destroy(e){return this[Gi]?(e?this.emit(\"error\",e):this.emit(Gi),this):(this[Gi]=!0,this.buffer.length=0,this[Ci]=0,typeof this.close==\"function\"&&!this[MB]&&this.close(),e?this.emit(\"error\",e):this.emit(Gi),this)}static isStream(e){return!!e&&(e instanceof v9||e instanceof y9||e instanceof yRe&&(typeof e.pipe==\"function\"||typeof e.write==\"function\"&&typeof e.end==\"function\"))}}});var D9=w((wot,P9)=>{var vRe=J(\"zlib\").constants||{ZLIB_VERNUM:4736};P9.exports=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:1/0,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},vRe))});var hF=w(Vn=>{\"use strict\";var iF=J(\"assert\"),rl=J(\"buffer\").Buffer,F9=J(\"zlib\"),Kc=Vn.constants=D9(),xRe=_f(),k9=rl.concat,Hc=Symbol(\"_superWrite\"),eh=class extends Error{constructor(e){super(\"zlib: \"+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code=\"ZLIB_ERROR\"),this.message=\"zlib: \"+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return\"ZlibError\"}},PRe=Symbol(\"opts\"),OC=Symbol(\"flushFlag\"),R9=Symbol(\"finishFlushFlag\"),fF=Symbol(\"fullFlushFlag\"),cr=Symbol(\"handle\"),GB=Symbol(\"onError\"),$f=Symbol(\"sawError\"),$R=Symbol(\"level\"),eF=Symbol(\"strategy\"),tF=Symbol(\"ended\"),Bot=Symbol(\"_defaultFullFlush\"),YB=class extends xRe{constructor(e,t){if(!e||typeof e!=\"object\")throw new TypeError(\"invalid options for ZlibBase constructor\");super(e),this[$f]=!1,this[tF]=!1,this[PRe]=e,this[OC]=e.flush,this[R9]=e.finishFlush;try{this[cr]=new F9[t](e)}catch(i){throw new eh(i)}this[GB]=i=>{this[$f]||(this[$f]=!0,this.close(),this.emit(\"error\",i))},this[cr].on(\"error\",i=>this[GB](new eh(i))),this.once(\"end\",()=>this.close)}close(){this[cr]&&(this[cr].close(),this[cr]=null,this.emit(\"close\"))}reset(){if(!this[$f])return iF(this[cr],\"zlib binding closed\"),this[cr].reset()}flush(e){this.ended||(typeof e!=\"number\"&&(e=this[fF]),this.write(Object.assign(rl.alloc(0),{[OC]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[R9]),this[tF]=!0,super.end(null,null,i)}get ended(){return this[tF]}write(e,t,i){if(typeof t==\"function\"&&(i=t,t=\"utf8\"),typeof e==\"string\"&&(e=rl.from(e,t)),this[$f])return;iF(this[cr],\"zlib binding closed\");let n=this[cr]._handle,s=n.close;n.close=()=>{};let o=this[cr].close;this[cr].close=()=>{},rl.concat=c=>c;let a;try{let c=typeof e[OC]==\"number\"?e[OC]:this[OC];a=this[cr]._processChunk(e,c),rl.concat=k9}catch(c){rl.concat=k9,this[GB](new eh(c))}finally{this[cr]&&(this[cr]._handle=n,n.close=s,this[cr].close=o,this[cr].removeAllListeners(\"error\"))}this[cr]&&this[cr].on(\"error\",c=>this[GB](new eh(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[Hc](rl.from(a[0]));for(let c=1;c<a.length;c++)l=this[Hc](a[c])}else l=this[Hc](rl.from(a));return i&&i(),l}[Hc](e){return super.write(e)}},Za=class extends YB{constructor(e,t){e=e||{},e.flush=e.flush||Kc.Z_NO_FLUSH,e.finishFlush=e.finishFlush||Kc.Z_FINISH,super(e,t),this[fF]=Kc.Z_FULL_FLUSH,this[$R]=e.level,this[eF]=e.strategy}params(e,t){if(!this[$f]){if(!this[cr])throw new Error(\"cannot switch params when binding is closed\");if(!this[cr].params)throw new Error(\"not supported in this implementation\");if(this[$R]!==e||this[eF]!==t){this.flush(Kc.Z_SYNC_FLUSH),iF(this[cr],\"zlib binding closed\");let i=this[cr].flush;this[cr].flush=(n,s)=>{this.flush(n),s()};try{this[cr].params(e,t)}finally{this[cr].flush=i}this[cr]&&(this[$R]=e,this[eF]=t)}}}},nF=class extends Za{constructor(e){super(e,\"Deflate\")}},sF=class extends Za{constructor(e){super(e,\"Inflate\")}},rF=Symbol(\"_portable\"),oF=class extends Za{constructor(e){super(e,\"Gzip\"),this[rF]=e&&!!e.portable}[Hc](e){return this[rF]?(this[rF]=!1,e[9]=255,super[Hc](e)):super[Hc](e)}},aF=class extends Za{constructor(e){super(e,\"Gunzip\")}},AF=class extends Za{constructor(e){super(e,\"DeflateRaw\")}},lF=class extends Za{constructor(e){super(e,\"InflateRaw\")}},cF=class extends Za{constructor(e){super(e,\"Unzip\")}},jB=class extends YB{constructor(e,t){e=e||{},e.flush=e.flush||Kc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Kc.BROTLI_OPERATION_FINISH,super(e,t),this[fF]=Kc.BROTLI_OPERATION_FLUSH}},uF=class extends jB{constructor(e){super(e,\"BrotliCompress\")}},gF=class extends jB{constructor(e){super(e,\"BrotliDecompress\")}};Vn.Deflate=nF;Vn.Inflate=sF;Vn.Gzip=oF;Vn.Gunzip=aF;Vn.DeflateRaw=AF;Vn.InflateRaw=lF;Vn.Unzip=cF;typeof F9.BrotliCompress==\"function\"?(Vn.BrotliCompress=uF,Vn.BrotliDecompress=gF):Vn.BrotliCompress=Vn.BrotliDecompress=class{constructor(){throw new Error(\"Brotli is not supported in this version of Node.js\")}}});var th=w((Sot,N9)=>{var DRe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;N9.exports=DRe!==\"win32\"?r=>r:r=>r&&r.replace(/\\\\/g,\"/\")});var qB=w((xot,L9)=>{\"use strict\";var kRe=_f(),pF=th(),dF=Symbol(\"slurp\");L9.exports=class extends kRe{constructor(e,t,i){switch(super(),this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,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=!0;break;default:this.ignore=!0}this.path=pF(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=pF(e.linkpath),this.uname=e.uname,this.gname=e.gname,t&&this[dF](t),i&&this[dF](i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,n-t),this.ignore?!0:i>=t?super.write(e):super.write(e.slice(0,i))}[dF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i===\"path\")&&(this[i]=i===\"path\"||i===\"linkpath\"?pF(e[i]):e[i])}}});var CF=w(JB=>{\"use strict\";JB.name=new Map([[\"0\",\"File\"],[\"\",\"OldFile\"],[\"1\",\"Link\"],[\"2\",\"SymbolicLink\"],[\"3\",\"CharacterDevice\"],[\"4\",\"BlockDevice\"],[\"5\",\"Directory\"],[\"6\",\"FIFO\"],[\"7\",\"ContiguousFile\"],[\"g\",\"GlobalExtendedHeader\"],[\"x\",\"ExtendedHeader\"],[\"A\",\"SolarisACL\"],[\"D\",\"GNUDumpDir\"],[\"I\",\"Inode\"],[\"K\",\"NextFileHasLongLinkpath\"],[\"L\",\"NextFileHasLongPath\"],[\"M\",\"ContinuationFile\"],[\"N\",\"OldGnuLongPath\"],[\"S\",\"SparseFile\"],[\"V\",\"TapeVolumeHeader\"],[\"X\",\"OldExtendedHeader\"]]);JB.code=new Map(Array.from(JB.name).map(r=>[r[1],r[0]]))});var U9=w((Dot,M9)=>{\"use strict\";var RRe=(r,e)=>{if(Number.isSafeInteger(r))r<0?NRe(r,e):FRe(r,e);else throw Error(\"cannot encode number outside of javascript safe integer range\");return e},FRe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},NRe=(r,e)=>{e[0]=255;var t=!1;r=r*-1;for(var i=e.length;i>1;i--){var n=r&255;r=Math.floor(r/256),t?e[i-1]=T9(n):n===0?e[i-1]=0:(t=!0,e[i-1]=O9(n))}},LRe=r=>{let e=r[0],t=e===128?ORe(r.slice(1,r.length)):e===255?TRe(r):null;if(t===null)throw Error(\"invalid base256 encoding\");if(!Number.isSafeInteger(t))throw Error(\"parsed number outside of javascript safe integer range\");return t},TRe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=T9(s):s===0?o=s:(i=!0,o=O9(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},ORe=r=>{for(var e=r.length,t=0,i=e-1;i>-1;i--){var n=r[i];n!==0&&(t+=n*Math.pow(256,e-i-1))}return t},T9=r=>(255^r)&255,O9=r=>(255^r)+1&255;M9.exports={encode:RRe,parse:LRe}});var ih=w((kot,H9)=>{\"use strict\";var mF=CF(),rh=J(\"path\").posix,K9=U9(),EF=Symbol(\"slurp\"),Xn=Symbol(\"type\"),wF=class{constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[Xn]=\"0\",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,t||0,i,n):e&&this.set(e)}decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error(\"need 512 bytes for header\");if(this.path=Gc(e,t,100),this.mode=il(e,t+100,8),this.uid=il(e,t+108,8),this.gid=il(e,t+116,8),this.size=il(e,t+124,12),this.mtime=IF(e,t+136,12),this.cksum=il(e,t+148,12),this[EF](i),this[EF](n,!0),this[Xn]=Gc(e,t+156,1),this[Xn]===\"\"&&(this[Xn]=\"0\"),this[Xn]===\"0\"&&this.path.substr(-1)===\"/\"&&(this[Xn]=\"5\"),this[Xn]===\"5\"&&(this.size=0),this.linkpath=Gc(e,t+157,100),e.slice(t+257,t+265).toString()===\"ustar\\x0000\")if(this.uname=Gc(e,t+265,32),this.gname=Gc(e,t+297,32),this.devmaj=il(e,t+329,8),this.devmin=il(e,t+337,8),e[t+475]!==0){let o=Gc(e,t+345,155);this.path=o+\"/\"+this.path}else{let o=Gc(e,t+345,130);o&&(this.path=o+\"/\"+this.path),this.atime=IF(e,t+476,12),this.ctime=IF(e,t+488,12)}let s=8*32;for(let o=t;o<t+148;o++)s+=e[o];for(let o=t+156;o<t+512;o++)s+=e[o];this.cksumValid=s===this.cksum,this.cksum===null&&s===8*32&&(this.nullBlock=!0)}[EF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i===\"path\")&&(this[i]=e[i])}encode(e,t){if(e||(e=this.block=Buffer.alloc(512),t=0),t||(t=0),!(e.length>=t+512))throw new Error(\"need 512 bytes for header\");let i=this.ctime||this.atime?130:155,n=MRe(this.path||\"\",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=Yc(e,t,100,s)||this.needPax,this.needPax=nl(e,t+100,8,this.mode)||this.needPax,this.needPax=nl(e,t+108,8,this.uid)||this.needPax,this.needPax=nl(e,t+116,8,this.gid)||this.needPax,this.needPax=nl(e,t+124,12,this.size)||this.needPax,this.needPax=yF(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[Xn].charCodeAt(0),this.needPax=Yc(e,t+157,100,this.linkpath)||this.needPax,e.write(\"ustar\\x0000\",t+257,8),this.needPax=Yc(e,t+265,32,this.uname)||this.needPax,this.needPax=Yc(e,t+297,32,this.gname)||this.needPax,this.needPax=nl(e,t+329,8,this.devmaj)||this.needPax,this.needPax=nl(e,t+337,8,this.devmin)||this.needPax,this.needPax=Yc(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=Yc(e,t+345,155,o)||this.needPax:(this.needPax=Yc(e,t+345,130,o)||this.needPax,this.needPax=yF(e,t+476,12,this.atime)||this.needPax,this.needPax=yF(e,t+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=t;l<t+148;l++)a+=e[l];for(let l=t+156;l<t+512;l++)a+=e[l];return this.cksum=a,nl(e,t+148,8,this.cksum),this.cksumValid=!0,this.needPax}set(e){for(let t in e)e[t]!==null&&e[t]!==void 0&&(this[t]=e[t])}get type(){return mF.name.get(this[Xn])||this[Xn]}get typeKey(){return this[Xn]}set type(e){mF.code.has(e)?this[Xn]=mF.code.get(e):this[Xn]=e}},MRe=(r,e)=>{let i=r,n=\"\",s,o=rh.parse(r).root||\".\";if(Buffer.byteLength(i)<100)s=[i,n,!1];else{n=rh.dirname(i),i=rh.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(n)<=e?s=[i,n,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(n)<=e?s=[i.substr(0,100-1),n,!0]:(i=rh.join(rh.basename(n),i),n=rh.dirname(n));while(n!==o&&!s);s||(s=[r.substr(0,100-1),\"\",!0])}return s},Gc=(r,e,t)=>r.slice(e,e+t).toString(\"utf8\").replace(/\\0.*/,\"\"),IF=(r,e,t)=>URe(il(r,e,t)),URe=r=>r===null?null:new Date(r*1e3),il=(r,e,t)=>r[e]&128?K9.parse(r.slice(e,e+t)):HRe(r,e,t),KRe=r=>isNaN(r)?null:r,HRe=(r,e,t)=>KRe(parseInt(r.slice(e,e+t).toString(\"utf8\").replace(/\\0.*$/,\"\").trim(),8)),GRe={12:8589934591,8:2097151},nl=(r,e,t,i)=>i===null?!1:i>GRe[t]||i<0?(K9.encode(i,r.slice(e,e+t)),!0):(YRe(r,e,t,i),!1),YRe=(r,e,t,i)=>r.write(jRe(i,t),e,t,\"ascii\"),jRe=(r,e)=>qRe(Math.floor(r).toString(8),e),qRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join(\"0\")+r+\" \")+\"\\0\",yF=(r,e,t,i)=>i===null?!1:nl(r,e,t,i.getTime()/1e3),JRe=new Array(156).join(\"\\0\"),Yc=(r,e,t,i)=>i===null?!1:(r.write(i+JRe,e,t,\"utf8\"),i.length!==Buffer.byteLength(i)||i.length>t);H9.exports=wF});var WB=w((Rot,G9)=>{\"use strict\";var WRe=ih(),zRe=J(\"path\"),MC=class{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){let e=this.encodeBody();if(e===\"\")return null;let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new WRe({path:(\"PaxHeader/\"+zRe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?\"GlobalExtendedHeader\":\"ExtendedHeader\",linkpath:\"\",uname:this.uname||\"\",gname:this.gname||\"\",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,t,\"utf8\");for(let s=t+512;s<n.length;s++)n[s]=0;return n}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(e){if(this[e]===null||this[e]===void 0)return\"\";let t=this[e]instanceof Date?this[e].getTime()/1e3:this[e],i=\" \"+(e===\"dev\"||e===\"ino\"||e===\"nlink\"?\"SCHILY.\":\"\")+e+\"=\"+t+`\n`,n=Buffer.byteLength(i),s=Math.floor(Math.log(n)/Math.log(10))+1;return n+s>=Math.pow(10,s)&&(s+=1),s+n+i}};MC.parse=(r,e,t)=>new MC(VRe(XRe(r),e),t);var VRe=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,XRe=r=>r.replace(/\\n$/,\"\").split(`\n`).reduce(ZRe,Object.create(null)),ZRe=(r,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return r;e=e.substr((t+\" \").length);let i=e.split(\"=\"),n=i.shift().replace(/^SCHILY\\.(dev|ino|nlink)/,\"$1\");if(!n)return r;let s=i.join(\"=\");return r[n]=/^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,r};G9.exports=MC});var nh=w((Fot,Y9)=>{Y9.exports=r=>{let e=r.length-1,t=-1;for(;e>-1&&r.charAt(e)===\"/\";)t=e,e--;return t===-1?r:r.slice(0,t)}});var zB=w((Not,j9)=>{\"use strict\";j9.exports=r=>class extends r{warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),this.emit(\"warn\",i.tarCode,t,i)):t instanceof Error?this.emit(\"error\",Object.assign(t,i)):this.emit(\"error\",Object.assign(new Error(`${e}: ${t}`),i))}}});var QF=w((Tot,q9)=>{\"use strict\";var VB=[\"|\",\"<\",\">\",\"?\",\":\"],BF=VB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),_Re=new Map(VB.map((r,e)=>[r,BF[e]])),$Re=new Map(BF.map((r,e)=>[r,VB[e]]));q9.exports={encode:r=>VB.reduce((e,t)=>e.split(t).join(_Re.get(t)),r),decode:r=>BF.reduce((e,t)=>e.split(t).join($Re.get(t)),r)}});var bF=w((Oot,W9)=>{var{isAbsolute:eFe,parse:J9}=J(\"path\").win32;W9.exports=r=>{let e=\"\",t=J9(r);for(;eFe(r)||t.root;){let i=r.charAt(0)===\"/\"&&r.slice(0,4)!==\"//?/\"?\"/\":t.root;r=r.substr(i.length),e+=i,t=J9(r)}return[e,r]}});var V9=w((Mot,z9)=>{\"use strict\";z9.exports=(r,e,t)=>(r&=4095,t&&(r=(r|384)&-19),e&&(r&256&&(r|=64),r&32&&(r|=8),r&4&&(r|=1)),r)});var LF=w((Hot,lX)=>{\"use strict\";var rX=_f(),iX=WB(),nX=ih(),Zo=J(\"fs\"),X9=J(\"path\"),Xo=th(),tFe=nh(),sX=(r,e)=>e?(r=Xo(r).replace(/^\\.(\\/|$)/,\"\"),tFe(e)+\"/\"+r):Xo(r),rFe=16*1024*1024,Z9=Symbol(\"process\"),_9=Symbol(\"file\"),$9=Symbol(\"directory\"),vF=Symbol(\"symlink\"),eX=Symbol(\"hardlink\"),UC=Symbol(\"header\"),XB=Symbol(\"read\"),xF=Symbol(\"lstat\"),ZB=Symbol(\"onlstat\"),PF=Symbol(\"onread\"),DF=Symbol(\"onreadlink\"),kF=Symbol(\"openfile\"),RF=Symbol(\"onopenfile\"),sl=Symbol(\"close\"),_B=Symbol(\"mode\"),FF=Symbol(\"awaitDrain\"),SF=Symbol(\"ondrain\"),_o=Symbol(\"prefix\"),tX=Symbol(\"hadError\"),oX=zB(),iFe=QF(),aX=bF(),AX=V9(),$B=oX(class extends rX{constructor(e,t){if(t=t||{},super(t),typeof e!=\"string\")throw new TypeError(\"path is required\");this.path=Xo(e),this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||\"\",this.maxReadSize=t.maxReadSize||rFe,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=Xo(t.cwd||process.cwd()),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,this.prefix=t.prefix?Xo(t.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof t.onwarn==\"function\"&&this.on(\"warn\",t.onwarn);let i=!1;if(!this.preservePaths){let[n,s]=aX(this.path);n&&(this.path=s,i=n)}this.win32=!!t.win32||process.platform===\"win32\",this.win32&&(this.path=iFe.decode(this.path.replace(/\\\\/g,\"/\")),e=e.replace(/\\\\/g,\"/\")),this.absolute=Xo(t.absolute||X9.resolve(this.cwd,e)),this.path===\"\"&&(this.path=\"./\"),i&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[ZB](this.statCache.get(this.absolute)):this[xF]()}emit(e,...t){return e===\"error\"&&(this[tX]=!0),super.emit(e,...t)}[xF](){Zo.lstat(this.absolute,(e,t)=>{if(e)return this.emit(\"error\",e);this[ZB](t)})}[ZB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=sFe(e),this.emit(\"stat\",e),this[Z9]()}[Z9](){switch(this.type){case\"File\":return this[_9]();case\"Directory\":return this[$9]();case\"SymbolicLink\":return this[vF]();default:return this.end()}}[_B](e){return AX(e,this.type===\"Directory\",this.portable)}[_o](e){return sX(e,this.prefix)}[UC](){this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.header=new nX({path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,mode:this[_B](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:\"\",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new iX({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[$9](){this.path.substr(-1)!==\"/\"&&(this.path+=\"/\"),this.stat.size=0,this[UC](),this.end()}[vF](){Zo.readlink(this.absolute,(e,t)=>{if(e)return this.emit(\"error\",e);this[DF](t)})}[DF](e){this.linkpath=Xo(e),this[UC](),this.end()}[eX](e){this.type=\"Link\",this.linkpath=Xo(X9.relative(this.cwd,e)),this.stat.size=0,this[UC](),this.end()}[_9](){if(this.stat.nlink>1){let e=this.stat.dev+\":\"+this.stat.ino;if(this.linkCache.has(e)){let t=this.linkCache.get(e);if(t.indexOf(this.cwd)===0)return this[eX](t)}this.linkCache.set(e,this.absolute)}if(this[UC](),this.stat.size===0)return this.end();this[kF]()}[kF](){Zo.open(this.absolute,\"r\",(e,t)=>{if(e)return this.emit(\"error\",e);this[RF](t)})}[RF](e){if(this.fd=e,this[tX])return this[sl]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[XB]()}[XB](){let{fd:e,buf:t,offset:i,length:n,pos:s}=this;Zo.read(e,t,i,n,s,(o,a)=>{if(o)return this[sl](()=>this.emit(\"error\",o));this[PF](a)})}[sl](e){Zo.close(this.fd,e)}[PF](e){if(e<=0&&this.remain>0){let n=new Error(\"encountered unexpected EOF\");return n.path=this.absolute,n.syscall=\"read\",n.code=\"EOF\",this[sl](()=>this.emit(\"error\",n))}if(e>this.remain){let n=new Error(\"did not encounter expected EOF\");return n.path=this.absolute,n.syscall=\"read\",n.code=\"EOF\",this[sl](()=>this.emit(\"error\",n))}if(e===this.remain)for(let n=e;n<this.length&&e<this.blockRemain;n++)this.buf[n+this.offset]=0,e++,this.remain++;let t=this.offset===0&&e===this.buf.length?this.buf:this.buf.slice(this.offset,this.offset+e);this.write(t)?this[SF]():this[FF](()=>this[SF]())}[FF](e){this.once(\"drain\",e)}write(e){if(this.blockRemain<e.length){let t=new Error(\"writing more data than expected\");return t.path=this.absolute,this.emit(\"error\",t)}return this.remain-=e.length,this.blockRemain-=e.length,this.pos+=e.length,this.offset+=e.length,super.write(e)}[SF](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[sl](e=>e?this.emit(\"error\",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[XB]()}}),NF=class extends $B{[xF](){this[ZB](Zo.lstatSync(this.absolute))}[vF](){this[DF](Zo.readlinkSync(this.absolute))}[kF](){this[RF](Zo.openSync(this.absolute,\"r\"))}[XB](){let e=!0;try{let{fd:t,buf:i,offset:n,length:s,pos:o}=this,a=Zo.readSync(t,i,n,s,o);this[PF](a),e=!1}finally{if(e)try{this[sl](()=>{})}catch{}}}[FF](e){e()}[sl](e){Zo.closeSync(this.fd),e()}},nFe=oX(class extends rX{constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.prefix=t.prefix||null,this.path=Xo(e.path),this.mode=this[_B](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=Xo(e.linkpath),typeof t.onwarn==\"function\"&&this.on(\"warn\",t.onwarn);let i=!1;if(!this.preservePaths){let[n,s]=aX(this.path);n&&(this.path=s,i=n)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new nX({path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new iX({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[_o](e){return sX(e,this.prefix)}[_B](e){return AX(e,this.type===\"Directory\",this.portable)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});$B.Sync=NF;$B.Tar=nFe;var sFe=r=>r.isFile()?\"File\":r.isDirectory()?\"Directory\":r.isSymbolicLink()?\"SymbolicLink\":\"Unsupported\";lX.exports=$B});var A0=w((Yot,dX)=>{\"use strict\";var o0=class{constructor(e,t){this.path=e||\"./\",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},oFe=_f(),aFe=hF(),AFe=qB(),jF=LF(),lFe=jF.Sync,cFe=jF.Tar,uFe=WI(),cX=Buffer.alloc(1024),r0=Symbol(\"onStat\"),e0=Symbol(\"ended\"),$o=Symbol(\"queue\"),sh=Symbol(\"current\"),jc=Symbol(\"process\"),t0=Symbol(\"processing\"),uX=Symbol(\"processJob\"),ea=Symbol(\"jobs\"),TF=Symbol(\"jobDone\"),i0=Symbol(\"addFSEntry\"),gX=Symbol(\"addTarEntry\"),KF=Symbol(\"stat\"),HF=Symbol(\"readdir\"),n0=Symbol(\"onreaddir\"),s0=Symbol(\"pipe\"),fX=Symbol(\"entry\"),OF=Symbol(\"entryOpt\"),GF=Symbol(\"writeEntryClass\"),pX=Symbol(\"write\"),MF=Symbol(\"ondrain\"),a0=J(\"fs\"),hX=J(\"path\"),gFe=zB(),UF=th(),qF=gFe(class extends oFe{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||\"\",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=UF(e.prefix||\"\"),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[GF]=jF,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!=\"object\"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new aFe.Gzip(e.gzip),this.zip.on(\"data\",t=>super.write(t)),this.zip.on(\"end\",t=>super.end()),this.zip.on(\"drain\",t=>this[MF]()),this.on(\"resume\",t=>this.zip.resume())):this.on(\"drain\",this[MF]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter==\"function\"?e.filter:t=>!0,this[$o]=new uFe,this[ea]=0,this.jobs=+e.jobs||4,this[t0]=!1,this[e0]=!1}[pX](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[e0]=!0,this[jc](),this}write(e){if(this[e0])throw new Error(\"write after end\");return e instanceof AFe?this[gX](e):this[i0](e),this.flowing}[gX](e){let t=UF(hX.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let i=new o0(e.path,t,!1);i.entry=new cFe(e,this[OF](i)),i.entry.on(\"end\",n=>this[TF](i)),this[ea]+=1,this[$o].push(i)}this[jc]()}[i0](e){let t=UF(hX.resolve(this.cwd,e));this[$o].push(new o0(e,t)),this[jc]()}[KF](e){e.pending=!0,this[ea]+=1;let t=this.follow?\"stat\":\"lstat\";a0[t](e.absolute,(i,n)=>{e.pending=!1,this[ea]-=1,i?this.emit(\"error\",i):this[r0](e,n)})}[r0](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[jc]()}[HF](e){e.pending=!0,this[ea]+=1,a0.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[ea]-=1,t)return this.emit(\"error\",t);this[n0](e,i)})}[n0](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[jc]()}[jc](){if(!this[t0]){this[t0]=!0;for(let e=this[$o].head;e!==null&&this[ea]<this.jobs;e=e.next)if(this[uX](e.value),e.value.ignore){let t=e.next;this[$o].removeNode(e),e.next=t}this[t0]=!1,this[e0]&&!this[$o].length&&this[ea]===0&&(this.zip?this.zip.end(cX):(super.write(cX),super.end()))}}get[sh](){return this[$o]&&this[$o].head&&this[$o].head.value}[TF](e){this[$o].shift(),this[ea]-=1,this[jc]()}[uX](e){if(!e.pending){if(e.entry){e===this[sh]&&!e.piped&&this[s0](e);return}if(e.stat||(this.statCache.has(e.absolute)?this[r0](e,this.statCache.get(e.absolute)):this[KF](e)),!!e.stat&&!e.ignore&&!(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir&&(this.readdirCache.has(e.absolute)?this[n0](e,this.readdirCache.get(e.absolute)):this[HF](e),!e.readdir))){if(e.entry=this[fX](e),!e.entry){e.ignore=!0;return}e===this[sh]&&!e.piped&&this[s0](e)}}}[OF](e){return{onwarn:(t,i,n)=>this.warn(t,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.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}}[fX](e){this[ea]+=1;try{return new this[GF](e.path,this[OF](e)).on(\"end\",()=>this[TF](e)).on(\"error\",t=>this.emit(\"error\",t))}catch(t){this.emit(\"error\",t)}}[MF](){this[sh]&&this[sh].entry&&this[sh].entry.resume()}[s0](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=e.path,o=s===\"./\"?\"\":s.replace(/\\/*$/,\"/\");this[i0](o+n)});let t=e.entry,i=this.zip;i?t.on(\"data\",n=>{i.write(n)||t.pause()}):t.on(\"data\",n=>{super.write(n)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),YF=class extends qF{constructor(e){super(e),this[GF]=lFe}pause(){}resume(){}[KF](e){let t=this.follow?\"statSync\":\"lstatSync\";this[r0](e,a0[t](e.absolute))}[HF](e,t){this[n0](e,a0.readdirSync(e.absolute))}[s0](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=e.path,o=s===\"./\"?\"\":s.replace(/\\/*$/,\"/\");this[i0](o+n)}),i?t.on(\"data\",n=>{i.write(n)}):t.on(\"data\",n=>{super[pX](n)})}};qF.Sync=YF;dX.exports=qF});var fh=w(HC=>{\"use strict\";var fFe=_f(),hFe=J(\"events\").EventEmitter,xn=J(\"fs\"),zF=xn.writev;if(!zF){let r=process.binding(\"fs\"),e=r.FSReqWrap||r.FSReqCallback;zF=(t,i,n,s)=>{let o=(l,c)=>s(l,c,i),a=new e;a.oncomplete=o,r.writeBuffers(t,i,n,a)}}var uh=Symbol(\"_autoClose\"),Ao=Symbol(\"_close\"),KC=Symbol(\"_ended\"),rr=Symbol(\"_fd\"),CX=Symbol(\"_finished\"),al=Symbol(\"_flags\"),JF=Symbol(\"_flush\"),VF=Symbol(\"_handleChunk\"),XF=Symbol(\"_makeBuf\"),f0=Symbol(\"_mode\"),l0=Symbol(\"_needDrain\"),lh=Symbol(\"_onerror\"),gh=Symbol(\"_onopen\"),WF=Symbol(\"_onread\"),ah=Symbol(\"_onwrite\"),Al=Symbol(\"_open\"),_a=Symbol(\"_path\"),qc=Symbol(\"_pos\"),ta=Symbol(\"_queue\"),Ah=Symbol(\"_read\"),mX=Symbol(\"_readSize\"),ol=Symbol(\"_reading\"),c0=Symbol(\"_remain\"),EX=Symbol(\"_size\"),u0=Symbol(\"_write\"),oh=Symbol(\"_writing\"),g0=Symbol(\"_defaultFlag\"),ch=Symbol(\"_errored\"),h0=class extends fFe{constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!=\"string\")throw new TypeError(\"path must be a string\");this[ch]=!1,this[rr]=typeof t.fd==\"number\"?t.fd:null,this[_a]=e,this[mX]=t.readSize||16*1024*1024,this[ol]=!1,this[EX]=typeof t.size==\"number\"?t.size:1/0,this[c0]=this[EX],this[uh]=typeof t.autoClose==\"boolean\"?t.autoClose:!0,typeof this[rr]==\"number\"?this[Ah]():this[Al]()}get fd(){return this[rr]}get path(){return this[_a]}write(){throw new TypeError(\"this is a readable stream\")}end(){throw new TypeError(\"this is a readable stream\")}[Al](){xn.open(this[_a],\"r\",(e,t)=>this[gh](e,t))}[gh](e,t){e?this[lh](e):(this[rr]=t,this.emit(\"open\",t),this[Ah]())}[XF](){return Buffer.allocUnsafe(Math.min(this[mX],this[c0]))}[Ah](){if(!this[ol]){this[ol]=!0;let e=this[XF]();if(e.length===0)return process.nextTick(()=>this[WF](null,0,e));xn.read(this[rr],e,0,e.length,null,(t,i,n)=>this[WF](t,i,n))}}[WF](e,t,i){this[ol]=!1,e?this[lh](e):this[VF](t,i)&&this[Ah]()}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,xn.close(e,t=>t?this.emit(\"error\",t):this.emit(\"close\"))}}[lh](e){this[ol]=!0,this[Ao](),this.emit(\"error\",e)}[VF](e,t){let i=!1;return this[c0]-=e,e>0&&(i=super.write(e<t.length?t.slice(0,e):t)),(e===0||this[c0]<=0)&&(i=!1,this[Ao](),super.end()),i}emit(e,t){switch(e){case\"prefinish\":case\"finish\":break;case\"drain\":typeof this[rr]==\"number\"&&this[Ah]();break;case\"error\":return this[ch]?void 0:(this[ch]=!0,super.emit(e,t));default:return super.emit(e,t)}}},ZF=class extends h0{[Al](){let e=!0;try{this[gh](null,xn.openSync(this[_a],\"r\")),e=!1}finally{e&&this[Ao]()}}[Ah](){let e=!0;try{if(!this[ol]){this[ol]=!0;do{let t=this[XF](),i=t.length===0?0:xn.readSync(this[rr],t,0,t.length,null);if(!this[VF](i,t))break}while(!0);this[ol]=!1}e=!1}finally{e&&this[Ao]()}}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,xn.closeSync(e),this.emit(\"close\")}}},p0=class extends hFe{constructor(e,t){t=t||{},super(t),this.readable=!1,this.writable=!0,this[ch]=!1,this[oh]=!1,this[KC]=!1,this[l0]=!1,this[ta]=[],this[_a]=e,this[rr]=typeof t.fd==\"number\"?t.fd:null,this[f0]=t.mode===void 0?438:t.mode,this[qc]=typeof t.start==\"number\"?t.start:null,this[uh]=typeof t.autoClose==\"boolean\"?t.autoClose:!0;let i=this[qc]!==null?\"r+\":\"w\";this[g0]=t.flags===void 0,this[al]=this[g0]?i:t.flags,this[rr]===null&&this[Al]()}emit(e,t){if(e===\"error\"){if(this[ch])return;this[ch]=!0}return super.emit(e,t)}get fd(){return this[rr]}get path(){return this[_a]}[lh](e){this[Ao](),this[oh]=!0,this.emit(\"error\",e)}[Al](){xn.open(this[_a],this[al],this[f0],(e,t)=>this[gh](e,t))}[gh](e,t){this[g0]&&this[al]===\"r+\"&&e&&e.code===\"ENOENT\"?(this[al]=\"w\",this[Al]()):e?this[lh](e):(this[rr]=t,this.emit(\"open\",t),this[JF]())}end(e,t){return e&&this.write(e,t),this[KC]=!0,!this[oh]&&!this[ta].length&&typeof this[rr]==\"number\"&&this[ah](null,0),this}write(e,t){return typeof e==\"string\"&&(e=Buffer.from(e,t)),this[KC]?(this.emit(\"error\",new Error(\"write() after end()\")),!1):this[rr]===null||this[oh]||this[ta].length?(this[ta].push(e),this[l0]=!0,!1):(this[oh]=!0,this[u0](e),!0)}[u0](e){xn.write(this[rr],e,0,e.length,this[qc],(t,i)=>this[ah](t,i))}[ah](e,t){e?this[lh](e):(this[qc]!==null&&(this[qc]+=t),this[ta].length?this[JF]():(this[oh]=!1,this[KC]&&!this[CX]?(this[CX]=!0,this[Ao](),this.emit(\"finish\")):this[l0]&&(this[l0]=!1,this.emit(\"drain\"))))}[JF](){if(this[ta].length===0)this[KC]&&this[ah](null,0);else if(this[ta].length===1)this[u0](this[ta].pop());else{let e=this[ta];this[ta]=[],zF(this[rr],e,this[qc],(t,i)=>this[ah](t,i))}}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,xn.close(e,t=>t?this.emit(\"error\",t):this.emit(\"close\"))}}},_F=class extends p0{[Al](){let e;if(this[g0]&&this[al]===\"r+\")try{e=xn.openSync(this[_a],this[al],this[f0])}catch(t){if(t.code===\"ENOENT\")return this[al]=\"w\",this[Al]();throw t}else e=xn.openSync(this[_a],this[al],this[f0]);this[gh](null,e)}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,xn.closeSync(e),this.emit(\"close\")}}[u0](e){let t=!0;try{this[ah](null,xn.writeSync(this[rr],e,0,e.length,this[qc])),t=!1}finally{if(t)try{this[Ao]()}catch{}}}};HC.ReadStream=h0;HC.ReadStreamSync=ZF;HC.WriteStream=p0;HC.WriteStreamSync=_F});var w0=w((Jot,SX)=>{\"use strict\";var pFe=zB(),dFe=ih(),CFe=J(\"events\"),mFe=WI(),EFe=1024*1024,IFe=qB(),IX=WB(),yFe=hF(),$F=Buffer.from([31,139]),xs=Symbol(\"state\"),Jc=Symbol(\"writeEntry\"),$a=Symbol(\"readEntry\"),eN=Symbol(\"nextEntry\"),yX=Symbol(\"processEntry\"),Ps=Symbol(\"extendedHeader\"),GC=Symbol(\"globalExtendedHeader\"),ll=Symbol(\"meta\"),wX=Symbol(\"emitMeta\"),Er=Symbol(\"buffer\"),eA=Symbol(\"queue\"),Wc=Symbol(\"ended\"),BX=Symbol(\"emittedEnd\"),zc=Symbol(\"emit\"),Pn=Symbol(\"unzip\"),d0=Symbol(\"consumeChunk\"),C0=Symbol(\"consumeChunkSub\"),tN=Symbol(\"consumeBody\"),QX=Symbol(\"consumeMeta\"),bX=Symbol(\"consumeHeader\"),m0=Symbol(\"consuming\"),rN=Symbol(\"bufferConcat\"),iN=Symbol(\"maybeEnd\"),YC=Symbol(\"writing\"),cl=Symbol(\"aborted\"),E0=Symbol(\"onDone\"),Vc=Symbol(\"sawValidEntry\"),I0=Symbol(\"sawNullBlock\"),y0=Symbol(\"sawEOF\"),wFe=r=>!0;SX.exports=pFe(class extends CFe{constructor(e){e=e||{},super(e),this.file=e.file||\"\",this[Vc]=null,this.on(E0,t=>{(this[xs]===\"begin\"||this[Vc]===!1)&&this.warn(\"TAR_BAD_ARCHIVE\",\"Unrecognized archive format\")}),e.ondone?this.on(E0,e.ondone):this.on(E0,t=>{this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||EFe,this.filter=typeof e.filter==\"function\"?e.filter:wFe,this.writable=!0,this.readable=!1,this[eA]=new mFe,this[Er]=null,this[$a]=null,this[Jc]=null,this[xs]=\"begin\",this[ll]=\"\",this[Ps]=null,this[GC]=null,this[Wc]=!1,this[Pn]=null,this[cl]=!1,this[I0]=!1,this[y0]=!1,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),typeof e.onentry==\"function\"&&this.on(\"entry\",e.onentry)}[bX](e,t){this[Vc]===null&&(this[Vc]=!1);let i;try{i=new dFe(e,t,this[Ps],this[GC])}catch(n){return this.warn(\"TAR_ENTRY_INVALID\",n)}if(i.nullBlock)this[I0]?(this[y0]=!0,this[xs]===\"begin\"&&(this[xs]=\"header\"),this[zc](\"eof\")):(this[I0]=!0,this[zc](\"nullBlock\"));else if(this[I0]=!1,!i.cksumValid)this.warn(\"TAR_ENTRY_INVALID\",\"checksum failure\",{header:i});else if(!i.path)this.warn(\"TAR_ENTRY_INVALID\",\"path is required\",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath required\",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath forbidden\",{header:i});else{let s=this[Jc]=new IFe(i,this[Ps],this[GC]);if(!this[Vc])if(s.remain){let o=()=>{s.invalid||(this[Vc]=!0)};s.on(\"end\",o)}else this[Vc]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[zc](\"ignoredEntry\",s),this[xs]=\"ignore\",s.resume()):s.size>0&&(this[ll]=\"\",s.on(\"data\",o=>this[ll]+=o),this[xs]=\"meta\"):(this[Ps]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[zc](\"ignoredEntry\",s),this[xs]=s.remain?\"ignore\":\"header\",s.resume()):(s.remain?this[xs]=\"body\":(this[xs]=\"header\",s.end()),this[$a]?this[eA].push(s):(this[eA].push(s),this[eN]())))}}}[yX](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[$a]=e,this.emit(\"entry\",e),e.emittedEnd||(e.on(\"end\",i=>this[eN]()),t=!1)):(this[$a]=null,t=!1),t}[eN](){do;while(this[yX](this[eA].shift()));if(!this[eA].length){let e=this[$a];!e||e.flowing||e.size===e.remain?this[YC]||this.emit(\"drain\"):e.once(\"drain\",i=>this.emit(\"drain\"))}}[tN](e,t){let i=this[Jc],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(t,t+n);return i.write(s),i.blockRemain||(this[xs]=\"header\",this[Jc]=null,i.end()),s.length}[QX](e,t){let i=this[Jc],n=this[tN](e,t);return this[Jc]||this[wX](i),n}[zc](e,t,i){!this[eA].length&&!this[$a]?this.emit(e,t,i):this[eA].push([e,t,i])}[wX](e){switch(this[zc](\"meta\",this[ll]),e.type){case\"ExtendedHeader\":case\"OldExtendedHeader\":this[Ps]=IX.parse(this[ll],this[Ps],!1);break;case\"GlobalExtendedHeader\":this[GC]=IX.parse(this[ll],this[GC],!0);break;case\"NextFileHasLongPath\":case\"OldGnuLongPath\":this[Ps]=this[Ps]||Object.create(null),this[Ps].path=this[ll].replace(/\\0.*/,\"\");break;case\"NextFileHasLongLinkpath\":this[Ps]=this[Ps]||Object.create(null),this[Ps].linkpath=this[ll].replace(/\\0.*/,\"\");break;default:throw new Error(\"unknown meta: \"+e.type)}}abort(e){this[cl]=!0,this.emit(\"abort\",e),this.warn(\"TAR_ABORT\",e,{recoverable:!1})}write(e){if(this[cl])return;if(this[Pn]===null&&e){if(this[Er]&&(e=Buffer.concat([this[Er],e]),this[Er]=null),e.length<$F.length)return this[Er]=e,!0;for(let i=0;this[Pn]===null&&i<$F.length;i++)e[i]!==$F[i]&&(this[Pn]=!1);if(this[Pn]===null){let i=this[Wc];this[Wc]=!1,this[Pn]=new yFe.Unzip,this[Pn].on(\"data\",s=>this[d0](s)),this[Pn].on(\"error\",s=>this.abort(s)),this[Pn].on(\"end\",s=>{this[Wc]=!0,this[d0]()}),this[YC]=!0;let n=this[Pn][i?\"end\":\"write\"](e);return this[YC]=!1,n}}this[YC]=!0,this[Pn]?this[Pn].write(e):this[d0](e),this[YC]=!1;let t=this[eA].length?!1:this[$a]?this[$a].flowing:!0;return!t&&!this[eA].length&&this[$a].once(\"drain\",i=>this.emit(\"drain\")),t}[rN](e){e&&!this[cl]&&(this[Er]=this[Er]?Buffer.concat([this[Er],e]):e)}[iN](){if(this[Wc]&&!this[BX]&&!this[cl]&&!this[m0]){this[BX]=!0;let e=this[Jc];if(e&&e.blockRemain){let t=this[Er]?this[Er].length:0;this.warn(\"TAR_BAD_ARCHIVE\",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[Er]&&e.write(this[Er]),e.end()}this[zc](E0)}}[d0](e){if(this[m0])this[rN](e);else if(!e&&!this[Er])this[iN]();else{if(this[m0]=!0,this[Er]){this[rN](e);let t=this[Er];this[Er]=null,this[C0](t)}else this[C0](e);for(;this[Er]&&this[Er].length>=512&&!this[cl]&&!this[y0];){let t=this[Er];this[Er]=null,this[C0](t)}this[m0]=!1}(!this[Er]||this[Wc])&&this[iN]()}[C0](e){let t=0,i=e.length;for(;t+512<=i&&!this[cl]&&!this[y0];)switch(this[xs]){case\"begin\":case\"header\":this[bX](e,t),t+=512;break;case\"ignore\":case\"body\":t+=this[tN](e,t);break;case\"meta\":t+=this[QX](e,t);break;default:throw new Error(\"invalid state: \"+this[xs])}t<i&&(this[Er]?this[Er]=Buffer.concat([e.slice(t),this[Er]]):this[Er]=e.slice(t))}end(e){this[cl]||(this[Pn]?this[Pn].end(e):(this[Wc]=!0,this.write(e)))}})});var B0=w((Wot,DX)=>{\"use strict\";var BFe=Xf(),xX=w0(),hh=J(\"fs\"),QFe=fh(),vX=J(\"path\"),nN=nh();DX.exports=(r,e,t)=>{typeof r==\"function\"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e==\"function\"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=BFe(r);if(i.sync&&typeof t==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!i.file&&typeof t==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&SFe(i,e),i.noResume||bFe(i),i.file&&i.sync?vFe(i):i.file?xFe(i,t):PX(i)};var bFe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},SFe=(r,e)=>{let t=new Map(e.map(s=>[nN(s),!0])),i=r.filter,n=(s,o)=>{let a=o||vX.parse(s).root||\".\",l=s===a?!1:t.has(s)?t.get(s):n(vX.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(nN(s)):s=>n(nN(s))},vFe=r=>{let e=PX(r),t=r.file,i=!0,n;try{let s=hh.statSync(t),o=r.maxReadSize||16*1024*1024;if(s.size<o)e.end(hh.readFileSync(t));else{let a=0,l=Buffer.allocUnsafe(o);for(n=hh.openSync(t,\"r\");a<s.size;){let c=hh.readSync(n,l,0,o,a);a+=c,e.write(l.slice(0,c))}e.end()}i=!1}finally{if(i&&n)try{hh.closeSync(n)}catch{}}},xFe=(r,e)=>{let t=new xX(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on(\"error\",a),t.on(\"end\",o),hh.stat(n,(l,c)=>{if(l)a(l);else{let u=new QFe.ReadStream(n,{readSize:i,size:c.size});u.on(\"error\",a),u.pipe(t)}})});return e?s.then(e,e):s},PX=r=>new xX(r)});var TX=w((zot,LX)=>{\"use strict\";var PFe=Xf(),Q0=A0(),kX=fh(),RX=B0(),FX=J(\"path\");LX.exports=(r,e,t)=>{if(typeof e==\"function\"&&(t=e),Array.isArray(r)&&(e=r,r={}),!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");e=Array.from(e);let i=PFe(r);if(i.sync&&typeof t==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!i.file&&typeof t==\"function\")throw new TypeError(\"callback only supported with file option\");return i.file&&i.sync?DFe(i,e):i.file?kFe(i,e,t):i.sync?RFe(i,e):FFe(i,e)};var DFe=(r,e)=>{let t=new Q0.Sync(r),i=new kX.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),NX(t,e)},kFe=(r,e,t)=>{let i=new Q0(r),n=new kX.WriteStream(r.file,{mode:r.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on(\"error\",a),n.on(\"close\",o),i.on(\"error\",a)});return sN(i,e),t?s.then(t,t):s},NX=(r,e)=>{e.forEach(t=>{t.charAt(0)===\"@\"?RX({file:FX.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},sN=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)===\"@\")return RX({file:FX.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>sN(r,e));r.add(t)}r.end()},RFe=(r,e)=>{let t=new Q0.Sync(r);return NX(t,e),t},FFe=(r,e)=>{let t=new Q0(r);return sN(t,e),t}});var oN=w((Vot,YX)=>{\"use strict\";var NFe=Xf(),OX=A0(),Zn=J(\"fs\"),MX=fh(),UX=B0(),KX=J(\"path\"),HX=ih();YX.exports=(r,e,t)=>{let i=NFe(r);if(!i.file)throw new TypeError(\"file is required\");if(i.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),i.sync?LFe(i,e):OFe(i,e,t)};var LFe=(r,e)=>{let t=new OX.Sync(r),i=!0,n,s;try{try{n=Zn.openSync(r.file,\"r+\")}catch(l){if(l.code===\"ENOENT\")n=Zn.openSync(r.file,\"w+\");else throw l}let o=Zn.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;s<o.size;s+=512){for(let u=0,g=0;u<512;u+=g){if(g=Zn.readSync(n,a,u,a.length-u,s+u),s===0&&a[0]===31&&a[1]===139)throw new Error(\"cannot append to compressed archives\");if(!g)break e}let l=new HX(a);if(!l.cksumValid)break;let c=512*Math.ceil(l.size/512);if(s+c+512>o.size)break;s+=c,r.mtimeCache&&r.mtimeCache.set(l.path,l.mtime)}i=!1,TFe(r,t,s,n,e)}finally{if(i)try{Zn.closeSync(n)}catch{}}},TFe=(r,e,t,i,n)=>{let s=new MX.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),MFe(e,n)},OFe=(r,e,t)=>{e=Array.from(e);let i=new OX(r),n=(o,a,l)=>{let c=(p,C)=>{p?Zn.close(o,y=>l(p)):l(null,C)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,C)=>{if(p)return c(p);if(g+=C,g<512&&C)return Zn.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error(\"cannot append to compressed archives\"));if(g<512)return c(null,u);let y=new HX(f);if(!y.cksumValid)return c(null,u);let B=512*Math.ceil(y.size/512);if(u+B+512>a||(u+=B+512,u>=a))return c(null,u);r.mtimeCache&&r.mtimeCache.set(y.path,y.mtime),g=0,Zn.read(o,f,0,512,u,h)};Zn.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on(\"error\",a);let l=\"r+\",c=(u,g)=>{if(u&&u.code===\"ENOENT\"&&l===\"r+\")return l=\"w+\",Zn.open(r.file,l,c);if(u)return a(u);Zn.fstat(g,(f,h)=>{if(f)return Zn.close(g,()=>a(f));n(g,h.size,(p,C)=>{if(p)return a(p);let y=new MX.WriteStream(r.file,{fd:g,start:C});i.pipe(y),y.on(\"error\",a),y.on(\"close\",o),GX(i,e)})})};Zn.open(r.file,l,c)});return t?s.then(t,t):s},MFe=(r,e)=>{e.forEach(t=>{t.charAt(0)===\"@\"?UX({file:KX.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},GX=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)===\"@\")return UX({file:KX.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>GX(r,e));r.add(t)}r.end()}});var qX=w((Xot,jX)=>{\"use strict\";var UFe=Xf(),KFe=oN();jX.exports=(r,e,t)=>{let i=UFe(r);if(!i.file)throw new TypeError(\"file is required\");if(i.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),HFe(i),KFe(i,e,t)};var HFe=r=>{let e=r.filter;r.mtimeCache||(r.mtimeCache=new Map),r.filter=e?(t,i)=>e(t,i)&&!(r.mtimeCache.get(t)>i.mtime):(t,i)=>!(r.mtimeCache.get(t)>i.mtime)}});var zX=w((Zot,WX)=>{var{promisify:JX}=J(\"util\"),ul=J(\"fs\"),GFe=r=>{if(!r)r={mode:511,fs:ul};else if(typeof r==\"object\")r={mode:511,fs:ul,...r};else if(typeof r==\"number\")r={mode:r,fs:ul};else if(typeof r==\"string\")r={mode:parseInt(r,8),fs:ul};else throw new TypeError(\"invalid options argument\");return r.mkdir=r.mkdir||r.fs.mkdir||ul.mkdir,r.mkdirAsync=JX(r.mkdir),r.stat=r.stat||r.fs.stat||ul.stat,r.statAsync=JX(r.stat),r.statSync=r.statSync||r.fs.statSync||ul.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||ul.mkdirSync,r};WX.exports=GFe});var XX=w((_ot,VX)=>{var YFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:jFe,parse:qFe}=J(\"path\"),JFe=r=>{if(/\\0/.test(r))throw Object.assign(new TypeError(\"path must be a string without null bytes\"),{path:r,code:\"ERR_INVALID_ARG_VALUE\"});if(r=jFe(r),YFe===\"win32\"){let e=/[*|\"<>?:]/,{root:t}=qFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error(\"Illegal characters in path.\"),{path:r,code:\"EINVAL\"})}return r};VX.exports=JFe});var t7=w(($ot,e7)=>{var{dirname:ZX}=J(\"path\"),_X=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code===\"ENOENT\"?_X(r,ZX(e),e):void 0),$X=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code===\"ENOENT\"?$X(r,ZX(e),e):void 0}};e7.exports={findMade:_X,findMadeSync:$X}});var lN=w((eat,i7)=>{var{dirname:r7}=J(\"path\"),aN=(r,e,t)=>{e.recursive=!1;let i=r7(r);return i===r?e.mkdirAsync(r,e).catch(n=>{if(n.code!==\"EISDIR\")throw n}):e.mkdirAsync(r,e).then(()=>t||r,n=>{if(n.code===\"ENOENT\")return aN(i,e).then(s=>aN(r,e,s));if(n.code!==\"EEXIST\"&&n.code!==\"EROFS\")throw n;return e.statAsync(r).then(s=>{if(s.isDirectory())return t;throw n},()=>{throw n})})},AN=(r,e,t)=>{let i=r7(r);if(e.recursive=!1,i===r)try{return e.mkdirSync(r,e)}catch(n){if(n.code!==\"EISDIR\")throw n;return}try{return e.mkdirSync(r,e),t||r}catch(n){if(n.code===\"ENOENT\")return AN(r,e,AN(i,e,t));if(n.code!==\"EEXIST\"&&n.code!==\"EROFS\")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch{throw n}}};i7.exports={mkdirpManual:aN,mkdirpManualSync:AN}});var o7=w((tat,s7)=>{var{dirname:n7}=J(\"path\"),{findMade:WFe,findMadeSync:zFe}=t7(),{mkdirpManual:VFe,mkdirpManualSync:XFe}=lN(),ZFe=(r,e)=>(e.recursive=!0,n7(r)===r?e.mkdirAsync(r,e):WFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code===\"ENOENT\")return VFe(r,e);throw n}))),_Fe=(r,e)=>{if(e.recursive=!0,n7(r)===r)return e.mkdirSync(r,e);let i=zFe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code===\"ENOENT\")return XFe(r,e);throw n}};s7.exports={mkdirpNative:ZFe,mkdirpNativeSync:_Fe}});var c7=w((rat,l7)=>{var a7=J(\"fs\"),$Fe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,cN=$Fe.replace(/^v/,\"\").split(\".\"),A7=+cN[0]>10||+cN[0]==10&&+cN[1]>=12,eNe=A7?r=>r.mkdir===a7.mkdir:()=>!1,tNe=A7?r=>r.mkdirSync===a7.mkdirSync:()=>!1;l7.exports={useNative:eNe,useNativeSync:tNe}});var d7=w((iat,p7)=>{var ph=zX(),dh=XX(),{mkdirpNative:u7,mkdirpNativeSync:g7}=o7(),{mkdirpManual:f7,mkdirpManualSync:h7}=lN(),{useNative:rNe,useNativeSync:iNe}=c7(),Ch=(r,e)=>(r=dh(r),e=ph(e),rNe(e)?u7(r,e):f7(r,e)),nNe=(r,e)=>(r=dh(r),e=ph(e),iNe(e)?g7(r,e):h7(r,e));Ch.sync=nNe;Ch.native=(r,e)=>u7(dh(r),ph(e));Ch.manual=(r,e)=>f7(dh(r),ph(e));Ch.nativeSync=(r,e)=>g7(dh(r),ph(e));Ch.manualSync=(r,e)=>h7(dh(r),ph(e));p7.exports=Ch});var B7=w((nat,w7)=>{\"use strict\";var Ds=J(\"fs\"),Xc=J(\"path\"),sNe=Ds.lchown?\"lchown\":\"chown\",oNe=Ds.lchownSync?\"lchownSync\":\"chownSync\",m7=Ds.lchown&&!process.version.match(/v1[1-9]+\\./)&&!process.version.match(/v10\\.[6-9]/),C7=(r,e,t)=>{try{return Ds[oNe](r,e,t)}catch(i){if(i.code!==\"ENOENT\")throw i}},aNe=(r,e,t)=>{try{return Ds.chownSync(r,e,t)}catch(i){if(i.code!==\"ENOENT\")throw i}},ANe=m7?(r,e,t,i)=>n=>{!n||n.code!==\"EISDIR\"?i(n):Ds.chown(r,e,t,i)}:(r,e,t,i)=>i,uN=m7?(r,e,t)=>{try{return C7(r,e,t)}catch(i){if(i.code!==\"EISDIR\")throw i;aNe(r,e,t)}}:(r,e,t)=>C7(r,e,t),lNe=process.version,E7=(r,e,t)=>Ds.readdir(r,e,t),cNe=(r,e)=>Ds.readdirSync(r,e);/^v4\\./.test(lNe)&&(E7=(r,e,t)=>Ds.readdir(r,t));var b0=(r,e,t,i)=>{Ds[sNe](r,e,t,ANe(r,e,t,n=>{i(n&&n.code!==\"ENOENT\"?n:null)}))},I7=(r,e,t,i,n)=>{if(typeof e==\"string\")return Ds.lstat(Xc.resolve(r,e),(s,o)=>{if(s)return n(s.code!==\"ENOENT\"?s:null);o.name=e,I7(r,o,t,i,n)});if(e.isDirectory())gN(Xc.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=Xc.resolve(r,e.name);b0(o,t,i,n)});else{let s=Xc.resolve(r,e.name);b0(s,t,i,n)}},gN=(r,e,t,i)=>{E7(r,{withFileTypes:!0},(n,s)=>{if(n){if(n.code===\"ENOENT\")return i();if(n.code!==\"ENOTDIR\"&&n.code!==\"ENOTSUP\")return i(n)}if(n||!s.length)return b0(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o===0)return b0(r,e,t,i)}};s.forEach(c=>I7(r,c,e,t,l))})},uNe=(r,e,t,i)=>{if(typeof e==\"string\")try{let n=Ds.lstatSync(Xc.resolve(r,e));n.name=e,e=n}catch(n){if(n.code===\"ENOENT\")return;throw n}e.isDirectory()&&y7(Xc.resolve(r,e.name),t,i),uN(Xc.resolve(r,e.name),t,i)},y7=(r,e,t)=>{let i;try{i=cNe(r,{withFileTypes:!0})}catch(n){if(n.code===\"ENOENT\")return;if(n.code===\"ENOTDIR\"||n.code===\"ENOTSUP\")return uN(r,e,t);throw n}return i&&i.length&&i.forEach(n=>uNe(r,n,e,t)),uN(r,e,t)};w7.exports=gN;gN.sync=y7});var v7=w((sat,fN)=>{\"use strict\";var Q7=d7(),ks=J(\"fs\"),S0=J(\"path\"),b7=B7(),lo=th(),v0=class extends Error{constructor(e,t){super(\"Cannot extract through symbolic link\"),this.path=t,this.symlink=e}get name(){return\"SylinkError\"}},x0=class extends Error{constructor(e,t){super(t+\": Cannot cd into '\"+e+\"'\"),this.path=e,this.code=t}get name(){return\"CwdError\"}},P0=(r,e)=>r.get(lo(e)),jC=(r,e,t)=>r.set(lo(e),t),gNe=(r,e)=>{ks.stat(r,(t,i)=>{(t||!i.isDirectory())&&(t=new x0(r,t&&t.code||\"ENOTDIR\")),e(t)})};fN.exports=(r,e,t)=>{r=lo(r);let i=e.umask,n=e.mode|448,s=(n&i)!==0,o=e.uid,a=e.gid,l=typeof o==\"number\"&&typeof a==\"number\"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=lo(e.cwd),h=(y,B)=>{y?t(y):(jC(g,r,!0),B&&l?b7(B,o,a,v=>h(v)):s?ks.chmod(r,n,t):t())};if(g&&P0(g,r)===!0)return h();if(r===f)return gNe(r,h);if(c)return Q7(r,{mode:n}).then(y=>h(null,y),h);let C=lo(S0.relative(f,r)).split(\"/\");D0(f,C,n,g,u,f,null,h)};var D0=(r,e,t,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=lo(S0.resolve(r+\"/\"+l));if(P0(i,c))return D0(c,e,t,i,n,s,o,a);ks.mkdir(c,t,S7(c,e,t,i,n,s,o,a))},S7=(r,e,t,i,n,s,o,a)=>l=>{l?ks.lstat(r,(c,u)=>{if(c)c.path=c.path&&lo(c.path),a(c);else if(u.isDirectory())D0(r,e,t,i,n,s,o,a);else if(n)ks.unlink(r,g=>{if(g)return a(g);ks.mkdir(r,t,S7(r,e,t,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new v0(r,r+\"/\"+e.join(\"/\")));a(l)}}):(o=o||r,D0(r,e,t,i,n,s,o,a))},fNe=r=>{let e=!1,t=\"ENOTDIR\";try{e=ks.statSync(r).isDirectory()}catch(i){t=i.code}finally{if(!e)throw new x0(r,t)}};fN.exports.sync=(r,e)=>{r=lo(r);let t=e.umask,i=e.mode|448,n=(i&t)!==0,s=e.uid,o=e.gid,a=typeof s==\"number\"&&typeof o==\"number\"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=lo(e.cwd),f=y=>{jC(u,r,!0),y&&a&&b7.sync(y,s,o),n&&ks.chmodSync(r,i)};if(u&&P0(u,r)===!0)return f();if(r===g)return fNe(g),f();if(l)return f(Q7.sync(r,i));let p=lo(S0.relative(g,r)).split(\"/\"),C=null;for(let y=p.shift(),B=g;y&&(B+=\"/\"+y);y=p.shift())if(B=lo(S0.resolve(B)),!P0(u,B))try{ks.mkdirSync(B,i),C=C||B,jC(u,B,!0)}catch{let D=ks.lstatSync(B);if(D.isDirectory()){jC(u,B,!0);continue}else if(c){ks.unlinkSync(B),ks.mkdirSync(B,i),C=C||B,jC(u,B,!0);continue}else if(D.isSymbolicLink())return new v0(B,B+\"/\"+p.join(\"/\"))}return f(C)}});var pN=w((oat,x7)=>{var hN=Object.create(null),{hasOwnProperty:hNe}=Object.prototype;x7.exports=r=>(hNe.call(hN,r)||(hN[r]=r.normalize(\"NFKD\")),hN[r])});var R7=w((aat,k7)=>{var P7=J(\"assert\"),pNe=pN(),dNe=nh(),{join:D7}=J(\"path\"),CNe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,mNe=CNe===\"win32\";k7.exports=()=>{let r=new Map,e=new Map,t=c=>c.split(\"/\").slice(0,-1).reduce((g,f)=>(g.length&&(f=D7(g[g.length-1],f)),g.push(f||\"/\"),g),[]),i=new Set,n=c=>{let u=e.get(c);if(!u)throw new Error(\"function does not have any path reservations\");return{paths:u.paths.map(g=>r.get(g)),dirs:[...u.dirs].map(g=>r.get(g))}},s=c=>{let{paths:u,dirs:g}=n(c);return u.every(f=>f[0]===c)&&g.every(f=>f[0]instanceof Set&&f[0].has(c))},o=c=>i.has(c)||!s(c)?!1:(i.add(c),c(()=>a(c)),!0),a=c=>{if(!i.has(c))return!1;let{paths:u,dirs:g}=e.get(c),f=new Set;return u.forEach(h=>{let p=r.get(h);P7.equal(p[0],c),p.length===1?r.delete(h):(p.shift(),typeof p[0]==\"function\"?f.add(p[0]):p[0].forEach(C=>f.add(C)))}),g.forEach(h=>{let p=r.get(h);P7(p[0]instanceof Set),p[0].size===1&&p.length===1?r.delete(h):p[0].size===1?(p.shift(),f.add(p[0])):p[0].delete(c)}),i.delete(c),f.forEach(h=>o(h)),!0};return{check:s,reserve:(c,u)=>{c=mNe?[\"win32 parallelization disabled\"]:c.map(f=>pNe(dNe(D7(f))).toLowerCase());let g=new Set(c.map(f=>t(f)).reduce((f,h)=>f.concat(h)));return e.set(u,{dirs:g,paths:c}),c.forEach(f=>{let h=r.get(f);h?h.push(u):r.set(f,[u])}),g.forEach(f=>{let h=r.get(f);h?h[h.length-1]instanceof Set?h[h.length-1].add(u):h.push(new Set([u])):r.set(f,[new Set([u])])}),o(u)}}}});var L7=w((Aat,N7)=>{var ENe=process.env.__FAKE_PLATFORM__||process.platform,INe=ENe===\"win32\",yNe=global.__FAKE_TESTING_FS__||J(\"fs\"),{O_CREAT:wNe,O_TRUNC:BNe,O_WRONLY:QNe,UV_FS_O_FILEMAP:F7=0}=yNe.constants,bNe=INe&&!!F7,SNe=512*1024,vNe=F7|BNe|wNe|QNe;N7.exports=bNe?r=>r<SNe?vNe:\"w\":()=>\"w\"});var QN=w((lat,V7)=>{\"use strict\";var xNe=J(\"assert\"),PNe=w0(),jt=J(\"fs\"),DNe=fh(),tA=J(\"path\"),J7=v7(),T7=QF(),kNe=R7(),RNe=bF(),_n=th(),FNe=nh(),NNe=pN(),O7=Symbol(\"onEntry\"),mN=Symbol(\"checkFs\"),M7=Symbol(\"checkFs2\"),F0=Symbol(\"pruneCache\"),EN=Symbol(\"isReusable\"),Rs=Symbol(\"makeFs\"),IN=Symbol(\"file\"),yN=Symbol(\"directory\"),N0=Symbol(\"link\"),U7=Symbol(\"symlink\"),K7=Symbol(\"hardlink\"),H7=Symbol(\"unsupported\"),G7=Symbol(\"checkPath\"),gl=Symbol(\"mkdir\"),Yi=Symbol(\"onError\"),k0=Symbol(\"pending\"),Y7=Symbol(\"pend\"),mh=Symbol(\"unpend\"),dN=Symbol(\"ended\"),CN=Symbol(\"maybeClose\"),wN=Symbol(\"skip\"),qC=Symbol(\"doChown\"),JC=Symbol(\"uid\"),WC=Symbol(\"gid\"),zC=Symbol(\"checkedCwd\"),W7=J(\"crypto\"),z7=L7(),LNe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,VC=LNe===\"win32\",TNe=(r,e)=>{if(!VC)return jt.unlink(r,e);let t=r+\".DELETE.\"+W7.randomBytes(16).toString(\"hex\");jt.rename(r,t,i=>{if(i)return e(i);jt.unlink(t,e)})},ONe=r=>{if(!VC)return jt.unlinkSync(r);let e=r+\".DELETE.\"+W7.randomBytes(16).toString(\"hex\");jt.renameSync(r,e),jt.unlinkSync(e)},j7=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,q7=r=>NNe(FNe(_n(r))).toLowerCase(),MNe=(r,e)=>{e=q7(e);for(let t of r.keys()){let i=q7(t);(i===e||i.indexOf(e+\"/\")===0)&&r.delete(t)}},UNe=r=>{for(let e of r.keys())r.delete(e)},XC=class extends PNe{constructor(e){if(e||(e={}),e.ondone=t=>{this[dN]=!0,this[CN]()},super(e),this[zC]=!1,this.reservations=kNe(),this.transform=typeof e.transform==\"function\"?e.transform:null,this.writable=!0,this.readable=!1,this[k0]=0,this[dN]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid==\"number\"||typeof e.gid==\"number\"){if(typeof e.uid!=\"number\"||typeof e.gid!=\"number\")throw new TypeError(\"cannot set owner without number uid and gid\");if(e.preserveOwner)throw new TypeError(\"cannot preserve owner in archive and also set owner explicitly\");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!=\"number\"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||VC,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=_n(tA.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask==\"number\"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on(\"entry\",t=>this[O7](t))}warn(e,t,i={}){return(e===\"TAR_BAD_ARCHIVE\"||e===\"TAR_ABORT\")&&(i.recoverable=!1),super.warn(e,t,i)}[CN](){this[dN]&&this[k0]===0&&(this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\"))}[G7](e){if(this.strip){let t=_n(e.path).split(\"/\");if(t.length<this.strip)return!1;if(e.path=t.slice(this.strip).join(\"/\"),e.type===\"Link\"){let i=_n(e.linkpath).split(\"/\");if(i.length>=this.strip)e.linkpath=i.slice(this.strip).join(\"/\");else return!1}}if(!this.preservePaths){let t=_n(e.path),i=t.split(\"/\");if(i.includes(\"..\")||VC&&/^[a-z]:\\.\\.$/i.test(i[0]))return this.warn(\"TAR_ENTRY_ERROR\",\"path contains '..'\",{entry:e,path:t}),!1;let[n,s]=RNe(t);n&&(e.path=s,this.warn(\"TAR_ENTRY_INFO\",`stripping ${n} from absolute path`,{entry:e,path:t}))}if(tA.isAbsolute(e.path)?e.absolute=_n(tA.resolve(e.path)):e.absolute=_n(tA.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+\"/\")!==0&&e.absolute!==this.cwd)return this.warn(\"TAR_ENTRY_ERROR\",\"path escaped extraction target\",{entry:e,path:_n(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!==\"Directory\"&&e.type!==\"GNUDumpDir\")return!1;if(this.win32){let{root:t}=tA.win32.parse(e.absolute);e.absolute=t+T7.encode(e.absolute.substr(t.length));let{root:i}=tA.win32.parse(e.path);e.path=i+T7.encode(e.path.substr(i.length))}return!0}[O7](e){if(!this[G7](e))return e.resume();switch(xNe.equal(typeof e.absolute,\"string\"),e.type){case\"Directory\":case\"GNUDumpDir\":e.mode&&(e.mode=e.mode|448);case\"File\":case\"OldFile\":case\"ContiguousFile\":case\"Link\":case\"SymbolicLink\":return this[mN](e);case\"CharacterDevice\":case\"BlockDevice\":case\"FIFO\":default:return this[H7](e)}}[Yi](e,t){e.name===\"CwdError\"?this.emit(\"error\",e):(this.warn(\"TAR_ENTRY_ERROR\",e,{entry:t}),this[mh](),t.resume())}[gl](e,t,i){J7(_n(e),{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:t,noChmod:this.noChmod},i)}[qC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid==\"number\"&&e.uid!==this.processUid||typeof e.gid==\"number\"&&e.gid!==this.processGid)||typeof this.uid==\"number\"&&this.uid!==this.processUid||typeof this.gid==\"number\"&&this.gid!==this.processGid}[JC](e){return j7(this.uid,e.uid,this.processUid)}[WC](e){return j7(this.gid,e.gid,this.processGid)}[IN](e,t){let i=e.mode&4095||this.fmode,n=new DNe.WriteStream(e.absolute,{flags:z7(e.size),mode:i,autoClose:!1});n.on(\"error\",l=>{n.fd&&jt.close(n.fd,()=>{}),n.write=()=>!0,this[Yi](l,e),t()});let s=1,o=l=>{if(l){n.fd&&jt.close(n.fd,()=>{}),this[Yi](l,e),t();return}--s===0&&jt.close(n.fd,c=>{c?this[Yi](c,e):this[mh](),t()})};n.on(\"finish\",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;jt.futimes(u,g,f,h=>h?jt.utimes(c,g,f,p=>o(p&&h)):o())}if(this[qC](e)){s++;let g=this[JC](e),f=this[WC](e);jt.fchown(u,g,f,h=>h?jt.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on(\"error\",l=>{this[Yi](l,e),t()}),e.pipe(a)),a.pipe(n)}[yN](e,t){let i=e.mode&4095||this.dmode;this[gl](e.absolute,i,n=>{if(n){this[Yi](n,e),t();return}let s=1,o=a=>{--s===0&&(t(),this[mh](),e.resume())};e.mtime&&!this.noMtime&&(s++,jt.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[qC](e)&&(s++,jt.chown(e.absolute,this[JC](e),this[WC](e),o)),o()})}[H7](e){e.unsupported=!0,this.warn(\"TAR_ENTRY_UNSUPPORTED\",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[U7](e,t){this[N0](e,e.linkpath,\"symlink\",t)}[K7](e,t){let i=_n(tA.resolve(this.cwd,e.linkpath));this[N0](e,i,\"link\",t)}[Y7](){this[k0]++}[mh](){this[k0]--,this[CN]()}[wN](e){this[mh](),e.resume()}[EN](e,t){return e.type===\"File\"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!VC}[mN](e){this[Y7]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[M7](e,i))}[F0](e){e.type===\"SymbolicLink\"?UNe(this.dirCache):e.type!==\"Directory\"&&MNe(this.dirCache,e.absolute)}[M7](e,t){this[F0](e);let i=a=>{this[F0](e),t(a)},n=()=>{this[gl](this.cwd,this.dmode,a=>{if(a){this[Yi](a,e),i();return}this[zC]=!0,s()})},s=()=>{if(e.absolute!==this.cwd){let a=_n(tA.dirname(e.absolute));if(a!==this.cwd)return this[gl](a,this.dmode,l=>{if(l){this[Yi](l,e),i();return}o()})}o()},o=()=>{jt.lstat(e.absolute,(a,l)=>{if(l&&(this.keep||this.newer&&l.mtime>e.mtime)){this[wN](e),i();return}if(a||this[EN](e,l))return this[Rs](null,e,i);if(l.isDirectory()){if(e.type===\"Directory\"){let c=!this.noChmod&&e.mode&&(l.mode&4095)!==e.mode,u=g=>this[Rs](g,e,i);return c?jt.chmod(e.absolute,e.mode,u):u()}if(e.absolute!==this.cwd)return jt.rmdir(e.absolute,c=>this[Rs](c,e,i))}if(e.absolute===this.cwd)return this[Rs](null,e,i);TNe(e.absolute,c=>this[Rs](c,e,i))})};this[zC]?s():n()}[Rs](e,t,i){if(e){this[Yi](e,t),i();return}switch(t.type){case\"File\":case\"OldFile\":case\"ContiguousFile\":return this[IN](t,i);case\"Link\":return this[K7](t,i);case\"SymbolicLink\":return this[U7](t,i);case\"Directory\":case\"GNUDumpDir\":return this[yN](t,i)}}[N0](e,t,i,n){jt[i](t,e.absolute,s=>{s?this[Yi](s,e):(this[mh](),e.resume()),n()})}},R0=r=>{try{return[null,r()]}catch(e){return[e,null]}},BN=class extends XC{[Rs](e,t){return super[Rs](e,t,()=>{})}[mN](e){if(this[F0](e),!this[zC]){let s=this[gl](this.cwd,this.dmode);if(s)return this[Yi](s,e);this[zC]=!0}if(e.absolute!==this.cwd){let s=_n(tA.dirname(e.absolute));if(s!==this.cwd){let o=this[gl](s,this.dmode);if(o)return this[Yi](o,e)}}let[t,i]=R0(()=>jt.lstatSync(e.absolute));if(i&&(this.keep||this.newer&&i.mtime>e.mtime))return this[wN](e);if(t||this[EN](e,i))return this[Rs](null,e);if(i.isDirectory()){if(e.type===\"Directory\"){let o=!this.noChmod&&e.mode&&(i.mode&4095)!==e.mode,[a]=o?R0(()=>{jt.chmodSync(e.absolute,e.mode)}):[];return this[Rs](a,e)}let[s]=R0(()=>jt.rmdirSync(e.absolute));this[Rs](s,e)}let[n]=e.absolute===this.cwd?[]:R0(()=>ONe(e.absolute));this[Rs](n,e)}[IN](e,t){let i=e.mode&4095||this.fmode,n=a=>{let l;try{jt.closeSync(s)}catch(c){l=c}(a||l)&&this[Yi](a||l,e),t()},s;try{s=jt.openSync(e.absolute,z7(e.size),i)}catch(a){return n(a)}let o=this.transform&&this.transform(e)||e;o!==e&&(o.on(\"error\",a=>this[Yi](a,e)),e.pipe(o)),o.on(\"data\",a=>{try{jt.writeSync(s,a,0,a.length)}catch(l){n(l)}}),o.on(\"end\",a=>{let l=null;if(e.mtime&&!this.noMtime){let c=e.atime||new Date,u=e.mtime;try{jt.futimesSync(s,c,u)}catch(g){try{jt.utimesSync(e.absolute,c,u)}catch{l=g}}}if(this[qC](e)){let c=this[JC](e),u=this[WC](e);try{jt.fchownSync(s,c,u)}catch(g){try{jt.chownSync(e.absolute,c,u)}catch{l=l||g}}}n(l)})}[yN](e,t){let i=e.mode&4095||this.dmode,n=this[gl](e.absolute,i);if(n){this[Yi](n,e),t();return}if(e.mtime&&!this.noMtime)try{jt.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[qC](e))try{jt.chownSync(e.absolute,this[JC](e),this[WC](e))}catch{}t(),e.resume()}[gl](e,t){try{return J7.sync(_n(e),{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:t})}catch(i){return i}}[N0](e,t,i,n){try{jt[i+\"Sync\"](t,e.absolute),n(),e.resume()}catch(s){return this[Yi](s,e)}}};XC.Sync=BN;V7.exports=XC});var eZ=w((cat,$7)=>{\"use strict\";var KNe=Xf(),L0=QN(),Z7=J(\"fs\"),_7=fh(),X7=J(\"path\"),bN=nh();$7.exports=(r,e,t)=>{typeof r==\"function\"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e==\"function\"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=KNe(r);if(i.sync&&typeof t==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!i.file&&typeof t==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&HNe(i,e),i.file&&i.sync?GNe(i):i.file?YNe(i,t):i.sync?jNe(i):qNe(i)};var HNe=(r,e)=>{let t=new Map(e.map(s=>[bN(s),!0])),i=r.filter,n=(s,o)=>{let a=o||X7.parse(s).root||\".\",l=s===a?!1:t.has(s)?t.get(s):n(X7.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(bN(s)):s=>n(bN(s))},GNe=r=>{let e=new L0.Sync(r),t=r.file,i=Z7.statSync(t),n=r.maxReadSize||16*1024*1024;new _7.ReadStreamSync(t,{readSize:n,size:i.size}).pipe(e)},YNe=(r,e)=>{let t=new L0(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on(\"error\",a),t.on(\"close\",o),Z7.stat(n,(l,c)=>{if(l)a(l);else{let u=new _7.ReadStream(n,{readSize:i,size:c.size});u.on(\"error\",a),u.pipe(t)}})});return e?s.then(e,e):s},jNe=r=>new L0.Sync(r),qNe=r=>new L0(r)});var tZ=w(ci=>{\"use strict\";ci.c=ci.create=TX();ci.r=ci.replace=oN();ci.t=ci.list=B0();ci.u=ci.update=qX();ci.x=ci.extract=eZ();ci.Pack=A0();ci.Unpack=QN();ci.Parse=w0();ci.ReadEntry=qB();ci.WriteEntry=LF();ci.Header=ih();ci.Pax=WB();ci.types=CF()});var sZ=w((fat,nZ)=>{var SN;nZ.exports.getContent=()=>(typeof SN>\"u\"&&(SN=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),SN)});var uZ=w((vN,cZ)=>{(function(r,e){typeof vN==\"object\"?cZ.exports=e():typeof define==\"function\"&&define.amd?define(e):r.treeify=e()})(vN,function(){function r(n,s){var o=s?\"\\u2514\":\"\\u251C\";return n?o+=\"\\u2500 \":o+=\"\\u2500\\u2500\\u2510\",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]==\"function\"||o.push(a);return o}function t(n,s,o,a,l,c,u){var g=\"\",f=0,h,p,C=a.slice(0);if(C.push([s,o])&&a.length>0&&(a.forEach(function(B,v){v>0&&(g+=(B[1]?\" \":\"\\u2502\")+\"  \"),!p&&B[0]===s&&(p=!0)}),g+=r(n,o)+n,l&&(typeof s!=\"object\"||s instanceof Date)&&(g+=\": \"+s),p&&(g+=\" (circular ref.)\"),u(g)),!p&&typeof s==\"object\"){var y=e(s,c);y.forEach(function(B){h=++f===y.length,t(B,s[B],h,C,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!=\"function\"?o:!1;t(\".\",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a=\"\";return t(\".\",n,!1,[],s,o,function(l){a+=l+`\n`}),a},i})});var U0=w((Tat,yZ)=>{var lLe=vs(),cLe=gC(),uLe=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,gLe=/^\\w*$/;function fLe(r,e){if(lLe(r))return!1;var t=typeof r;return t==\"number\"||t==\"symbol\"||t==\"boolean\"||r==null||cLe(r)?!0:gLe.test(r)||!uLe.test(r)||e!=null&&r in Object(e)}yZ.exports=fLe});var K0=w((Oat,wZ)=>{var hLe=Fc(),pLe=Sn(),dLe=\"[object AsyncFunction]\",CLe=\"[object Function]\",mLe=\"[object GeneratorFunction]\",ELe=\"[object Proxy]\";function ILe(r){if(!pLe(r))return!1;var e=hLe(r);return e==CLe||e==mLe||e==dLe||e==ELe}wZ.exports=ILe});var QZ=w((Mat,BZ)=>{var yLe=ys(),wLe=yLe[\"__core-js_shared__\"];BZ.exports=wLe});var vZ=w((Uat,SZ)=>{var LN=QZ(),bZ=function(){var r=/[^.]+$/.exec(LN&&LN.keys&&LN.keys.IE_PROTO||\"\");return r?\"Symbol(src)_1.\"+r:\"\"}();function BLe(r){return!!bZ&&bZ in r}SZ.exports=BLe});var TN=w((Kat,xZ)=>{var QLe=Function.prototype,bLe=QLe.toString;function SLe(r){if(r!=null){try{return bLe.call(r)}catch{}try{return r+\"\"}catch{}}return\"\"}xZ.exports=SLe});var DZ=w((Hat,PZ)=>{var vLe=K0(),xLe=vZ(),PLe=Sn(),DLe=TN(),kLe=/[\\\\^$.*+?()[\\]{}|]/g,RLe=/^\\[object .+?Constructor\\]$/,FLe=Function.prototype,NLe=Object.prototype,LLe=FLe.toString,TLe=NLe.hasOwnProperty,OLe=RegExp(\"^\"+LLe.call(TLe).replace(kLe,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");function MLe(r){if(!PLe(r)||xLe(r))return!1;var e=vLe(r)?OLe:RLe;return e.test(DLe(r))}PZ.exports=MLe});var RZ=w((Gat,kZ)=>{function ULe(r,e){return r==null?void 0:r[e]}kZ.exports=ULe});var hl=w((Yat,FZ)=>{var KLe=DZ(),HLe=RZ();function GLe(r,e){var t=HLe(r,e);return KLe(t)?t:void 0}FZ.exports=GLe});var _C=w((jat,NZ)=>{var YLe=hl(),jLe=YLe(Object,\"create\");NZ.exports=jLe});var OZ=w((qat,TZ)=>{var LZ=_C();function qLe(){this.__data__=LZ?LZ(null):{},this.size=0}TZ.exports=qLe});var UZ=w((Jat,MZ)=>{function JLe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}MZ.exports=JLe});var HZ=w((Wat,KZ)=>{var WLe=_C(),zLe=\"__lodash_hash_undefined__\",VLe=Object.prototype,XLe=VLe.hasOwnProperty;function ZLe(r){var e=this.__data__;if(WLe){var t=e[r];return t===zLe?void 0:t}return XLe.call(e,r)?e[r]:void 0}KZ.exports=ZLe});var YZ=w((zat,GZ)=>{var _Le=_C(),$Le=Object.prototype,eTe=$Le.hasOwnProperty;function tTe(r){var e=this.__data__;return _Le?e[r]!==void 0:eTe.call(e,r)}GZ.exports=tTe});var qZ=w((Vat,jZ)=>{var rTe=_C(),iTe=\"__lodash_hash_undefined__\";function nTe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=rTe&&e===void 0?iTe:e,this}jZ.exports=nTe});var WZ=w((Xat,JZ)=>{var sTe=OZ(),oTe=UZ(),aTe=HZ(),ATe=YZ(),lTe=qZ();function Eh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){var i=r[e];this.set(i[0],i[1])}}Eh.prototype.clear=sTe;Eh.prototype.delete=oTe;Eh.prototype.get=aTe;Eh.prototype.has=ATe;Eh.prototype.set=lTe;JZ.exports=Eh});var VZ=w((Zat,zZ)=>{function cTe(){this.__data__=[],this.size=0}zZ.exports=cTe});var Ih=w((_at,XZ)=>{function uTe(r,e){return r===e||r!==r&&e!==e}XZ.exports=uTe});var $C=w(($at,ZZ)=>{var gTe=Ih();function fTe(r,e){for(var t=r.length;t--;)if(gTe(r[t][0],e))return t;return-1}ZZ.exports=fTe});var $Z=w((eAt,_Z)=>{var hTe=$C(),pTe=Array.prototype,dTe=pTe.splice;function CTe(r){var e=this.__data__,t=hTe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():dTe.call(e,t,1),--this.size,!0}_Z.exports=CTe});var t_=w((tAt,e_)=>{var mTe=$C();function ETe(r){var e=this.__data__,t=mTe(e,r);return t<0?void 0:e[t][1]}e_.exports=ETe});var i_=w((rAt,r_)=>{var ITe=$C();function yTe(r){return ITe(this.__data__,r)>-1}r_.exports=yTe});var s_=w((iAt,n_)=>{var wTe=$C();function BTe(r,e){var t=this.__data__,i=wTe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}n_.exports=BTe});var em=w((nAt,o_)=>{var QTe=VZ(),bTe=$Z(),STe=t_(),vTe=i_(),xTe=s_();function yh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){var i=r[e];this.set(i[0],i[1])}}yh.prototype.clear=QTe;yh.prototype.delete=bTe;yh.prototype.get=STe;yh.prototype.has=vTe;yh.prototype.set=xTe;o_.exports=yh});var H0=w((sAt,a_)=>{var PTe=hl(),DTe=ys(),kTe=PTe(DTe,\"Map\");a_.exports=kTe});var c_=w((oAt,l_)=>{var A_=WZ(),RTe=em(),FTe=H0();function NTe(){this.size=0,this.__data__={hash:new A_,map:new(FTe||RTe),string:new A_}}l_.exports=NTe});var g_=w((aAt,u_)=>{function LTe(r){var e=typeof r;return e==\"string\"||e==\"number\"||e==\"symbol\"||e==\"boolean\"?r!==\"__proto__\":r===null}u_.exports=LTe});var tm=w((AAt,f_)=>{var TTe=g_();function OTe(r,e){var t=r.__data__;return TTe(e)?t[typeof e==\"string\"?\"string\":\"hash\"]:t.map}f_.exports=OTe});var p_=w((lAt,h_)=>{var MTe=tm();function UTe(r){var e=MTe(this,r).delete(r);return this.size-=e?1:0,e}h_.exports=UTe});var C_=w((cAt,d_)=>{var KTe=tm();function HTe(r){return KTe(this,r).get(r)}d_.exports=HTe});var E_=w((uAt,m_)=>{var GTe=tm();function YTe(r){return GTe(this,r).has(r)}m_.exports=YTe});var y_=w((gAt,I_)=>{var jTe=tm();function qTe(r,e){var t=jTe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}I_.exports=qTe});var G0=w((fAt,w_)=>{var JTe=c_(),WTe=p_(),zTe=C_(),VTe=E_(),XTe=y_();function wh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){var i=r[e];this.set(i[0],i[1])}}wh.prototype.clear=JTe;wh.prototype.delete=WTe;wh.prototype.get=zTe;wh.prototype.has=VTe;wh.prototype.set=XTe;w_.exports=wh});var b_=w((hAt,Q_)=>{var B_=G0(),ZTe=\"Expected a function\";function ON(r,e){if(typeof r!=\"function\"||e!=null&&typeof e!=\"function\")throw new TypeError(ZTe);var t=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=t.cache;if(s.has(n))return s.get(n);var o=r.apply(this,i);return t.cache=s.set(n,o)||s,o};return t.cache=new(ON.Cache||B_),t}ON.Cache=B_;Q_.exports=ON});var v_=w((pAt,S_)=>{var _Te=b_(),$Te=500;function eOe(r){var e=_Te(r,function(i){return t.size===$Te&&t.clear(),i}),t=e.cache;return e}S_.exports=eOe});var P_=w((dAt,x_)=>{var tOe=v_(),rOe=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,iOe=/\\\\(\\\\)?/g,nOe=tOe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(\"\"),r.replace(rOe,function(t,i,n,s){e.push(n?s.replace(iOe,\"$1\"):i||t)}),e});x_.exports=nOe});var Bh=w((CAt,D_)=>{var sOe=vs(),oOe=U0(),aOe=P_(),AOe=Vf();function lOe(r,e){return sOe(r)?r:oOe(r,e)?[r]:aOe(AOe(r))}D_.exports=lOe});var Zc=w((mAt,k_)=>{var cOe=gC(),uOe=1/0;function gOe(r){if(typeof r==\"string\"||cOe(r))return r;var e=r+\"\";return e==\"0\"&&1/r==-uOe?\"-0\":e}k_.exports=gOe});var rm=w((EAt,R_)=>{var fOe=Bh(),hOe=Zc();function pOe(r,e){e=fOe(e,r);for(var t=0,i=e.length;r!=null&&t<i;)r=r[hOe(e[t++])];return t&&t==i?r:void 0}R_.exports=pOe});var MN=w((IAt,F_)=>{var dOe=hl(),COe=function(){try{var r=dOe(Object,\"defineProperty\");return r({},\"\",{}),r}catch{}}();F_.exports=COe});var Qh=w((yAt,L_)=>{var N_=MN();function mOe(r,e,t){e==\"__proto__\"&&N_?N_(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}L_.exports=mOe});var Y0=w((wAt,T_)=>{var EOe=Qh(),IOe=Ih(),yOe=Object.prototype,wOe=yOe.hasOwnProperty;function BOe(r,e,t){var i=r[e];(!(wOe.call(r,e)&&IOe(i,t))||t===void 0&&!(e in r))&&EOe(r,e,t)}T_.exports=BOe});var im=w((BAt,O_)=>{var QOe=9007199254740991,bOe=/^(?:0|[1-9]\\d*)$/;function SOe(r,e){var t=typeof r;return e=e==null?QOe:e,!!e&&(t==\"number\"||t!=\"symbol\"&&bOe.test(r))&&r>-1&&r%1==0&&r<e}O_.exports=SOe});var UN=w((QAt,U_)=>{var vOe=Y0(),xOe=Bh(),POe=im(),M_=Sn(),DOe=Zc();function kOe(r,e,t,i){if(!M_(r))return r;e=xOe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n<s;){var l=DOe(e[n]),c=t;if(l===\"__proto__\"||l===\"constructor\"||l===\"prototype\")return r;if(n!=o){var u=a[l];c=i?i(u,l,a):void 0,c===void 0&&(c=M_(u)?u:POe(e[n+1])?[]:{})}vOe(a,l,c),a=a[l]}return r}U_.exports=kOe});var H_=w((bAt,K_)=>{var ROe=rm(),FOe=UN(),NOe=Bh();function LOe(r,e,t){for(var i=-1,n=e.length,s={};++i<n;){var o=e[i],a=ROe(r,o);t(a,o)&&FOe(s,NOe(o,r),a)}return s}K_.exports=LOe});var Y_=w((SAt,G_)=>{function TOe(r,e){return r!=null&&e in Object(r)}G_.exports=TOe});var q_=w((vAt,j_)=>{var OOe=Fc(),MOe=Jo(),UOe=\"[object Arguments]\";function KOe(r){return MOe(r)&&OOe(r)==UOe}j_.exports=KOe});var nm=w((xAt,z_)=>{var J_=q_(),HOe=Jo(),W_=Object.prototype,GOe=W_.hasOwnProperty,YOe=W_.propertyIsEnumerable,jOe=J_(function(){return arguments}())?J_:function(r){return HOe(r)&&GOe.call(r,\"callee\")&&!YOe.call(r,\"callee\")};z_.exports=jOe});var j0=w((PAt,V_)=>{var qOe=9007199254740991;function JOe(r){return typeof r==\"number\"&&r>-1&&r%1==0&&r<=qOe}V_.exports=JOe});var KN=w((DAt,X_)=>{var WOe=Bh(),zOe=nm(),VOe=vs(),XOe=im(),ZOe=j0(),_Oe=Zc();function $Oe(r,e,t){e=WOe(e,r);for(var i=-1,n=e.length,s=!1;++i<n;){var o=_Oe(e[i]);if(!(s=r!=null&&t(r,o)))break;r=r[o]}return s||++i!=n?s:(n=r==null?0:r.length,!!n&&ZOe(n)&&XOe(o,n)&&(VOe(r)||zOe(r)))}X_.exports=$Oe});var HN=w((kAt,Z_)=>{var eMe=Y_(),tMe=KN();function rMe(r,e){return r!=null&&tMe(r,e,eMe)}Z_.exports=rMe});var $_=w((RAt,__)=>{var iMe=H_(),nMe=HN();function sMe(r,e){return iMe(r,e,function(t,i){return nMe(r,i)})}__.exports=sMe});var q0=w((FAt,e$)=>{function oMe(r,e){for(var t=-1,i=e.length,n=r.length;++t<i;)r[n+t]=e[t];return r}e$.exports=oMe});var n$=w((NAt,i$)=>{var t$=Rc(),aMe=nm(),AMe=vs(),r$=t$?t$.isConcatSpreadable:void 0;function lMe(r){return AMe(r)||aMe(r)||!!(r$&&r&&r[r$])}i$.exports=lMe});var a$=w((LAt,o$)=>{var cMe=q0(),uMe=n$();function s$(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=uMe),n||(n=[]);++s<o;){var a=r[s];e>0&&t(a)?e>1?s$(a,e-1,t,i,n):cMe(n,a):i||(n[n.length]=a)}return n}o$.exports=s$});var l$=w((TAt,A$)=>{var gMe=a$();function fMe(r){var e=r==null?0:r.length;return e?gMe(r,1):[]}A$.exports=fMe});var u$=w((OAt,c$)=>{function hMe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:return r.call(e,t[0]);case 2:return r.call(e,t[0],t[1]);case 3:return r.call(e,t[0],t[1],t[2])}return r.apply(e,t)}c$.exports=hMe});var GN=w((MAt,f$)=>{var pMe=u$(),g$=Math.max;function dMe(r,e,t){return e=g$(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=g$(i.length-e,0),o=Array(s);++n<s;)o[n]=i[e+n];n=-1;for(var a=Array(e+1);++n<e;)a[n]=i[n];return a[e]=t(o),pMe(r,this,a)}}f$.exports=dMe});var p$=w((UAt,h$)=>{function CMe(r){return function(){return r}}h$.exports=CMe});var J0=w((KAt,d$)=>{function mMe(r){return r}d$.exports=mMe});var E$=w((HAt,m$)=>{var EMe=p$(),C$=MN(),IMe=J0(),yMe=C$?function(r,e){return C$(r,\"toString\",{configurable:!0,enumerable:!1,value:EMe(e),writable:!0})}:IMe;m$.exports=yMe});var y$=w((GAt,I$)=>{var wMe=800,BMe=16,QMe=Date.now;function bMe(r){var e=0,t=0;return function(){var i=QMe(),n=BMe-(i-t);if(t=i,n>0){if(++e>=wMe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}I$.exports=bMe});var YN=w((YAt,w$)=>{var SMe=E$(),vMe=y$(),xMe=vMe(SMe);w$.exports=xMe});var Q$=w((jAt,B$)=>{var PMe=l$(),DMe=GN(),kMe=YN();function RMe(r){return kMe(DMe(r,void 0,PMe),r+\"\")}B$.exports=RMe});var S$=w((qAt,b$)=>{var FMe=$_(),NMe=Q$(),LMe=NMe(function(r,e){return r==null?{}:FMe(r,e)});b$.exports=LMe});var O$=w((hct,T$)=>{\"use strict\";var XN;try{XN=Map}catch{}var ZN;try{ZN=Set}catch{}function N$(r,e,t){if(!r||typeof r!=\"object\"||typeof r==\"function\")return r;if(r.nodeType&&\"cloneNode\"in r)return r.cloneNode(!0);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r);if(Array.isArray(r))return r.map(L$);if(XN&&r instanceof XN)return new Map(Array.from(r.entries()));if(ZN&&r instanceof ZN)return new Set(Array.from(r.values()));if(r instanceof Object){e.push(r);var i=Object.create(r);t.push(i);for(var n in r){var s=e.findIndex(function(o){return o===r[n]});i[n]=s>-1?t[s]:N$(r[n],e,t)}return i}return r}function L$(r){return N$(r,[],[])}T$.exports=L$});var om=w(_N=>{\"use strict\";Object.defineProperty(_N,\"__esModule\",{value:!0});_N.default=XMe;var jMe=Object.prototype.toString,qMe=Error.prototype.toString,JMe=RegExp.prototype.toString,WMe=typeof Symbol<\"u\"?Symbol.prototype.toString:()=>\"\",zMe=/^Symbol\\((.*)\\)(.*)$/;function VMe(r){return r!=+r?\"NaN\":r===0&&1/r<0?\"-0\":\"\"+r}function M$(r,e=!1){if(r==null||r===!0||r===!1)return\"\"+r;let t=typeof r;if(t===\"number\")return VMe(r);if(t===\"string\")return e?`\"${r}\"`:r;if(t===\"function\")return\"[Function \"+(r.name||\"anonymous\")+\"]\";if(t===\"symbol\")return WMe.call(r).replace(zMe,\"Symbol($1)\");let i=jMe.call(r).slice(8,-1);return i===\"Date\"?isNaN(r.getTime())?\"\"+r:r.toISOString(r):i===\"Error\"||r instanceof Error?\"[\"+qMe.call(r)+\"]\":i===\"RegExp\"?JMe.call(r):null}function XMe(r,e){let t=M$(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=M$(this[i],e);return s!==null?s:n},2)}});var iA=w(Ei=>{\"use strict\";Object.defineProperty(Ei,\"__esModule\",{value:!0});Ei.default=Ei.array=Ei.object=Ei.boolean=Ei.date=Ei.number=Ei.string=Ei.mixed=void 0;var U$=ZMe(om());function ZMe(r){return r&&r.__esModule?r:{default:r}}var K$={default:\"${path} is invalid\",required:\"${path} is a required field\",oneOf:\"${path} must be one of the following values: ${values}\",notOneOf:\"${path} must not be one of the following values: ${values}\",notType:({path:r,type:e,value:t,originalValue:i})=>{let n=i!=null&&i!==t,s=`${r} must be a \\`${e}\\` type, but the final value was: \\`${(0,U$.default)(t,!0)}\\``+(n?` (cast from the value \\`${(0,U$.default)(i,!0)}\\`).`:\".\");return t===null&&(s+='\\n If \"null\" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:\"${path} must be defined\"};Ei.mixed=K$;var H$={length:\"${path} must be exactly ${length} characters\",min:\"${path} must be at least ${min} characters\",max:\"${path} must be at most ${max} characters\",matches:'${path} must match the following: \"${regex}\"',email:\"${path} must be a valid email\",url:\"${path} must be a valid URL\",uuid:\"${path} must be a valid UUID\",trim:\"${path} must be a trimmed string\",lowercase:\"${path} must be a lowercase string\",uppercase:\"${path} must be a upper case string\"};Ei.string=H$;var G$={min:\"${path} must be greater than or equal to ${min}\",max:\"${path} must be less than or equal to ${max}\",lessThan:\"${path} must be less than ${less}\",moreThan:\"${path} must be greater than ${more}\",positive:\"${path} must be a positive number\",negative:\"${path} must be a negative number\",integer:\"${path} must be an integer\"};Ei.number=G$;var Y$={min:\"${path} field must be later than ${min}\",max:\"${path} field must be at earlier than ${max}\"};Ei.date=Y$;var j$={isValue:\"${path} field must be ${value}\"};Ei.boolean=j$;var q$={noUnknown:\"${path} field has unspecified keys: ${unknown}\"};Ei.object=q$;var J$={min:\"${path} field must have at least ${min} items\",max:\"${path} field must have less than or equal to ${max} items\",length:\"${path} must be have ${length} items\"};Ei.array=J$;var _Me=Object.assign(Object.create(null),{mixed:K$,string:H$,number:G$,date:Y$,object:q$,array:J$,boolean:j$});Ei.default=_Me});var z$=w((Cct,W$)=>{var $Me=Object.prototype,e1e=$Me.hasOwnProperty;function t1e(r,e){return r!=null&&e1e.call(r,e)}W$.exports=t1e});var am=w((mct,V$)=>{var r1e=z$(),i1e=KN();function n1e(r,e){return r!=null&&i1e(r,e,r1e)}V$.exports=n1e});var xh=w(eQ=>{\"use strict\";Object.defineProperty(eQ,\"__esModule\",{value:!0});eQ.default=void 0;var s1e=r=>r&&r.__isYupSchema__;eQ.default=s1e});var Z$=w(tQ=>{\"use strict\";Object.defineProperty(tQ,\"__esModule\",{value:!0});tQ.default=void 0;var o1e=X$(am()),a1e=X$(xh());function X$(r){return r&&r.__esModule?r:{default:r}}var $N=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t==\"function\"){this.fn=t;return}if(!(0,o1e.default)(t,\"is\"))throw new TypeError(\"`is:` is required for `when()` conditions\");if(!t.then&&!t.otherwise)throw new TypeError(\"either `then:` or `otherwise:` is required for `when()` conditions\");let{is:i,then:n,otherwise:s}=t,o=typeof i==\"function\"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u==\"function\"?u(c):c.concat(u.resolve(l))}}resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t==null?void 0:t.parent,t==null?void 0:t.context)),n=this.fn.apply(e,i.concat(e,t));if(n===void 0||n===e)return e;if(!(0,a1e.default)(n))throw new TypeError(\"conditions must return a schema object\");return n.resolve(t)}},A1e=$N;tQ.default=A1e});var tL=w(eL=>{\"use strict\";Object.defineProperty(eL,\"__esModule\",{value:!0});eL.default=l1e;function l1e(r){return r==null?[]:[].concat(r)}});var _c=w(rQ=>{\"use strict\";Object.defineProperty(rQ,\"__esModule\",{value:!0});rQ.default=void 0;var c1e=_$(om()),u1e=_$(tL());function _$(r){return r&&r.__esModule?r:{default:r}}function rL(){return rL=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},rL.apply(this,arguments)}var g1e=/\\$\\{\\s*(\\w+)\\s*\\}/g,Ph=class extends Error{static formatError(e,t){let i=t.label||t.path||\"this\";return i!==t.path&&(t=rL({},t,{path:i})),typeof e==\"string\"?e.replace(g1e,(n,s)=>(0,c1e.default)(t[s])):typeof e==\"function\"?e(t):e}static isError(e){return e&&e.name===\"ValidationError\"}constructor(e,t,i,n){super(),this.name=\"ValidationError\",this.value=t,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,u1e.default)(e).forEach(s=>{Ph.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,Ph)}};rQ.default=Ph});var iQ=w(nL=>{\"use strict\";Object.defineProperty(nL,\"__esModule\",{value:!0});nL.default=p1e;var iL=f1e(_c());function f1e(r){return r&&r.__esModule?r:{default:r}}var h1e=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function p1e(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=h1e(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new iL.default(o,s,l)):c(null,s);for(let f=0;f<i.length;f++){let h=i[f];h(n,function(C){if(C){if(!iL.default.isError(C))return c(C,s);if(t)return C.value=s,c(C,s);g.push(C)}if(--u<=0){if(g.length&&(a&&g.sort(a),o.length&&g.push(...o),o=g),o.length){c(new iL.default(o,s,l),s);return}c(null,s)}})}}});var eee=w((Qct,$$)=>{function d1e(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[r?a:++n];if(t(s[l],l,s)===!1)break}return e}}$$.exports=d1e});var sL=w((bct,tee)=>{var C1e=eee(),m1e=C1e();tee.exports=m1e});var iee=w((Sct,ree)=>{function E1e(r,e){for(var t=-1,i=Array(r);++t<r;)i[t]=e(t);return i}ree.exports=E1e});var see=w((vct,nee)=>{function I1e(){return!1}nee.exports=I1e});var lm=w((Am,Dh)=>{var y1e=ys(),w1e=see(),Aee=typeof Am==\"object\"&&Am&&!Am.nodeType&&Am,oee=Aee&&typeof Dh==\"object\"&&Dh&&!Dh.nodeType&&Dh,B1e=oee&&oee.exports===Aee,aee=B1e?y1e.Buffer:void 0,Q1e=aee?aee.isBuffer:void 0,b1e=Q1e||w1e;Dh.exports=b1e});var cee=w((xct,lee)=>{var S1e=Fc(),v1e=j0(),x1e=Jo(),P1e=\"[object Arguments]\",D1e=\"[object Array]\",k1e=\"[object Boolean]\",R1e=\"[object Date]\",F1e=\"[object Error]\",N1e=\"[object Function]\",L1e=\"[object Map]\",T1e=\"[object Number]\",O1e=\"[object Object]\",M1e=\"[object RegExp]\",U1e=\"[object Set]\",K1e=\"[object String]\",H1e=\"[object WeakMap]\",G1e=\"[object ArrayBuffer]\",Y1e=\"[object DataView]\",j1e=\"[object Float32Array]\",q1e=\"[object Float64Array]\",J1e=\"[object Int8Array]\",W1e=\"[object Int16Array]\",z1e=\"[object Int32Array]\",V1e=\"[object Uint8Array]\",X1e=\"[object Uint8ClampedArray]\",Z1e=\"[object Uint16Array]\",_1e=\"[object Uint32Array]\",Ir={};Ir[j1e]=Ir[q1e]=Ir[J1e]=Ir[W1e]=Ir[z1e]=Ir[V1e]=Ir[X1e]=Ir[Z1e]=Ir[_1e]=!0;Ir[P1e]=Ir[D1e]=Ir[G1e]=Ir[k1e]=Ir[Y1e]=Ir[R1e]=Ir[F1e]=Ir[N1e]=Ir[L1e]=Ir[T1e]=Ir[O1e]=Ir[M1e]=Ir[U1e]=Ir[K1e]=Ir[H1e]=!1;function $1e(r){return x1e(r)&&v1e(r.length)&&!!Ir[S1e(r)]}lee.exports=$1e});var nQ=w((Pct,uee)=>{function eUe(r){return function(e){return r(e)}}uee.exports=eUe});var sQ=w((cm,kh)=>{var tUe=WD(),gee=typeof cm==\"object\"&&cm&&!cm.nodeType&&cm,um=gee&&typeof kh==\"object\"&&kh&&!kh.nodeType&&kh,rUe=um&&um.exports===gee,oL=rUe&&tUe.process,iUe=function(){try{var r=um&&um.require&&um.require(\"util\").types;return r||oL&&oL.binding&&oL.binding(\"util\")}catch{}}();kh.exports=iUe});var oQ=w((Dct,pee)=>{var nUe=cee(),sUe=nQ(),fee=sQ(),hee=fee&&fee.isTypedArray,oUe=hee?sUe(hee):nUe;pee.exports=oUe});var aL=w((kct,dee)=>{var aUe=iee(),AUe=nm(),lUe=vs(),cUe=lm(),uUe=im(),gUe=oQ(),fUe=Object.prototype,hUe=fUe.hasOwnProperty;function pUe(r,e){var t=lUe(r),i=!t&&AUe(r),n=!t&&!i&&cUe(r),s=!t&&!i&&!n&&gUe(r),o=t||i||n||s,a=o?aUe(r.length,String):[],l=a.length;for(var c in r)(e||hUe.call(r,c))&&!(o&&(c==\"length\"||n&&(c==\"offset\"||c==\"parent\")||s&&(c==\"buffer\"||c==\"byteLength\"||c==\"byteOffset\")||uUe(c,l)))&&a.push(c);return a}dee.exports=pUe});var aQ=w((Rct,Cee)=>{var dUe=Object.prototype;function CUe(r){var e=r&&r.constructor,t=typeof e==\"function\"&&e.prototype||dUe;return r===t}Cee.exports=CUe});var AL=w((Fct,mee)=>{function mUe(r,e){return function(t){return r(e(t))}}mee.exports=mUe});var Iee=w((Nct,Eee)=>{var EUe=AL(),IUe=EUe(Object.keys,Object);Eee.exports=IUe});var wee=w((Lct,yee)=>{var yUe=aQ(),wUe=Iee(),BUe=Object.prototype,QUe=BUe.hasOwnProperty;function bUe(r){if(!yUe(r))return wUe(r);var e=[];for(var t in Object(r))QUe.call(r,t)&&t!=\"constructor\"&&e.push(t);return e}yee.exports=bUe});var gm=w((Tct,Bee)=>{var SUe=K0(),vUe=j0();function xUe(r){return r!=null&&vUe(r.length)&&!SUe(r)}Bee.exports=xUe});var Rh=w((Oct,Qee)=>{var PUe=aL(),DUe=wee(),kUe=gm();function RUe(r){return kUe(r)?PUe(r):DUe(r)}Qee.exports=RUe});var lL=w((Mct,bee)=>{var FUe=sL(),NUe=Rh();function LUe(r,e){return r&&FUe(r,e,NUe)}bee.exports=LUe});var vee=w((Uct,See)=>{var TUe=em();function OUe(){this.__data__=new TUe,this.size=0}See.exports=OUe});var Pee=w((Kct,xee)=>{function MUe(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}xee.exports=MUe});var kee=w((Hct,Dee)=>{function UUe(r){return this.__data__.get(r)}Dee.exports=UUe});var Fee=w((Gct,Ree)=>{function KUe(r){return this.__data__.has(r)}Ree.exports=KUe});var Lee=w((Yct,Nee)=>{var HUe=em(),GUe=H0(),YUe=G0(),jUe=200;function qUe(r,e){var t=this.__data__;if(t instanceof HUe){var i=t.__data__;if(!GUe||i.length<jUe-1)return i.push([r,e]),this.size=++t.size,this;t=this.__data__=new YUe(i)}return t.set(r,e),this.size=t.size,this}Nee.exports=qUe});var fm=w((jct,Tee)=>{var JUe=em(),WUe=vee(),zUe=Pee(),VUe=kee(),XUe=Fee(),ZUe=Lee();function Fh(r){var e=this.__data__=new JUe(r);this.size=e.size}Fh.prototype.clear=WUe;Fh.prototype.delete=zUe;Fh.prototype.get=VUe;Fh.prototype.has=XUe;Fh.prototype.set=ZUe;Tee.exports=Fh});var Mee=w((qct,Oee)=>{var _Ue=\"__lodash_hash_undefined__\";function $Ue(r){return this.__data__.set(r,_Ue),this}Oee.exports=$Ue});var Kee=w((Jct,Uee)=>{function eKe(r){return this.__data__.has(r)}Uee.exports=eKe});var Gee=w((Wct,Hee)=>{var tKe=G0(),rKe=Mee(),iKe=Kee();function AQ(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new tKe;++e<t;)this.add(r[e])}AQ.prototype.add=AQ.prototype.push=rKe;AQ.prototype.has=iKe;Hee.exports=AQ});var jee=w((zct,Yee)=>{function nKe(r,e){for(var t=-1,i=r==null?0:r.length;++t<i;)if(e(r[t],t,r))return!0;return!1}Yee.exports=nKe});var Jee=w((Vct,qee)=>{function sKe(r,e){return r.has(e)}qee.exports=sKe});var cL=w((Xct,Wee)=>{var oKe=Gee(),aKe=jee(),AKe=Jee(),lKe=1,cKe=2;function uKe(r,e,t,i,n,s){var o=t&lKe,a=r.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(r),u=s.get(e);if(c&&u)return c==e&&u==r;var g=-1,f=!0,h=t&cKe?new oKe:void 0;for(s.set(r,e),s.set(e,r);++g<a;){var p=r[g],C=e[g];if(i)var y=o?i(C,p,g,e,r,s):i(p,C,g,r,e,s);if(y!==void 0){if(y)continue;f=!1;break}if(h){if(!aKe(e,function(B,v){if(!AKe(h,v)&&(p===B||n(p,B,t,i,s)))return h.push(v)})){f=!1;break}}else if(!(p===C||n(p,C,t,i,s))){f=!1;break}}return s.delete(r),s.delete(e),f}Wee.exports=uKe});var uL=w((Zct,zee)=>{var gKe=ys(),fKe=gKe.Uint8Array;zee.exports=fKe});var Xee=w((_ct,Vee)=>{function hKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}Vee.exports=hKe});var _ee=w(($ct,Zee)=>{function pKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}Zee.exports=pKe});var ite=w((eut,rte)=>{var $ee=Rc(),ete=uL(),dKe=Ih(),CKe=cL(),mKe=Xee(),EKe=_ee(),IKe=1,yKe=2,wKe=\"[object Boolean]\",BKe=\"[object Date]\",QKe=\"[object Error]\",bKe=\"[object Map]\",SKe=\"[object Number]\",vKe=\"[object RegExp]\",xKe=\"[object Set]\",PKe=\"[object String]\",DKe=\"[object Symbol]\",kKe=\"[object ArrayBuffer]\",RKe=\"[object DataView]\",tte=$ee?$ee.prototype:void 0,gL=tte?tte.valueOf:void 0;function FKe(r,e,t,i,n,s,o){switch(t){case RKe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case kKe:return!(r.byteLength!=e.byteLength||!s(new ete(r),new ete(e)));case wKe:case BKe:case SKe:return dKe(+r,+e);case QKe:return r.name==e.name&&r.message==e.message;case vKe:case PKe:return r==e+\"\";case bKe:var a=mKe;case xKe:var l=i&IKe;if(a||(a=EKe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=yKe,o.set(r,e);var u=CKe(a(r),a(e),i,n,s,o);return o.delete(r),u;case DKe:if(gL)return gL.call(r)==gL.call(e)}return!1}rte.exports=FKe});var fL=w((tut,nte)=>{var NKe=q0(),LKe=vs();function TKe(r,e,t){var i=e(r);return LKe(r)?i:NKe(i,t(r))}nte.exports=TKe});var ote=w((rut,ste)=>{function OKe(r,e){for(var t=-1,i=r==null?0:r.length,n=0,s=[];++t<i;){var o=r[t];e(o,t,r)&&(s[n++]=o)}return s}ste.exports=OKe});var hL=w((iut,ate)=>{function MKe(){return[]}ate.exports=MKe});var lQ=w((nut,lte)=>{var UKe=ote(),KKe=hL(),HKe=Object.prototype,GKe=HKe.propertyIsEnumerable,Ate=Object.getOwnPropertySymbols,YKe=Ate?function(r){return r==null?[]:(r=Object(r),UKe(Ate(r),function(e){return GKe.call(r,e)}))}:KKe;lte.exports=YKe});var pL=w((sut,cte)=>{var jKe=fL(),qKe=lQ(),JKe=Rh();function WKe(r){return jKe(r,JKe,qKe)}cte.exports=WKe});var fte=w((out,gte)=>{var ute=pL(),zKe=1,VKe=Object.prototype,XKe=VKe.hasOwnProperty;function ZKe(r,e,t,i,n,s){var o=t&zKe,a=ute(r),l=a.length,c=ute(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:XKe.call(e,f)))return!1}var h=s.get(r),p=s.get(e);if(h&&p)return h==e&&p==r;var C=!0;s.set(r,e),s.set(e,r);for(var y=o;++g<l;){f=a[g];var B=r[f],v=e[f];if(i)var D=o?i(v,B,f,e,r,s):i(B,v,f,r,e,s);if(!(D===void 0?B===v||n(B,v,t,i,s):D)){C=!1;break}y||(y=f==\"constructor\")}if(C&&!y){var L=r.constructor,H=e.constructor;L!=H&&\"constructor\"in r&&\"constructor\"in e&&!(typeof L==\"function\"&&L instanceof L&&typeof H==\"function\"&&H instanceof H)&&(C=!1)}return s.delete(r),s.delete(e),C}gte.exports=ZKe});var pte=w((aut,hte)=>{var _Ke=hl(),$Ke=ys(),e2e=_Ke($Ke,\"DataView\");hte.exports=e2e});var Cte=w((Aut,dte)=>{var t2e=hl(),r2e=ys(),i2e=t2e(r2e,\"Promise\");dte.exports=i2e});var Ete=w((lut,mte)=>{var n2e=hl(),s2e=ys(),o2e=n2e(s2e,\"Set\");mte.exports=o2e});var yte=w((cut,Ite)=>{var a2e=hl(),A2e=ys(),l2e=a2e(A2e,\"WeakMap\");Ite.exports=l2e});var hm=w((uut,xte)=>{var dL=pte(),CL=H0(),mL=Cte(),EL=Ete(),IL=yte(),vte=Fc(),Nh=TN(),wte=\"[object Map]\",c2e=\"[object Object]\",Bte=\"[object Promise]\",Qte=\"[object Set]\",bte=\"[object WeakMap]\",Ste=\"[object DataView]\",u2e=Nh(dL),g2e=Nh(CL),f2e=Nh(mL),h2e=Nh(EL),p2e=Nh(IL),$c=vte;(dL&&$c(new dL(new ArrayBuffer(1)))!=Ste||CL&&$c(new CL)!=wte||mL&&$c(mL.resolve())!=Bte||EL&&$c(new EL)!=Qte||IL&&$c(new IL)!=bte)&&($c=function(r){var e=vte(r),t=e==c2e?r.constructor:void 0,i=t?Nh(t):\"\";if(i)switch(i){case u2e:return Ste;case g2e:return wte;case f2e:return Bte;case h2e:return Qte;case p2e:return bte}return e});xte.exports=$c});var Tte=w((gut,Lte)=>{var yL=fm(),d2e=cL(),C2e=ite(),m2e=fte(),Pte=hm(),Dte=vs(),kte=lm(),E2e=oQ(),I2e=1,Rte=\"[object Arguments]\",Fte=\"[object Array]\",cQ=\"[object Object]\",y2e=Object.prototype,Nte=y2e.hasOwnProperty;function w2e(r,e,t,i,n,s){var o=Dte(r),a=Dte(e),l=o?Fte:Pte(r),c=a?Fte:Pte(e);l=l==Rte?cQ:l,c=c==Rte?cQ:c;var u=l==cQ,g=c==cQ,f=l==c;if(f&&kte(r)){if(!kte(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new yL),o||E2e(r)?d2e(r,e,t,i,n,s):C2e(r,e,l,t,i,n,s);if(!(t&I2e)){var h=u&&Nte.call(r,\"__wrapped__\"),p=g&&Nte.call(e,\"__wrapped__\");if(h||p){var C=h?r.value():r,y=p?e.value():e;return s||(s=new yL),n(C,y,t,i,s)}}return f?(s||(s=new yL),m2e(r,e,t,i,n,s)):!1}Lte.exports=w2e});var wL=w((fut,Ute)=>{var B2e=Tte(),Ote=Jo();function Mte(r,e,t,i,n){return r===e?!0:r==null||e==null||!Ote(r)&&!Ote(e)?r!==r&&e!==e:B2e(r,e,t,i,Mte,n)}Ute.exports=Mte});var Hte=w((hut,Kte)=>{var Q2e=fm(),b2e=wL(),S2e=1,v2e=2;function x2e(r,e,t,i){var n=t.length,s=n,o=!i;if(r==null)return!s;for(r=Object(r);n--;){var a=t[n];if(o&&a[2]?a[1]!==r[a[0]]:!(a[0]in r))return!1}for(;++n<s;){a=t[n];var l=a[0],c=r[l],u=a[1];if(o&&a[2]){if(c===void 0&&!(l in r))return!1}else{var g=new Q2e;if(i)var f=i(c,u,l,r,e,g);if(!(f===void 0?b2e(u,c,S2e|v2e,i,g):f))return!1}}return!0}Kte.exports=x2e});var BL=w((put,Gte)=>{var P2e=Sn();function D2e(r){return r===r&&!P2e(r)}Gte.exports=D2e});var jte=w((dut,Yte)=>{var k2e=BL(),R2e=Rh();function F2e(r){for(var e=R2e(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,k2e(n)]}return e}Yte.exports=F2e});var QL=w((Cut,qte)=>{function N2e(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}qte.exports=N2e});var Wte=w((mut,Jte)=>{var L2e=Hte(),T2e=jte(),O2e=QL();function M2e(r){var e=T2e(r);return e.length==1&&e[0][2]?O2e(e[0][0],e[0][1]):function(t){return t===r||L2e(t,r,e)}}Jte.exports=M2e});var uQ=w((Eut,zte)=>{var U2e=rm();function K2e(r,e,t){var i=r==null?void 0:U2e(r,e);return i===void 0?t:i}zte.exports=K2e});var Xte=w((Iut,Vte)=>{var H2e=wL(),G2e=uQ(),Y2e=HN(),j2e=U0(),q2e=BL(),J2e=QL(),W2e=Zc(),z2e=1,V2e=2;function X2e(r,e){return j2e(r)&&q2e(e)?J2e(W2e(r),e):function(t){var i=G2e(t,r);return i===void 0&&i===e?Y2e(t,r):H2e(e,i,z2e|V2e)}}Vte.exports=X2e});var _te=w((yut,Zte)=>{function Z2e(r){return function(e){return e==null?void 0:e[r]}}Zte.exports=Z2e});var ere=w((wut,$te)=>{var _2e=rm();function $2e(r){return function(e){return _2e(e,r)}}$te.exports=$2e});var rre=w((But,tre)=>{var eHe=_te(),tHe=ere(),rHe=U0(),iHe=Zc();function nHe(r){return rHe(r)?eHe(iHe(r)):tHe(r)}tre.exports=nHe});var bL=w((Qut,ire)=>{var sHe=Wte(),oHe=Xte(),aHe=J0(),AHe=vs(),lHe=rre();function cHe(r){return typeof r==\"function\"?r:r==null?aHe:typeof r==\"object\"?AHe(r)?oHe(r[0],r[1]):sHe(r):lHe(r)}ire.exports=cHe});var SL=w((but,nre)=>{var uHe=Qh(),gHe=lL(),fHe=bL();function hHe(r,e){var t={};return e=fHe(e,3),gHe(r,function(i,n,s){uHe(t,n,e(i,n,s))}),t}nre.exports=hHe});var pm=w((Sut,lre)=>{\"use strict\";function eu(r){this._maxSize=r,this.clear()}eu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};eu.prototype.get=function(r){return this._values[r]};eu.prototype.set=function(r,e){return this._size>=this._maxSize&&this.clear(),r in this._values||this._size++,this._values[r]=e};var pHe=/[^.^\\]^[]+|(?=\\[\\]|\\.\\.)/g,Are=/^\\d+$/,dHe=/^\\d/,CHe=/[~`!#$%\\^&*+=\\-\\[\\]\\\\';,/{}|\\\\\":<>\\?]/g,mHe=/^\\s*(['\"]?)(.*?)(\\1)\\s*$/,PL=512,sre=new eu(PL),ore=new eu(PL),are=new eu(PL);lre.exports={Cache:eu,split:xL,normalizePath:vL,setter:function(r){var e=vL(r);return ore.get(r)||ore.set(r,function(i,n){for(var s=0,o=e.length,a=i;s<o-1;){var l=e[s];if(l===\"__proto__\"||l===\"constructor\"||l===\"prototype\")return i;a=a[e[s++]]}a[e[s]]=n})},getter:function(r,e){var t=vL(r);return are.get(r)||are.set(r,function(n){for(var s=0,o=t.length;s<o;)if(n!=null||!e)n=n[t[s++]];else return;return n})},join:function(r){return r.reduce(function(e,t){return e+(DL(t)||Are.test(t)?\"[\"+t+\"]\":(e?\".\":\"\")+t)},\"\")},forEach:function(r,e,t){EHe(Array.isArray(r)?r:xL(r),e,t)}};function vL(r){return sre.get(r)||sre.set(r,xL(r).map(function(e){return e.replace(mHe,\"$2\")}))}function xL(r){return r.match(pHe)}function EHe(r,e,t){var i=r.length,n,s,o,a;for(s=0;s<i;s++)n=r[s],n&&(wHe(n)&&(n='\"'+n+'\"'),a=DL(n),o=!a&&/^\\d+$/.test(n),e.call(t,n,a,o,s,r))}function DL(r){return typeof r==\"string\"&&r&&[\"'\",'\"'].indexOf(r.charAt(0))!==-1}function IHe(r){return r.match(dHe)&&!r.match(Are)}function yHe(r){return CHe.test(r)}function wHe(r){return!DL(r)&&(IHe(r)||yHe(r))}});var tu=w(Cm=>{\"use strict\";Object.defineProperty(Cm,\"__esModule\",{value:!0});Cm.create=QHe;Cm.default=void 0;var BHe=pm(),gQ={context:\"$\",value:\".\"};function QHe(r,e){return new dm(r,e)}var dm=class{constructor(e,t={}){if(typeof e!=\"string\")throw new TypeError(\"ref must be a string, got: \"+e);if(this.key=e.trim(),e===\"\")throw new TypeError(\"ref must be a non-empty string\");this.isContext=this.key[0]===gQ.context,this.isValue=this.key[0]===gQ.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?gQ.context:this.isValue?gQ.value:\"\";this.path=this.key.slice(i.length),this.getter=this.path&&(0,BHe.getter)(this.path,!0),this.map=t.map}getValue(e,t,i){let n=this.isContext?i:this.isValue?e:t;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,t){return this.getValue(e,t==null?void 0:t.parent,t==null?void 0:t.context)}resolve(){return this}describe(){return{type:\"ref\",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};Cm.default=dm;dm.prototype.__isYupRef=!0});var cre=w(RL=>{\"use strict\";Object.defineProperty(RL,\"__esModule\",{value:!0});RL.default=xHe;var bHe=kL(SL()),fQ=kL(_c()),SHe=kL(tu());function kL(r){return r&&r.__esModule?r:{default:r}}function hQ(){return hQ=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},hQ.apply(this,arguments)}function vHe(r,e){if(r==null)return{};var t={},i=Object.keys(r),n,s;for(s=0;s<i.length;s++)n=i[s],!(e.indexOf(n)>=0)&&(t[n]=r[n]);return t}function xHe(r){function e(t,i){let{value:n,path:s=\"\",label:o,options:a,originalValue:l,sync:c}=t,u=vHe(t,[\"value\",\"path\",\"label\",\"options\",\"originalValue\",\"sync\"]),{name:g,test:f,params:h,message:p}=r,{parent:C,context:y}=a;function B(j){return SHe.default.isRef(j)?j.getValue(n,C,y):j}function v(j={}){let $=(0,bHe.default)(hQ({value:n,originalValue:l,label:o,path:j.path||s},h,j.params),B),V=new fQ.default(fQ.default.formatError(j.message||p,$),n,$.path,j.type||g);return V.params=$,V}let D=hQ({path:s,parent:C,type:g,createError:v,resolve:B,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(D,n,D)).then(j=>{fQ.default.isError(j)?i(j):j?i(null,j):i(v())})}catch(j){i(j)}return}let L;try{var H;if(L=f.call(D,n,D),typeof((H=L)==null?void 0:H.then)==\"function\")throw new Error(`Validation test of type: \"${D.type}\" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(j){i(j);return}fQ.default.isError(L)?i(L):L?i(null,L):i(v())}return e.OPTIONS=r,e}});var FL=w(mm=>{\"use strict\";Object.defineProperty(mm,\"__esModule\",{value:!0});mm.getIn=ure;mm.default=void 0;var PHe=pm(),DHe=r=>r.substr(0,r.length-1).substr(1);function ure(r,e,t,i=t){let n,s,o;return e?((0,PHe.forEach)(e,(a,l,c)=>{let u=l?DHe(a):a;if(r=r.resolve({context:i,parent:n,value:t}),r.innerType){let g=c?parseInt(u,10):0;if(t&&g>=t.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=t,t=t&&t[g],r=r.innerType}if(!c){if(!r.fields||!r.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: \"${r._type}\")`);n=t,t=t&&t[u],r=r.fields[u]}s=u,o=l?\"[\"+a+\"]\":\".\"+a}),{schema:r,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:r}}var kHe=(r,e,t,i)=>ure(r,e,t,i).schema,RHe=kHe;mm.default=RHe});var fre=w(pQ=>{\"use strict\";Object.defineProperty(pQ,\"__esModule\",{value:!0});pQ.default=void 0;var gre=FHe(tu());function FHe(r){return r&&r.__esModule?r:{default:r}}var Em=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){gre.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){gre.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(t(i.value)===e)return!0;return!1}clone(){let e=new Em;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),t.list.forEach(n=>i.delete(n)),t.refs.forEach(n=>i.delete(n)),i}};pQ.default=Em});var sA=w(CQ=>{\"use strict\";Object.defineProperty(CQ,\"__esModule\",{value:!0});CQ.default=void 0;var hre=nA(O$()),Lh=iA(),NHe=nA(Z$()),pre=nA(iQ()),dQ=nA(cre()),dre=nA(om()),LHe=nA(tu()),THe=FL(),OHe=nA(tL()),Cre=nA(_c()),mre=nA(fre());function nA(r){return r&&r.__esModule?r:{default:r}}function Fs(){return Fs=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},Fs.apply(this,arguments)}var co=class{constructor(e){this.deps=[],this.conditions=[],this._whitelist=new mre.default,this._blacklist=new mre.default,this.exclusiveTests=Object.create(null),this.tests=[],this.transforms=[],this.withMutation(()=>{this.typeError(Lh.mixed.notType)}),this.type=(e==null?void 0:e.type)||\"mixed\",this.spec=Fs({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:\"optional\"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=Fs({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=(0,hre.default)(Fs({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(e.length===0)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=t,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!==\"mixed\")throw new TypeError(`You cannot \\`concat()\\` schema's of different types: ${this.type} and ${e.type}`);let t=this,i=e.clone(),n=Fs({},t.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=t._typeError),i._whitelistError||(i._whitelistError=t._whitelistError),i._blacklistError||(i._blacklistError=t._blacklistError),i._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),i.tests=t.tests,i.exclusiveTests=t.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let i=t.conditions;t=t.clone(),t.conditions=[],t=i.reduce((n,s)=>s.resolve(n,e),t),t=t.resolve(e)}return t}cast(e,t={}){let i=this.resolve(Fs({value:e},t)),n=i._cast(e,t);if(e!==void 0&&t.assert!==!1&&i.isType(n)!==!0){let s=(0,dre.default)(e),o=(0,dre.default)(n);throw new TypeError(`The value of ${t.path||\"field\"} could not be cast to a value that satisfies the schema type: \"${i._type}\". \n\nattempted value: ${s} \n`+(o!==s?`result of cast: ${o}`:\"\"))}return n}_cast(e,t){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,t={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=t,u=e;l||(u=this._cast(u,Fs({assert:!1},t)));let g={value:u,path:s,options:t,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,pre.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,pre.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,t,i){let n=this.resolve(Fs({},t,{value:e}));return typeof i==\"function\"?n._validate(e,t,i):new Promise((s,o)=>n._validate(e,t,(a,l)=>{a?o(a):s(l)}))}validateSync(e,t){let i=this.resolve(Fs({},t,{value:e})),n;return i._validate(e,Fs({},t,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,i=>{if(Cre.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(Cre.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e==\"function\"?e.call(this):(0,hre.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return e!=null}defined(e=Lh.mixed.defined){return this.test({message:e,name:\"defined\",exclusive:!0,test(t){return t!==void 0}})}required(e=Lh.mixed.required){return this.clone({presence:\"required\"}).withMutation(t=>t.test({message:e,name:\"required\",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:\"optional\"});return e.tests=e.tests.filter(t=>t.OPTIONS.name!==\"required\"),e}nullable(e=!0){var t=this.clone({nullable:e!==!1});return t}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(e.length===1?typeof e[0]==\"function\"?t={test:e[0]}:t=e[0]:e.length===2?t={name:e[0],test:e[1]}:t={name:e[0],message:e[1],test:e[2]},t.message===void 0&&(t.message=Lh.mixed.default),typeof t.test!=\"function\")throw new TypeError(\"`test` is a required parameters\");let i=this.clone(),n=(0,dQ.default)(t),s=t.exclusive||t.name&&i.exclusiveTests[t.name]===!0;if(t.exclusive&&!t.name)throw new TypeError(\"Exclusive tests must provide a unique `name` identifying the test\");return t.name&&(i.exclusiveTests[t.name]=!!t.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===t.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,t){!Array.isArray(e)&&typeof e!=\"string\"&&(t=e,e=\".\");let i=this.clone(),n=(0,OHe.default)(e).map(s=>new LHe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new NHe.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,dQ.default)({message:e,name:\"typeError\",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),t}oneOf(e,t=Lh.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,dQ.default)({message:t,name:\"oneOf\",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(\", \")}})}}),i}notOneOf(e,t=Lh.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,dQ.default)({message:t,name:\"notOneOf\",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(\", \")}}):!0}}),i}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:i}=e.spec;return{meta:i,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};CQ.default=co;co.prototype.__isYupSchema__=!0;for(let r of[\"validate\",\"validateSync\"])co.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,THe.getIn)(this,e,t,i.context);return o[r](n&&n[s],Fs({},i,{parent:n,path:e}))};for(let r of[\"equals\",\"is\"])co.prototype[r]=co.prototype.oneOf;for(let r of[\"not\",\"nope\"])co.prototype[r]=co.prototype.notOneOf;co.prototype.optional=co.prototype.notRequired});var Ire=w(Im=>{\"use strict\";Object.defineProperty(Im,\"__esModule\",{value:!0});Im.create=Ere;Im.default=void 0;var MHe=UHe(sA());function UHe(r){return r&&r.__esModule?r:{default:r}}var NL=MHe.default,KHe=NL;Im.default=KHe;function Ere(){return new NL}Ere.prototype=NL.prototype});var Th=w(mQ=>{\"use strict\";Object.defineProperty(mQ,\"__esModule\",{value:!0});mQ.default=void 0;var HHe=r=>r==null;mQ.default=HHe});var bre=w(wm=>{\"use strict\";Object.defineProperty(wm,\"__esModule\",{value:!0});wm.create=Qre;wm.default=void 0;var GHe=Bre(sA()),yre=iA(),wre=Bre(Th());function Bre(r){return r&&r.__esModule?r:{default:r}}function Qre(){return new ym}var ym=class extends GHe.default{constructor(){super({type:\"boolean\"}),this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e==\"boolean\"}isTrue(e=yre.boolean.isValue){return this.test({message:e,name:\"is-value\",exclusive:!0,params:{value:\"true\"},test(t){return(0,wre.default)(t)||t===!0}})}isFalse(e=yre.boolean.isValue){return this.test({message:e,name:\"is-value\",exclusive:!0,params:{value:\"false\"},test(t){return(0,wre.default)(t)||t===!1}})}};wm.default=ym;Qre.prototype=ym.prototype});var xre=w(Qm=>{\"use strict\";Object.defineProperty(Qm,\"__esModule\",{value:!0});Qm.create=vre;Qm.default=void 0;var ia=iA(),oA=Sre(Th()),YHe=Sre(sA());function Sre(r){return r&&r.__esModule?r:{default:r}}var jHe=/^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,qHe=/^((https?|ftp):)?\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i,JHe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,WHe=r=>(0,oA.default)(r)||r===r.trim(),zHe={}.toString();function vre(){return new Bm}var Bm=class extends YHe.default{constructor(){super({type:\"string\"}),this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=e!=null&&e.toString?e.toString():e;return t===zHe?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e==\"string\"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=ia.string.length){return this.test({message:t,name:\"length\",exclusive:!0,params:{length:e},test(i){return(0,oA.default)(i)||i.length===this.resolve(e)}})}min(e,t=ia.string.min){return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(i){return(0,oA.default)(i)||i.length>=this.resolve(e)}})}max(e,t=ia.string.max){return this.test({name:\"max\",exclusive:!0,message:t,params:{max:e},test(i){return(0,oA.default)(i)||i.length<=this.resolve(e)}})}matches(e,t){let i=!1,n,s;return t&&(typeof t==\"object\"?{excludeEmptyString:i=!1,message:n,name:s}=t:n=t),this.test({name:s||\"matches\",message:n||ia.string.matches,params:{regex:e},test:o=>(0,oA.default)(o)||o===\"\"&&i||o.search(e)!==-1})}email(e=ia.string.email){return this.matches(jHe,{name:\"email\",message:e,excludeEmptyString:!0})}url(e=ia.string.url){return this.matches(qHe,{name:\"url\",message:e,excludeEmptyString:!0})}uuid(e=ia.string.uuid){return this.matches(JHe,{name:\"uuid\",message:e,excludeEmptyString:!1})}ensure(){return this.default(\"\").transform(e=>e===null?\"\":e)}trim(e=ia.string.trim){return this.transform(t=>t!=null?t.trim():t).test({message:e,name:\"trim\",test:WHe})}lowercase(e=ia.string.lowercase){return this.transform(t=>(0,oA.default)(t)?t:t.toLowerCase()).test({message:e,name:\"string_case\",exclusive:!0,test:t=>(0,oA.default)(t)||t===t.toLowerCase()})}uppercase(e=ia.string.uppercase){return this.transform(t=>(0,oA.default)(t)?t:t.toUpperCase()).test({message:e,name:\"string_case\",exclusive:!0,test:t=>(0,oA.default)(t)||t===t.toUpperCase()})}};Qm.default=Bm;vre.prototype=Bm.prototype});var kre=w(Sm=>{\"use strict\";Object.defineProperty(Sm,\"__esModule\",{value:!0});Sm.create=Dre;Sm.default=void 0;var ru=iA(),iu=Pre(Th()),VHe=Pre(sA());function Pre(r){return r&&r.__esModule?r:{default:r}}var XHe=r=>r!=+r;function Dre(){return new bm}var bm=class extends VHe.default{constructor(){super({type:\"number\"}),this.withMutation(()=>{this.transform(function(e){let t=e;if(typeof t==\"string\"){if(t=t.replace(/\\s/g,\"\"),t===\"\")return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e==\"number\"&&!XHe(e)}min(e,t=ru.number.min){return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(i){return(0,iu.default)(i)||i>=this.resolve(e)}})}max(e,t=ru.number.max){return this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(i){return(0,iu.default)(i)||i<=this.resolve(e)}})}lessThan(e,t=ru.number.lessThan){return this.test({message:t,name:\"max\",exclusive:!0,params:{less:e},test(i){return(0,iu.default)(i)||i<this.resolve(e)}})}moreThan(e,t=ru.number.moreThan){return this.test({message:t,name:\"min\",exclusive:!0,params:{more:e},test(i){return(0,iu.default)(i)||i>this.resolve(e)}})}positive(e=ru.number.positive){return this.moreThan(0,e)}negative(e=ru.number.negative){return this.lessThan(0,e)}integer(e=ru.number.integer){return this.test({name:\"integer\",message:e,test:t=>(0,iu.default)(t)||Number.isInteger(t)})}truncate(){return this.transform(e=>(0,iu.default)(e)?e:e|0)}round(e){var t,i=[\"ceil\",\"floor\",\"round\",\"trunc\"];if(e=((t=e)==null?void 0:t.toLowerCase())||\"round\",e===\"trunc\")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError(\"Only valid options for round() are: \"+i.join(\", \"));return this.transform(n=>(0,iu.default)(n)?n:Math[e](n))}};Sm.default=bm;Dre.prototype=bm.prototype});var Rre=w(LL=>{\"use strict\";Object.defineProperty(LL,\"__esModule\",{value:!0});LL.default=_He;var ZHe=/^(\\d{4}|[+\\-]\\d{6})(?:-?(\\d{2})(?:-?(\\d{2}))?)?(?:[ T]?(\\d{2}):?(\\d{2})(?::?(\\d{2})(?:[,\\.](\\d{1,}))?)?(?:(Z)|([+\\-])(\\d{2})(?::?(\\d{2}))?)?)?$/;function _He(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=ZHe.exec(r)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]===\"\")&&(n[9]===void 0||n[9]===\"\")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!==\"Z\"&&n[9]!==void 0&&(t=n[10]*60+n[11],n[9]===\"+\"&&(t=0-t)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+t,n[6],n[7]))}else i=Date.parse?Date.parse(r):NaN;return i}});var Lre=w(vm=>{\"use strict\";Object.defineProperty(vm,\"__esModule\",{value:!0});vm.create=OL;vm.default=void 0;var $He=EQ(Rre()),Fre=iA(),Nre=EQ(Th()),eGe=EQ(tu()),tGe=EQ(sA());function EQ(r){return r&&r.__esModule?r:{default:r}}var TL=new Date(\"\"),rGe=r=>Object.prototype.toString.call(r)===\"[object Date]\";function OL(){return new Oh}var Oh=class extends tGe.default{constructor(){super({type:\"date\"}),this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,$He.default)(e),isNaN(e)?TL:new Date(e))})})}_typeCheck(e){return rGe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(eGe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\\`${t}\\` must be a Date or a value that can be \\`cast()\\` to a Date`);i=n}return i}min(e,t=Fre.date.min){let i=this.prepareParam(e,\"min\");return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(n){return(0,Nre.default)(n)||n>=this.resolve(i)}})}max(e,t=Fre.date.max){var i=this.prepareParam(e,\"max\");return this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(n){return(0,Nre.default)(n)||n<=this.resolve(i)}})}};vm.default=Oh;Oh.INVALID_DATE=TL;OL.prototype=Oh.prototype;OL.INVALID_DATE=TL});var Ore=w((Uut,Tre)=>{function iGe(r,e,t,i){var n=-1,s=r==null?0:r.length;for(i&&s&&(t=r[++n]);++n<s;)t=e(t,r[n],n,r);return t}Tre.exports=iGe});var Ure=w((Kut,Mre)=>{function nGe(r){return function(e){return r==null?void 0:r[e]}}Mre.exports=nGe});var Hre=w((Hut,Kre)=>{var sGe=Ure(),oGe={\\u00C0:\"A\",\\u00C1:\"A\",\\u00C2:\"A\",\\u00C3:\"A\",\\u00C4:\"A\",\\u00C5:\"A\",\\u00E0:\"a\",\\u00E1:\"a\",\\u00E2:\"a\",\\u00E3:\"a\",\\u00E4:\"a\",\\u00E5:\"a\",\\u00C7:\"C\",\\u00E7:\"c\",\\u00D0:\"D\",\\u00F0:\"d\",\\u00C8:\"E\",\\u00C9:\"E\",\\u00CA:\"E\",\\u00CB:\"E\",\\u00E8:\"e\",\\u00E9:\"e\",\\u00EA:\"e\",\\u00EB:\"e\",\\u00CC:\"I\",\\u00CD:\"I\",\\u00CE:\"I\",\\u00CF:\"I\",\\u00EC:\"i\",\\u00ED:\"i\",\\u00EE:\"i\",\\u00EF:\"i\",\\u00D1:\"N\",\\u00F1:\"n\",\\u00D2:\"O\",\\u00D3:\"O\",\\u00D4:\"O\",\\u00D5:\"O\",\\u00D6:\"O\",\\u00D8:\"O\",\\u00F2:\"o\",\\u00F3:\"o\",\\u00F4:\"o\",\\u00F5:\"o\",\\u00F6:\"o\",\\u00F8:\"o\",\\u00D9:\"U\",\\u00DA:\"U\",\\u00DB:\"U\",\\u00DC:\"U\",\\u00F9:\"u\",\\u00FA:\"u\",\\u00FB:\"u\",\\u00FC:\"u\",\\u00DD:\"Y\",\\u00FD:\"y\",\\u00FF:\"y\",\\u00C6:\"Ae\",\\u00E6:\"ae\",\\u00DE:\"Th\",\\u00FE:\"th\",\\u00DF:\"ss\",\\u0100:\"A\",\\u0102:\"A\",\\u0104:\"A\",\\u0101:\"a\",\\u0103:\"a\",\\u0105:\"a\",\\u0106:\"C\",\\u0108:\"C\",\\u010A:\"C\",\\u010C:\"C\",\\u0107:\"c\",\\u0109:\"c\",\\u010B:\"c\",\\u010D:\"c\",\\u010E:\"D\",\\u0110:\"D\",\\u010F:\"d\",\\u0111:\"d\",\\u0112:\"E\",\\u0114:\"E\",\\u0116:\"E\",\\u0118:\"E\",\\u011A:\"E\",\\u0113:\"e\",\\u0115:\"e\",\\u0117:\"e\",\\u0119:\"e\",\\u011B:\"e\",\\u011C:\"G\",\\u011E:\"G\",\\u0120:\"G\",\\u0122:\"G\",\\u011D:\"g\",\\u011F:\"g\",\\u0121:\"g\",\\u0123:\"g\",\\u0124:\"H\",\\u0126:\"H\",\\u0125:\"h\",\\u0127:\"h\",\\u0128:\"I\",\\u012A:\"I\",\\u012C:\"I\",\\u012E:\"I\",\\u0130:\"I\",\\u0129:\"i\",\\u012B:\"i\",\\u012D:\"i\",\\u012F:\"i\",\\u0131:\"i\",\\u0134:\"J\",\\u0135:\"j\",\\u0136:\"K\",\\u0137:\"k\",\\u0138:\"k\",\\u0139:\"L\",\\u013B:\"L\",\\u013D:\"L\",\\u013F:\"L\",\\u0141:\"L\",\\u013A:\"l\",\\u013C:\"l\",\\u013E:\"l\",\\u0140:\"l\",\\u0142:\"l\",\\u0143:\"N\",\\u0145:\"N\",\\u0147:\"N\",\\u014A:\"N\",\\u0144:\"n\",\\u0146:\"n\",\\u0148:\"n\",\\u014B:\"n\",\\u014C:\"O\",\\u014E:\"O\",\\u0150:\"O\",\\u014D:\"o\",\\u014F:\"o\",\\u0151:\"o\",\\u0154:\"R\",\\u0156:\"R\",\\u0158:\"R\",\\u0155:\"r\",\\u0157:\"r\",\\u0159:\"r\",\\u015A:\"S\",\\u015C:\"S\",\\u015E:\"S\",\\u0160:\"S\",\\u015B:\"s\",\\u015D:\"s\",\\u015F:\"s\",\\u0161:\"s\",\\u0162:\"T\",\\u0164:\"T\",\\u0166:\"T\",\\u0163:\"t\",\\u0165:\"t\",\\u0167:\"t\",\\u0168:\"U\",\\u016A:\"U\",\\u016C:\"U\",\\u016E:\"U\",\\u0170:\"U\",\\u0172:\"U\",\\u0169:\"u\",\\u016B:\"u\",\\u016D:\"u\",\\u016F:\"u\",\\u0171:\"u\",\\u0173:\"u\",\\u0174:\"W\",\\u0175:\"w\",\\u0176:\"Y\",\\u0177:\"y\",\\u0178:\"Y\",\\u0179:\"Z\",\\u017B:\"Z\",\\u017D:\"Z\",\\u017A:\"z\",\\u017C:\"z\",\\u017E:\"z\",\\u0132:\"IJ\",\\u0133:\"ij\",\\u0152:\"Oe\",\\u0153:\"oe\",\\u0149:\"'n\",\\u017F:\"s\"},aGe=sGe(oGe);Kre.exports=aGe});var Yre=w((Gut,Gre)=>{var AGe=Hre(),lGe=Vf(),cGe=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,uGe=\"\\\\u0300-\\\\u036f\",gGe=\"\\\\ufe20-\\\\ufe2f\",fGe=\"\\\\u20d0-\\\\u20ff\",hGe=uGe+gGe+fGe,pGe=\"[\"+hGe+\"]\",dGe=RegExp(pGe,\"g\");function CGe(r){return r=lGe(r),r&&r.replace(cGe,AGe).replace(dGe,\"\")}Gre.exports=CGe});var qre=w((Yut,jre)=>{var mGe=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;function EGe(r){return r.match(mGe)||[]}jre.exports=EGe});var Wre=w((jut,Jre)=>{var IGe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function yGe(r){return IGe.test(r)}Jre.exports=yGe});var gie=w((qut,uie)=>{var _re=\"\\\\ud800-\\\\udfff\",wGe=\"\\\\u0300-\\\\u036f\",BGe=\"\\\\ufe20-\\\\ufe2f\",QGe=\"\\\\u20d0-\\\\u20ff\",bGe=wGe+BGe+QGe,$re=\"\\\\u2700-\\\\u27bf\",eie=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",SGe=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\",vGe=\"\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\",xGe=\"\\\\u2000-\\\\u206f\",PGe=\" \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",tie=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",DGe=\"\\\\ufe0e\\\\ufe0f\",rie=SGe+vGe+xGe+PGe,iie=\"['\\u2019]\",zre=\"[\"+rie+\"]\",kGe=\"[\"+bGe+\"]\",nie=\"\\\\d+\",RGe=\"[\"+$re+\"]\",sie=\"[\"+eie+\"]\",oie=\"[^\"+_re+rie+nie+$re+eie+tie+\"]\",FGe=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",NGe=\"(?:\"+kGe+\"|\"+FGe+\")\",LGe=\"[^\"+_re+\"]\",aie=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",Aie=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Mh=\"[\"+tie+\"]\",TGe=\"\\\\u200d\",Vre=\"(?:\"+sie+\"|\"+oie+\")\",OGe=\"(?:\"+Mh+\"|\"+oie+\")\",Xre=\"(?:\"+iie+\"(?:d|ll|m|re|s|t|ve))?\",Zre=\"(?:\"+iie+\"(?:D|LL|M|RE|S|T|VE))?\",lie=NGe+\"?\",cie=\"[\"+DGe+\"]?\",MGe=\"(?:\"+TGe+\"(?:\"+[LGe,aie,Aie].join(\"|\")+\")\"+cie+lie+\")*\",UGe=\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",KGe=\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",HGe=cie+lie+MGe,GGe=\"(?:\"+[RGe,aie,Aie].join(\"|\")+\")\"+HGe,YGe=RegExp([Mh+\"?\"+sie+\"+\"+Xre+\"(?=\"+[zre,Mh,\"$\"].join(\"|\")+\")\",OGe+\"+\"+Zre+\"(?=\"+[zre,Mh+Vre,\"$\"].join(\"|\")+\")\",Mh+\"?\"+Vre+\"+\"+Xre,Mh+\"+\"+Zre,KGe,UGe,nie,GGe].join(\"|\"),\"g\");function jGe(r){return r.match(YGe)||[]}uie.exports=jGe});var hie=w((Jut,fie)=>{var qGe=qre(),JGe=Wre(),WGe=Vf(),zGe=gie();function VGe(r,e,t){return r=WGe(r),e=t?void 0:e,e===void 0?JGe(r)?zGe(r):qGe(r):r.match(e)||[]}fie.exports=VGe});var ML=w((Wut,pie)=>{var XGe=Ore(),ZGe=Yre(),_Ge=hie(),$Ge=\"['\\u2019]\",eYe=RegExp($Ge,\"g\");function tYe(r){return function(e){return XGe(_Ge(ZGe(e).replace(eYe,\"\")),r,\"\")}}pie.exports=tYe});var Cie=w((zut,die)=>{var rYe=ML(),iYe=rYe(function(r,e,t){return r+(t?\"_\":\"\")+e.toLowerCase()});die.exports=iYe});var Eie=w((Vut,mie)=>{var nYe=PB(),sYe=ML(),oYe=sYe(function(r,e,t){return e=e.toLowerCase(),r+(t?nYe(e):e)});mie.exports=oYe});var yie=w((Xut,Iie)=>{var aYe=Qh(),AYe=lL(),lYe=bL();function cYe(r,e){var t={};return e=lYe(e,3),AYe(r,function(i,n,s){aYe(t,e(i,n,s),i)}),t}Iie.exports=cYe});var Bie=w((Zut,UL)=>{UL.exports=function(r){return wie(uYe(r),r)};UL.exports.array=wie;function wie(r,e){var t=r.length,i=new Array(t),n={},s=t,o=gYe(e),a=fYe(r);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error(\"Unknown node. There is an unknown node in the supplied edges.\")});s--;)n[s]||l(r[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=\", node was:\"+JSON.stringify(c)}catch{f=\"\"}throw new Error(\"Cyclic dependency\"+f)}if(!a.has(c))throw new Error(\"Found unknown node. Make sure to provided all involved nodes. Unknown node: \"+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--t]=c}}}function uYe(r){for(var e=new Set,t=0,i=r.length;t<i;t++){var n=r[t];e.add(n[0]),e.add(n[1])}return Array.from(e)}function gYe(r){for(var e=new Map,t=0,i=r.length;t<i;t++){var n=r[t];e.has(n[0])||e.set(n[0],new Set),e.has(n[1])||e.set(n[1],new Set),e.get(n[0]).add(n[1])}return e}function fYe(r){for(var e=new Map,t=0,i=r.length;t<i;t++)e.set(r[t],t);return e}});var Qie=w(KL=>{\"use strict\";Object.defineProperty(KL,\"__esModule\",{value:!0});KL.default=EYe;var hYe=IQ(am()),pYe=IQ(Bie()),dYe=pm(),CYe=IQ(tu()),mYe=IQ(xh());function IQ(r){return r&&r.__esModule?r:{default:r}}function EYe(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,dYe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,hYe.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),CYe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,mYe.default)(o)&&\"deps\"in o&&o.deps.forEach(a=>n(a,s))}return pYe.default.array(i,t).reverse()}});var Sie=w(HL=>{\"use strict\";Object.defineProperty(HL,\"__esModule\",{value:!0});HL.default=IYe;function bie(r,e){let t=1/0;return r.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return t=n,!0}),t}function IYe(r){return(e,t)=>bie(r,e)-bie(r,t)}});var Fie=w(Pm=>{\"use strict\";Object.defineProperty(Pm,\"__esModule\",{value:!0});Pm.create=Rie;Pm.default=void 0;var vie=na(am()),xie=na(Cie()),yYe=na(Eie()),wYe=na(yie()),BYe=na(SL()),QYe=pm(),Pie=iA(),bYe=na(Qie()),kie=na(Sie()),SYe=na(iQ()),vYe=na(_c()),GL=na(sA());function na(r){return r&&r.__esModule?r:{default:r}}function Uh(){return Uh=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},Uh.apply(this,arguments)}var Die=r=>Object.prototype.toString.call(r)===\"[object Object]\";function xYe(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var PYe=(0,kie.default)([]),xm=class extends GL.default{constructor(e){super({type:\"object\"}),this.fields=Object.create(null),this._sortErrors=PYe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i==\"string\")try{i=JSON.parse(i)}catch{i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return Die(e)||typeof e==\"function\"}_cast(e,t={}){var i;let n=super._cast(e,t);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=t.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=Uh({},t,{parent:l,__validating:t.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,vie.default)(n,g);if(f){let p,C=n[g];c.path=(t.path?`${t.path}.`:\"\")+g,f=f.resolve({value:C,context:t.context,parent:l});let y=\"spec\"in f?f.spec:void 0,B=y==null?void 0:y.strict;if(y!=null&&y.strip){u=u||g in n;continue}p=!t.__validating||!B?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,t={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=t;o=[{schema:this,value:a},...o],t.__validating=!0,t.originalValue=a,t.from=o,super._validate(e,t,(u,g)=>{if(u){if(!vYe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!Die(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,C)=>{let y=h.indexOf(\".\")===-1?(t.path?`${t.path}.`:\"\")+h:`${t.path||\"\"}[\"${h}\"]`,B=this.fields[h];if(B&&\"validate\"in B){B.validate(g[h],Uh({},t,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),C);return}C(null)});(0,SYe.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:t.path},i)})}clone(e){let t=super.clone(e);return t.fields=Uh({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),i=t.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof GL.default&&s instanceof GL.default&&(i[n]=s.concat(o))}return t.withMutation(()=>t.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let i=this.fields[t];e[t]=\"default\"in i?i.getDefault():void 0}),e}_getDefault(){if(\"default\"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,t=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,kie.default)(Object.keys(n)),t.length){Array.isArray(t[0])||(t=[t]);let s=t.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,bYe.default)(n,i._excludedEdges),i}pick(e){let t={};for(let i of e)this.fields[i]&&(t[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(t)))}omit(e){let t=this.clone(),i=t.fields;t.fields={};for(let n of e)delete i[n];return t.withMutation(()=>t.shape(i))}from(e,t,i){let n=(0,QYe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,vie.default)(s,e)&&(o=Uh({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=Pie.object.noUnknown){typeof e==\"string\"&&(t=e,e=!0);let i=this.test({name:\"noUnknown\",exclusive:!0,message:t,test(n){if(n==null)return!0;let s=xYe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(\", \")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=Pie.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,wYe.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(yYe.default)}snakeCase(){return this.transformKeys(xie.default)}constantCase(){return this.transformKeys(e=>(0,xie.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,BYe.default)(this.fields,t=>t.describe()),e}};Pm.default=xm;function Rie(r){return new xm(r)}Rie.prototype=xm.prototype});var Lie=w(km=>{\"use strict\";Object.defineProperty(km,\"__esModule\",{value:!0});km.create=Nie;km.default=void 0;var YL=Kh(Th()),DYe=Kh(xh()),kYe=Kh(om()),jL=iA(),RYe=Kh(iQ()),FYe=Kh(_c()),NYe=Kh(sA());function Kh(r){return r&&r.__esModule?r:{default:r}}function yQ(){return yQ=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},yQ.apply(this,arguments)}function Nie(r){return new Dm(r)}var Dm=class extends NYe.default{constructor(e){super({type:\"array\"}),this.innerType=e,this.withMutation(()=>{this.transform(function(t){if(typeof t==\"string\")try{t=JSON.parse(t)}catch{t=null}return this.isType(t)?t:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let i=super._cast(e,t);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,yQ({},t,{path:`${t.path||\"\"}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,t={},i){var n,s;let o=[],a=t.sync,l=t.path,c=this.innerType,u=(n=t.abortEarly)!=null?n:this.spec.abortEarly,g=(s=t.recursive)!=null?s:this.spec.recursive,f=t.originalValue!=null?t.originalValue:e;super._validate(e,t,(h,p)=>{if(h){if(!FYe.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let C=new Array(p.length);for(let y=0;y<p.length;y++){let B=p[y],v=`${t.path||\"\"}[${y}]`,D=yQ({},t,{path:v,strict:!0,parent:p,index:y,originalValue:f[y]});C[y]=(L,H)=>c.validate(B,D,H)}(0,RYe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:C},i)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!(0,DYe.default)(e))throw new TypeError(\"`array.of()` sub-schema must be a valid yup schema not: \"+(0,kYe.default)(e));return t.innerType=e,t}length(e,t=jL.array.length){return this.test({message:t,name:\"length\",exclusive:!0,params:{length:e},test(i){return(0,YL.default)(i)||i.length===this.resolve(e)}})}min(e,t){return t=t||jL.array.min,this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(i){return(0,YL.default)(i)||i.length>=this.resolve(e)}})}max(e,t){return t=t||jL.array.max,this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(i){return(0,YL.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:t==null?[]:[].concat(t))}compact(e){let t=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(t):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};km.default=Dm;Nie.prototype=Dm.prototype});var Tie=w(Rm=>{\"use strict\";Object.defineProperty(Rm,\"__esModule\",{value:!0});Rm.create=OYe;Rm.default=void 0;var LYe=TYe(xh());function TYe(r){return r&&r.__esModule?r:{default:r}}function OYe(r){return new wQ(r)}var wQ=class{constructor(e){this.type=\"lazy\",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,LYe.default)(n))throw new TypeError(\"lazy() functions must return a valid schema\");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,t){return this._resolve(e,t).cast(e,t)}validate(e,t,i){return this._resolve(e,t).validate(e,t,i)}validateSync(e,t){return this._resolve(e,t).validateSync(e,t)}validateAt(e,t,i){return this._resolve(t,i).validateAt(e,t,i)}validateSyncAt(e,t,i){return this._resolve(t,i).validateSyncAt(e,t,i)}describe(){return null}isValid(e,t){return this._resolve(e,t).isValid(e,t)}isValidSync(e,t){return this._resolve(e,t).isValidSync(e,t)}},MYe=wQ;Rm.default=MYe});var Oie=w(qL=>{\"use strict\";Object.defineProperty(qL,\"__esModule\",{value:!0});qL.default=HYe;var UYe=KYe(iA());function KYe(r){return r&&r.__esModule?r:{default:r}}function HYe(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{UYe.default[e][t]=r[e][t]})})}});var WL=w(yr=>{\"use strict\";Object.defineProperty(yr,\"__esModule\",{value:!0});yr.addMethod=zYe;Object.defineProperty(yr,\"MixedSchema\",{enumerable:!0,get:function(){return Mie.default}});Object.defineProperty(yr,\"mixed\",{enumerable:!0,get:function(){return Mie.create}});Object.defineProperty(yr,\"BooleanSchema\",{enumerable:!0,get:function(){return JL.default}});Object.defineProperty(yr,\"bool\",{enumerable:!0,get:function(){return JL.create}});Object.defineProperty(yr,\"boolean\",{enumerable:!0,get:function(){return JL.create}});Object.defineProperty(yr,\"StringSchema\",{enumerable:!0,get:function(){return Uie.default}});Object.defineProperty(yr,\"string\",{enumerable:!0,get:function(){return Uie.create}});Object.defineProperty(yr,\"NumberSchema\",{enumerable:!0,get:function(){return Kie.default}});Object.defineProperty(yr,\"number\",{enumerable:!0,get:function(){return Kie.create}});Object.defineProperty(yr,\"DateSchema\",{enumerable:!0,get:function(){return Hie.default}});Object.defineProperty(yr,\"date\",{enumerable:!0,get:function(){return Hie.create}});Object.defineProperty(yr,\"ObjectSchema\",{enumerable:!0,get:function(){return Gie.default}});Object.defineProperty(yr,\"object\",{enumerable:!0,get:function(){return Gie.create}});Object.defineProperty(yr,\"ArraySchema\",{enumerable:!0,get:function(){return Yie.default}});Object.defineProperty(yr,\"array\",{enumerable:!0,get:function(){return Yie.create}});Object.defineProperty(yr,\"ref\",{enumerable:!0,get:function(){return GYe.create}});Object.defineProperty(yr,\"lazy\",{enumerable:!0,get:function(){return YYe.create}});Object.defineProperty(yr,\"ValidationError\",{enumerable:!0,get:function(){return jYe.default}});Object.defineProperty(yr,\"reach\",{enumerable:!0,get:function(){return qYe.default}});Object.defineProperty(yr,\"isSchema\",{enumerable:!0,get:function(){return jie.default}});Object.defineProperty(yr,\"setLocale\",{enumerable:!0,get:function(){return JYe.default}});Object.defineProperty(yr,\"BaseSchema\",{enumerable:!0,get:function(){return WYe.default}});var Mie=nu(Ire()),JL=nu(bre()),Uie=nu(xre()),Kie=nu(kre()),Hie=nu(Lre()),Gie=nu(Fie()),Yie=nu(Lie()),GYe=tu(),YYe=Tie(),jYe=Fm(_c()),qYe=Fm(FL()),jie=Fm(xh()),JYe=Fm(Oie()),WYe=Fm(sA());function Fm(r){return r&&r.__esModule?r:{default:r}}function qie(){if(typeof WeakMap!=\"function\")return null;var r=new WeakMap;return qie=function(){return r},r}function nu(r){if(r&&r.__esModule)return r;if(r===null||typeof r!=\"object\"&&typeof r!=\"function\")return{default:r};var e=qie();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function zYe(r,e,t){if(!r||!(0,jie.default)(r.prototype))throw new TypeError(\"You must provide a yup schema constructor function\");if(typeof e!=\"string\")throw new TypeError(\"A Method name must be provided\");if(typeof t!=\"function\")throw new TypeError(\"Method function must be provided\");r.prototype[e]=t}});var Xie=w((Cgt,Lm)=>{\"use strict\";var ZYe=process.env.TERM_PROGRAM===\"Hyper\",_Ye=process.platform===\"win32\",Wie=process.platform===\"linux\",zL={ballotDisabled:\"\\u2612\",ballotOff:\"\\u2610\",ballotOn:\"\\u2611\",bullet:\"\\u2022\",bulletWhite:\"\\u25E6\",fullBlock:\"\\u2588\",heart:\"\\u2764\",identicalTo:\"\\u2261\",line:\"\\u2500\",mark:\"\\u203B\",middot:\"\\xB7\",minus:\"\\uFF0D\",multiplication:\"\\xD7\",obelus:\"\\xF7\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",pencilUpRight:\"\\u2710\",percent:\"%\",pilcrow2:\"\\u2761\",pilcrow:\"\\xB6\",plusMinus:\"\\xB1\",section:\"\\xA7\",starsOff:\"\\u2606\",starsOn:\"\\u2605\",upDownArrow:\"\\u2195\"},zie=Object.assign({},zL,{check:\"\\u221A\",cross:\"\\xD7\",ellipsisLarge:\"...\",ellipsis:\"...\",info:\"i\",question:\"?\",questionSmall:\"?\",pointer:\">\",pointerSmall:\"\\xBB\",radioOff:\"( )\",radioOn:\"(*)\",warning:\"\\u203C\"}),Vie=Object.assign({},zL,{ballotCross:\"\\u2718\",check:\"\\u2714\",cross:\"\\u2716\",ellipsisLarge:\"\\u22EF\",ellipsis:\"\\u2026\",info:\"\\u2139\",question:\"?\",questionFull:\"\\uFF1F\",questionSmall:\"\\uFE56\",pointer:Wie?\"\\u25B8\":\"\\u276F\",pointerSmall:Wie?\"\\u2023\":\"\\u203A\",radioOff:\"\\u25EF\",radioOn:\"\\u25C9\",warning:\"\\u26A0\"});Lm.exports=_Ye&&!ZYe?zie:Vie;Reflect.defineProperty(Lm.exports,\"common\",{enumerable:!1,value:zL});Reflect.defineProperty(Lm.exports,\"windows\",{enumerable:!1,value:zie});Reflect.defineProperty(Lm.exports,\"other\",{enumerable:!1,value:Vie})});var uo=w((mgt,VL)=>{\"use strict\";var $Ye=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r),eje=/[\\u001b\\u009b][[\\]#;?()]*(?:(?:(?:[^\\W_]*;?[^\\W_]*)\\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Zie=()=>{let r={enabled:!0,visible:!0,styles:{},keys:{}};\"FORCE_COLOR\"in process.env&&(r.enabled=process.env.FORCE_COLOR!==\"0\");let e=s=>{let o=s.open=`\\x1B[${s.codes[0]}m`,a=s.close=`\\x1B[${s.codes[1]}m`,l=s.regex=new RegExp(`\\\\u001b\\\\[${s.codes[1]}m`,\"g\");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\\r*\\n/g,`${a}$&${o}`):g},s},t=(s,o,a)=>typeof s==\"function\"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===\"\"||s==null)return\"\";if(r.enabled===!1)return s;if(r.visible===!1)return\"\";let a=\"\"+s,l=a.includes(`\n`),c=o.length;for(c>0&&o.includes(\"unstyle\")&&(o=[...new Set([\"unstyle\",...o])].reverse());c-- >0;)a=t(r.styles[o[c]],a,l);return a},n=(s,o,a)=>{r.styles[s]=e({name:s,codes:o}),(r.keys[a]||(r.keys[a]=[])).push(s),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(c){r.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,r),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n(\"reset\",[0,0],\"modifier\"),n(\"bold\",[1,22],\"modifier\"),n(\"dim\",[2,22],\"modifier\"),n(\"italic\",[3,23],\"modifier\"),n(\"underline\",[4,24],\"modifier\"),n(\"inverse\",[7,27],\"modifier\"),n(\"hidden\",[8,28],\"modifier\"),n(\"strikethrough\",[9,29],\"modifier\"),n(\"black\",[30,39],\"color\"),n(\"red\",[31,39],\"color\"),n(\"green\",[32,39],\"color\"),n(\"yellow\",[33,39],\"color\"),n(\"blue\",[34,39],\"color\"),n(\"magenta\",[35,39],\"color\"),n(\"cyan\",[36,39],\"color\"),n(\"white\",[37,39],\"color\"),n(\"gray\",[90,39],\"color\"),n(\"grey\",[90,39],\"color\"),n(\"bgBlack\",[40,49],\"bg\"),n(\"bgRed\",[41,49],\"bg\"),n(\"bgGreen\",[42,49],\"bg\"),n(\"bgYellow\",[43,49],\"bg\"),n(\"bgBlue\",[44,49],\"bg\"),n(\"bgMagenta\",[45,49],\"bg\"),n(\"bgCyan\",[46,49],\"bg\"),n(\"bgWhite\",[47,49],\"bg\"),n(\"blackBright\",[90,39],\"bright\"),n(\"redBright\",[91,39],\"bright\"),n(\"greenBright\",[92,39],\"bright\"),n(\"yellowBright\",[93,39],\"bright\"),n(\"blueBright\",[94,39],\"bright\"),n(\"magentaBright\",[95,39],\"bright\"),n(\"cyanBright\",[96,39],\"bright\"),n(\"whiteBright\",[97,39],\"bright\"),n(\"bgBlackBright\",[100,49],\"bgBright\"),n(\"bgRedBright\",[101,49],\"bgBright\"),n(\"bgGreenBright\",[102,49],\"bgBright\"),n(\"bgYellowBright\",[103,49],\"bgBright\"),n(\"bgBlueBright\",[104,49],\"bgBright\"),n(\"bgMagentaBright\",[105,49],\"bgBright\"),n(\"bgCyanBright\",[106,49],\"bgBright\"),n(\"bgWhiteBright\",[107,49],\"bgBright\"),r.ansiRegex=eje,r.hasColor=r.hasAnsi=s=>(r.ansiRegex.lastIndex=0,typeof s==\"string\"&&s!==\"\"&&r.ansiRegex.test(s)),r.alias=(s,o)=>{let a=typeof o==\"string\"?r[o]:o;if(typeof a!=\"function\")throw new TypeError(\"Expected alias to be the name of an existing color (string) or a function\");a.stack||(Reflect.defineProperty(a,\"name\",{value:s}),r.styles[s]=a,a.stack=[s]),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(l){r.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,r),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},r.theme=s=>{if(!$Ye(s))throw new TypeError(\"Expected theme to be an object\");for(let o of Object.keys(s))r.alias(o,s[o]);return r},r.alias(\"unstyle\",s=>typeof s==\"string\"&&s!==\"\"?(r.ansiRegex.lastIndex=0,s.replace(r.ansiRegex,\"\")):\"\"),r.alias(\"noop\",s=>s),r.none=r.clear=r.noop,r.stripColor=r.unstyle,r.symbols=Xie(),r.define=n,r};VL.exports=Zie();VL.exports.create=Zie});var ji=w(Lt=>{\"use strict\";var tje=Object.prototype.toString,Ns=uo(),_ie=!1,XL=[],$ie={yellow:\"blue\",cyan:\"red\",green:\"magenta\",black:\"white\",blue:\"yellow\",red:\"cyan\",magenta:\"green\",white:\"black\"};Lt.longest=(r,e)=>r.reduce((t,i)=>Math.max(t,e?i[e].length:i.length),0);Lt.hasColor=r=>!!r&&Ns.hasColor(r);var QQ=Lt.isObject=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r);Lt.nativeType=r=>tje.call(r).slice(8,-1).toLowerCase().replace(/\\s/g,\"\");Lt.isAsyncFn=r=>Lt.nativeType(r)===\"asyncfunction\";Lt.isPrimitive=r=>r!=null&&typeof r!=\"object\"&&typeof r!=\"function\";Lt.resolve=(r,e,...t)=>typeof e==\"function\"?e.call(r,...t):e;Lt.scrollDown=(r=[])=>[...r.slice(1),r[0]];Lt.scrollUp=(r=[])=>[r.pop(),...r];Lt.reorder=(r=[])=>{let e=r.slice();return e.sort((t,i)=>t.index>i.index?1:t.index<i.index?-1:0),e};Lt.swap=(r,e,t)=>{let i=r.length,n=t===i?0:t<0?i-1:t,s=r[e];r[e]=r[n],r[n]=s};Lt.width=(r,e=80)=>{let t=r&&r.columns?r.columns:e;return r&&typeof r.getWindowSize==\"function\"&&(t=r.getWindowSize()[0]),process.platform===\"win32\"?t-1:t};Lt.height=(r,e=20)=>{let t=r&&r.rows?r.rows:e;return r&&typeof r.getWindowSize==\"function\"&&(t=r.getWindowSize()[1]),t};Lt.wordWrap=(r,e={})=>{if(!r)return r;typeof e==\"number\"&&(e={width:e});let{indent:t=\"\",newline:i=`\n`+t,width:n=80}=e,s=(i+t).match(/[^\\S\\n]/g)||[];n-=s.length;let o=`.{1,${n}}([\\\\s\\\\u200B]+|$)|[^\\\\s\\\\u200B]+?([\\\\s\\\\u200B]+|$)`,a=r.trim(),l=new RegExp(o,\"g\"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\\n$/,\"\")),e.padEnd&&(c=c.map(u=>u.padEnd(n,\" \"))),e.padStart&&(c=c.map(u=>u.padStart(n,\" \"))),t+c.join(i)};Lt.unmute=r=>{let e=r.stack.find(i=>Ns.keys.color.includes(i));return e?Ns[e]:r.stack.find(i=>i.slice(2)===\"bg\")?Ns[e.slice(2)]:i=>i};Lt.pascal=r=>r?r[0].toUpperCase()+r.slice(1):\"\";Lt.inverse=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ns.keys.color.includes(i));if(e){let i=Ns[\"bg\"+Lt.pascal(e)];return i?i.black:r}let t=r.stack.find(i=>i.slice(0,2)===\"bg\");return t?Ns[t.slice(2).toLowerCase()]||r:Ns.none};Lt.complement=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ns.keys.color.includes(i)),t=r.stack.find(i=>i.slice(0,2)===\"bg\");if(e&&!t)return Ns[$ie[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=$ie[i];return n&&Ns[\"bg\"+Lt.pascal(n)]||r}return Ns.none};Lt.meridiem=r=>{let e=r.getHours(),t=r.getMinutes(),i=e>=12?\"pm\":\"am\";e=e%12;let n=e===0?12:e,s=t<10?\"0\"+t:t;return n+\":\"+s+\" \"+i};Lt.set=(r={},e=\"\",t)=>e.split(\".\").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:t;return!Lt.isObject(a)&&s<o.length-1&&(a={}),i[n]=a},r);Lt.get=(r={},e=\"\",t)=>{let i=r[e]==null?e.split(\".\").reduce((n,s)=>n&&n[s],r):r[e];return i==null?t:i};Lt.mixin=(r,e)=>{if(!QQ(r))return e;if(!QQ(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty(\"value\"))if(r.hasOwnProperty(t)&&QQ(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);QQ(n.value)?r[t]=Lt.merge({},r[t],e[t]):Reflect.defineProperty(r,t,i)}else Reflect.defineProperty(r,t,i);else Reflect.defineProperty(r,t,i)}return r};Lt.merge=(...r)=>{let e={};for(let t of r)Lt.mixin(e,t);return e};Lt.mixinEmitter=(r,e)=>{let t=e.constructor.prototype;for(let i of Object.keys(t)){let n=t[i];typeof n==\"function\"?Lt.define(r,i,n.bind(e)):Lt.define(r,i,n)}};Lt.onExit=r=>{let e=(t,i)=>{_ie||(_ie=!0,XL.forEach(n=>n()),t===!0&&process.exit(128+i))};XL.length===0&&(process.once(\"SIGTERM\",e.bind(null,!0,15)),process.once(\"SIGINT\",e.bind(null,!0,2)),process.once(\"exit\",e)),XL.push(r)};Lt.define=(r,e,t)=>{Reflect.defineProperty(r,e,{value:t})};Lt.defineExport=(r,e,t)=>{let i;Reflect.defineProperty(r,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():t()}})}});var ene=w(Gh=>{\"use strict\";Gh.ctrl={a:\"first\",b:\"backward\",c:\"cancel\",d:\"deleteForward\",e:\"last\",f:\"forward\",g:\"reset\",i:\"tab\",k:\"cutForward\",l:\"reset\",n:\"newItem\",m:\"cancel\",j:\"submit\",p:\"search\",r:\"remove\",s:\"save\",u:\"undo\",w:\"cutLeft\",x:\"toggleCursor\",v:\"paste\"};Gh.shift={up:\"shiftUp\",down:\"shiftDown\",left:\"shiftLeft\",right:\"shiftRight\",tab:\"prev\"};Gh.fn={up:\"pageUp\",down:\"pageDown\",left:\"pageLeft\",right:\"pageRight\",delete:\"deleteForward\"};Gh.option={b:\"backward\",f:\"forward\",d:\"cutRight\",left:\"cutLeft\",up:\"altUp\",down:\"altDown\"};Gh.keys={pageup:\"pageUp\",pagedown:\"pageDown\",home:\"home\",end:\"end\",cancel:\"cancel\",delete:\"deleteForward\",backspace:\"delete\",down:\"down\",enter:\"submit\",escape:\"cancel\",left:\"left\",space:\"space\",number:\"number\",return:\"submit\",right:\"right\",tab:\"next\",up:\"up\"}});var ine=w((ygt,rne)=>{\"use strict\";var tne=J(\"readline\"),rje=ene(),ije=/^(?:\\x1b)([a-zA-Z0-9])$/,nje=/^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/,sje={OP:\"f1\",OQ:\"f2\",OR:\"f3\",OS:\"f4\",\"[11~\":\"f1\",\"[12~\":\"f2\",\"[13~\":\"f3\",\"[14~\":\"f4\",\"[[A\":\"f1\",\"[[B\":\"f2\",\"[[C\":\"f3\",\"[[D\":\"f4\",\"[[E\":\"f5\",\"[15~\":\"f5\",\"[17~\":\"f6\",\"[18~\":\"f7\",\"[19~\":\"f8\",\"[20~\":\"f9\",\"[21~\":\"f10\",\"[23~\":\"f11\",\"[24~\":\"f12\",\"[A\":\"up\",\"[B\":\"down\",\"[C\":\"right\",\"[D\":\"left\",\"[E\":\"clear\",\"[F\":\"end\",\"[H\":\"home\",OA:\"up\",OB:\"down\",OC:\"right\",OD:\"left\",OE:\"clear\",OF:\"end\",OH:\"home\",\"[1~\":\"home\",\"[2~\":\"insert\",\"[3~\":\"delete\",\"[4~\":\"end\",\"[5~\":\"pageup\",\"[6~\":\"pagedown\",\"[[5~\":\"pageup\",\"[[6~\":\"pagedown\",\"[7~\":\"home\",\"[8~\":\"end\",\"[a\":\"up\",\"[b\":\"down\",\"[c\":\"right\",\"[d\":\"left\",\"[e\":\"clear\",\"[2$\":\"insert\",\"[3$\":\"delete\",\"[5$\":\"pageup\",\"[6$\":\"pagedown\",\"[7$\":\"home\",\"[8$\":\"end\",Oa:\"up\",Ob:\"down\",Oc:\"right\",Od:\"left\",Oe:\"clear\",\"[2^\":\"insert\",\"[3^\":\"delete\",\"[5^\":\"pageup\",\"[6^\":\"pagedown\",\"[7^\":\"home\",\"[8^\":\"end\",\"[Z\":\"tab\"};function oje(r){return[\"[a\",\"[b\",\"[c\",\"[d\",\"[e\",\"[2$\",\"[3$\",\"[5$\",\"[6$\",\"[7$\",\"[8$\",\"[Z\"].includes(r)}function aje(r){return[\"Oa\",\"Ob\",\"Oc\",\"Od\",\"Oe\",\"[2^\",\"[3^\",\"[5^\",\"[6^\",\"[7^\",\"[8^\"].includes(r)}var bQ=(r=\"\",e={})=>{let t,i={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:r,raw:r,...e};if(Buffer.isBuffer(r)?r[0]>127&&r[1]===void 0?(r[0]-=128,r=\"\\x1B\"+String(r)):r=String(r):r!==void 0&&typeof r!=\"string\"?r=String(r):r||(r=i.sequence||\"\"),i.sequence=i.sequence||r||i.name,r===\"\\r\")i.raw=void 0,i.name=\"return\";else if(r===`\n`)i.name=\"enter\";else if(r===\"\t\")i.name=\"tab\";else if(r===\"\\b\"||r===\"\\x7F\"||r===\"\\x1B\\x7F\"||r===\"\\x1B\\b\")i.name=\"backspace\",i.meta=r.charAt(0)===\"\\x1B\";else if(r===\"\\x1B\"||r===\"\\x1B\\x1B\")i.name=\"escape\",i.meta=r.length===2;else if(r===\" \"||r===\"\\x1B \")i.name=\"space\",i.meta=r.length===2;else if(r<=\"\u001a\")i.name=String.fromCharCode(r.charCodeAt(0)+\"a\".charCodeAt(0)-1),i.ctrl=!0;else if(r.length===1&&r>=\"0\"&&r<=\"9\")i.name=\"number\";else if(r.length===1&&r>=\"a\"&&r<=\"z\")i.name=r;else if(r.length===1&&r>=\"A\"&&r<=\"Z\")i.name=r.toLowerCase(),i.shift=!0;else if(t=ije.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=nje.exec(r)){let n=[...r];n[0]===\"\\x1B\"&&n[1]===\"\\x1B\"&&(i.option=!0);let s=[t[1],t[2],t[4],t[6]].filter(Boolean).join(\"\"),o=(t[3]||t[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=sje[s],i.shift=oje(s)||i.shift,i.ctrl=aje(s)||i.ctrl}return i};bQ.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error(\"Invalid stream passed\");let i=tne.createInterface({terminal:!0,input:t});tne.emitKeypressEvents(t,i);let n=(a,l)=>e(a,bQ(a,l),i),s=t.isRaw;return t.isTTY&&t.setRawMode(!0),t.on(\"keypress\",n),i.resume(),()=>{t.isTTY&&t.setRawMode(s),t.removeListener(\"keypress\",n),i.pause(),i.close()}};bQ.action=(r,e,t)=>{let i={...rje,...t};return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};rne.exports=bQ});var sne=w((wgt,nne)=>{\"use strict\";nne.exports=r=>{r.timers=r.timers||{};let e=r.options.timers;if(!!e)for(let t of Object.keys(e)){let i=e[t];typeof i==\"number\"&&(i={interval:i}),Aje(r,t,i)}};function Aje(r,e,t={}){let i=r.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=t.interval||120;i.frames=t.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,r.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,\"interval\",{value:s}),r.once(\"close\",()=>i.stop()),i.stop}});var ane=w((Bgt,one)=>{\"use strict\";var{define:lje,width:cje}=ji(),ZL=class{constructor(e){let t=e.options;lje(this,\"_prompt\",e),this.type=e.type,this.name=e.name,this.message=\"\",this.header=\"\",this.footer=\"\",this.error=\"\",this.hint=\"\",this.input=\"\",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt=\"\",this.buffer=\"\",this.width=cje(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t==\"function\"?t:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading==\"boolean\"?this._loading:this.loadingChoices?\"choices\":!1}get status(){return this.cancelled?\"cancelled\":this.submitted?\"submitted\":\"pending\"}};one.exports=ZL});var lne=w((Qgt,Ane)=>{\"use strict\";var _L=ji(),Di=uo(),$L={default:Di.noop,noop:Di.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||_L.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||_L.complement(this.primary)},primary:Di.cyan,success:Di.green,danger:Di.magenta,strong:Di.bold,warning:Di.yellow,muted:Di.dim,disabled:Di.gray,dark:Di.dim.gray,underline:Di.underline,set info(r){this._info=r},get info(){return this._info||this.primary},set em(r){this._em=r},get em(){return this._em||this.primary.underline},set heading(r){this._heading=r},get heading(){return this._heading||this.muted.underline},set pending(r){this._pending=r},get pending(){return this._pending||this.primary},set submitted(r){this._submitted=r},get submitted(){return this._submitted||this.success},set cancelled(r){this._cancelled=r},get cancelled(){return this._cancelled||this.danger},set typing(r){this._typing=r},get typing(){return this._typing||this.dim},set placeholder(r){this._placeholder=r},get placeholder(){return this._placeholder||this.primary.dim},set highlight(r){this._highlight=r},get highlight(){return this._highlight||this.inverse}};$L.merge=(r={})=>{r.styles&&typeof r.styles.enabled==\"boolean\"&&(Di.enabled=r.styles.enabled),r.styles&&typeof r.styles.visible==\"boolean\"&&(Di.visible=r.styles.visible);let e=_L.merge({},$L,r.styles);delete e.merge;for(let t of Object.keys(Di))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Di[t]});for(let t of Object.keys(Di.styles))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Di[t]});return e};Ane.exports=$L});var une=w((bgt,cne)=>{\"use strict\";var eT=process.platform===\"win32\",aA=uo(),uje=ji(),tT={...aA.symbols,upDownDoubleArrow:\"\\u21D5\",upDownDoubleArrow2:\"\\u2B0D\",upDownArrow:\"\\u2195\",asterisk:\"*\",asterism:\"\\u2042\",bulletWhite:\"\\u25E6\",electricArrow:\"\\u2301\",ellipsisLarge:\"\\u22EF\",ellipsisSmall:\"\\u2026\",fullBlock:\"\\u2588\",identicalTo:\"\\u2261\",indicator:aA.symbols.check,leftAngle:\"\\u2039\",mark:\"\\u203B\",minus:\"\\u2212\",multiplication:\"\\xD7\",obelus:\"\\xF7\",percent:\"%\",pilcrow:\"\\xB6\",pilcrow2:\"\\u2761\",pencilUpRight:\"\\u2710\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",plus:\"+\",plusMinus:\"\\xB1\",pointRight:\"\\u261E\",rightAngle:\"\\u203A\",section:\"\\xA7\",hexagon:{off:\"\\u2B21\",on:\"\\u2B22\",disabled:\"\\u2B22\"},ballot:{on:\"\\u2611\",off:\"\\u2610\",disabled:\"\\u2612\"},stars:{on:\"\\u2605\",off:\"\\u2606\",disabled:\"\\u2606\"},folder:{on:\"\\u25BC\",off:\"\\u25B6\",disabled:\"\\u25B6\"},prefix:{pending:aA.symbols.question,submitted:aA.symbols.check,cancelled:aA.symbols.cross},separator:{pending:aA.symbols.pointerSmall,submitted:aA.symbols.middot,cancelled:aA.symbols.middot},radio:{off:eT?\"( )\":\"\\u25EF\",on:eT?\"(*)\":\"\\u25C9\",disabled:eT?\"(|)\":\"\\u24BE\"},numbers:[\"\\u24EA\",\"\\u2460\",\"\\u2461\",\"\\u2462\",\"\\u2463\",\"\\u2464\",\"\\u2465\",\"\\u2466\",\"\\u2467\",\"\\u2468\",\"\\u2469\",\"\\u246A\",\"\\u246B\",\"\\u246C\",\"\\u246D\",\"\\u246E\",\"\\u246F\",\"\\u2470\",\"\\u2471\",\"\\u2472\",\"\\u2473\",\"\\u3251\",\"\\u3252\",\"\\u3253\",\"\\u3254\",\"\\u3255\",\"\\u3256\",\"\\u3257\",\"\\u3258\",\"\\u3259\",\"\\u325A\",\"\\u325B\",\"\\u325C\",\"\\u325D\",\"\\u325E\",\"\\u325F\",\"\\u32B1\",\"\\u32B2\",\"\\u32B3\",\"\\u32B4\",\"\\u32B5\",\"\\u32B6\",\"\\u32B7\",\"\\u32B8\",\"\\u32B9\",\"\\u32BA\",\"\\u32BB\",\"\\u32BC\",\"\\u32BD\",\"\\u32BE\",\"\\u32BF\"]};tT.merge=r=>{let e=uje.merge({},aA.symbols,tT,r.symbols);return delete e.merge,e};cne.exports=tT});var fne=w((Sgt,gne)=>{\"use strict\";var gje=lne(),fje=une(),hje=ji();gne.exports=r=>{r.options=hje.merge({},r.options.theme,r.options),r.symbols=fje.merge(r.options),r.styles=gje.merge(r.options)}});var mne=w((dne,Cne)=>{\"use strict\";var hne=process.env.TERM_PROGRAM===\"Apple_Terminal\",pje=uo(),rT=ji(),go=Cne.exports=dne,Dr=\"\\x1B[\",pne=\"\\x07\",iT=!1,pl=go.code={bell:pne,beep:pne,beginning:`${Dr}G`,down:`${Dr}J`,esc:Dr,getPosition:`${Dr}6n`,hide:`${Dr}?25l`,line:`${Dr}2K`,lineEnd:`${Dr}K`,lineStart:`${Dr}1K`,restorePosition:Dr+(hne?\"8\":\"u\"),savePosition:Dr+(hne?\"7\":\"s\"),screen:`${Dr}2J`,show:`${Dr}?25h`,up:`${Dr}1J`},su=go.cursor={get hidden(){return iT},hide(){return iT=!0,pl.hide},show(){return iT=!1,pl.show},forward:(r=1)=>`${Dr}${r}C`,backward:(r=1)=>`${Dr}${r}D`,nextLine:(r=1)=>`${Dr}E`.repeat(r),prevLine:(r=1)=>`${Dr}F`.repeat(r),up:(r=1)=>r?`${Dr}${r}A`:\"\",down:(r=1)=>r?`${Dr}${r}B`:\"\",right:(r=1)=>r?`${Dr}${r}C`:\"\",left:(r=1)=>r?`${Dr}${r}D`:\"\",to(r,e){return e?`${Dr}${e+1};${r+1}H`:`${Dr}${r+1}G`},move(r=0,e=0){let t=\"\";return t+=r<0?su.left(-r):r>0?su.right(r):\"\",t+=e<0?su.up(-e):e>0?su.down(e):\"\",t},restore(r={}){let{after:e,cursor:t,initial:i,input:n,prompt:s,size:o,value:a}=r;if(i=rT.isPrimitive(i)?String(i):\"\",n=rT.isPrimitive(n)?String(n):\"\",a=rT.isPrimitive(a)?String(a):\"\",o){let l=go.cursor.up(o)+go.cursor.to(s.length),c=n.length-t;return c>0&&(l+=go.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+t;return e&&(l-=e.length),n===\"\"&&i&&!s.includes(i)&&(l+=i.length),go.cursor.move(l)}}},nT=go.erase={screen:pl.screen,up:pl.up,down:pl.down,line:pl.line,lineEnd:pl.lineEnd,lineStart:pl.lineStart,lines(r){let e=\"\";for(let t=0;t<r;t++)e+=go.erase.line+(t<r-1?go.cursor.up(1):\"\");return r&&(e+=go.code.beginning),e}};go.clear=(r=\"\",e=process.stdout.columns)=>{if(!e)return nT.line+su.to(0);let t=s=>[...pje.unstyle(s)].length,i=r.split(/\\r?\\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(t(s)-1,0)/e);return(nT.line+su.prevLine()).repeat(n-1)+nT.line+su.to(0)}});var Yh=w((vgt,Ine)=>{\"use strict\";var dje=J(\"events\"),Ene=uo(),sT=ine(),Cje=sne(),mje=ane(),Eje=fne(),Dn=ji(),ou=mne(),Tm=class extends dje{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,Eje(this),Cje(this),this.state=new mje(this),this.initial=[e.initial,e.default].find(t=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=yje(this.options.margin),this.setMaxListeners(0),Ije(this)}async keypress(e,t={}){this.keypressed=!0;let i=sT.action(e,sT(e,t),this.options.actions);this.state.keypress=i,this.emit(\"keypress\",e,i),this.emit(\"state\",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n==\"function\")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit(\"alert\"):this.stdout.write(ou.code.beep)}cursorHide(){this.stdout.write(ou.cursor.hide()),Dn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(ou.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer=\"\",!(!t&&!e||this.options.show===!1)&&this.stdout.write(ou.cursor.down(e)+ou.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:i}=this.sections(),{cursor:n,initial:s=\"\",input:o=\"\",value:a=\"\"}=this,l=this.state.size=i.length,c={after:t,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=ou.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:t,prompt:i}=this.state;i=Ene.unstyle(i);let n=Ene.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(`\n`),c=l[0],u=l[l.length-1],f=(i+(t?\" \"+t:\"\")).length,h=f<c.length?c.slice(f+1):\"\";return{header:o,prompt:c,after:h,rest:l.slice(1),last:u}}async submit(){this.state.submitted=!0,this.state.validating=!0,this.options.onSubmit&&await this.options.onSubmit.call(this,this.name,this.value,this);let e=this.state.error||await this.validate(this.value,this.state);if(e!==!0){let t=`\n`+this.symbols.pointer+\" \";typeof e==\"string\"?t+=e.trim():t+=\"Invalid input\",this.state.error=`\n`+this.styles.danger(t),this.state.submitted=!1,await this.render(),await this.alert(),this.state.validating=!1,this.state.error=void 0;return}this.state.validating=!1,await this.render(),await this.close(),this.value=await this.result(this.value),this.emit(\"submit\",this.value)}async cancel(e){this.state.cancelled=this.state.submitted=!0,await this.render(),await this.close(),typeof this.options.onCancel==\"function\"&&await this.options.onCancel.call(this,this.name,this.value,this),this.emit(\"cancel\",await this.error(e))}async close(){this.state.closed=!0;try{let e=this.sections(),t=Math.ceil(e.prompt.length/this.width);e.rest&&this.write(ou.cursor.down(e.rest.length)),this.write(`\n`.repeat(t))}catch{}this.emit(\"close\")}start(){!this.stop&&this.options.show!==!1&&(this.stop=sT.listen(this,this.keypress.bind(this)),this.once(\"close\",this.stop))}async skip(){return this.skipped=this.options.skip===!0,typeof this.options.skip==\"function\"&&(this.skipped=await this.options.skip.call(this,this.name,this.value)),this.skipped}async initialize(){let{format:e,options:t,result:i}=this;if(this.format=()=>e.call(this,this.value),this.result=()=>i.call(this,this.value),typeof t.initial==\"function\"&&(this.initial=await t.initial.call(this,this)),typeof t.onRun==\"function\"&&await t.onRun.call(this,this),typeof t.onSubmit==\"function\"){let n=t.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error(\"expected prompt to have a custom render method\")}run(){return new Promise(async(e,t)=>{if(this.once(\"submit\",e),this.once(\"cancel\",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit(\"run\")})}async element(e,t,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=t&&t[e]!=null?t[e]:await c;if(u===\"\")return u;let g=await this.resolve(u,s,t,i);return!g&&t&&t[e]?this.resolve(c,s,t,i):g}async prefix(){let e=await this.element(\"prefix\")||this.symbols,t=this.timers&&this.timers.prefix,i=this.state;return i.timer=t,Dn.isObject(e)&&(e=e[i.status]||e.pending),Dn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element(\"message\");return Dn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element(\"separator\")||this.symbols,t=this.timers&&this.timers.separator,i=this.state;i.timer=t;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Dn.isObject(s)&&(s=s[i.status]||s.pending),Dn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,t){let i=await this.element(\"pointer\",e,t);if(typeof i==\"string\"&&Dn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===t,o=s?n.primary:c=>c,a=await this.resolve(i[s?\"on\":\"off\"]||i,this.state),l=Dn.hasColor(a)?a:o(a);return s?l:\" \".repeat(a.length)}}async indicator(e,t){let i=await this.element(\"indicator\",e,t);if(typeof i==\"string\"&&Dn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?\"on\":\"off\"]||i;return Dn.hasColor(a)?a:o(a)}return\"\"}body(){return null}footer(){if(this.state.status===\"pending\")return this.element(\"footer\")}header(){if(this.state.status===\"pending\")return this.element(\"header\")}async hint(){if(this.state.status===\"pending\"&&!this.isValue(this.state.input)){let e=await this.element(\"hint\");return Dn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?\"\":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==\"\"}resolve(e,...t){return Dn.resolve(this,e,...t)}get base(){return Tm.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Dn.height(this.stdout,25)}get width(){return this.options.columns||Dn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,i=[t,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function Ije(r){let e=n=>r[n]===void 0||typeof r[n]==\"function\",t=[\"actions\",\"choices\",\"initial\",\"margin\",\"roles\",\"styles\",\"symbols\",\"theme\",\"timers\",\"value\"],i=[\"body\",\"footer\",\"error\",\"header\",\"hint\",\"indicator\",\"message\",\"prefix\",\"separator\",\"skip\"];for(let n of Object.keys(r.options)){if(t.includes(n)||/^on[A-Z]/.test(n))continue;let s=r.options[n];typeof s==\"function\"&&e(n)?i.includes(n)||(r[n]=s.bind(r)):typeof r[n]!=\"function\"&&(r[n]=s)}}function yje(r){typeof r==\"number\"&&(r=[r,r,r,r]);let e=[].concat(r||[]),t=n=>n%2===0?`\n`:\" \",i=[];for(let n=0;n<4;n++){let s=t(n);e[n]?i.push(s.repeat(e[n])):i.push(\"\")}return i}Ine.exports=Tm});var Bne=w((xgt,wne)=>{\"use strict\";var wje=ji(),yne={default(r,e){return e},checkbox(r,e){throw new Error(\"checkbox role is not implemented yet\")},editable(r,e){throw new Error(\"editable role is not implemented yet\")},expandable(r,e){throw new Error(\"expandable role is not implemented yet\")},heading(r,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(t=>t!=null),e.message=e.message||\"\",e},input(r,e){throw new Error(\"input role is not implemented yet\")},option(r,e){return yne.default(r,e)},radio(r,e){throw new Error(\"radio role is not implemented yet\")},separator(r,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(t=>t!=null),e.message=e.message||r.symbols.line.repeat(5),e},spacer(r,e){return e}};wne.exports=(r,e={})=>{let t=wje.merge({},yne,e.roles);return t[r]||t.default}});var Om=w((Pgt,Sne)=>{\"use strict\";var Bje=uo(),Qje=Yh(),bje=Bne(),SQ=ji(),{reorder:oT,scrollUp:Sje,scrollDown:vje,isObject:Qne,swap:xje}=SQ,aT=class extends Qje{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=\"\"}async initialize(){typeof this.options.initial==\"function\"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!=\"function\"&&this.selectable.length===0)throw new Error(\"At least one choice must be selectable\");Qne(t)&&(t=Object.keys(t)),Array.isArray(t)?(i!=null&&(this.index=this.findIndex(i)),t.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(t=i),typeof t==\"string\"&&(t=this.findIndex(t)),typeof t==\"number\"&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o==\"function\"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l<o.length;l++){let c=o[l]=await this.toChoice(o[l],n++,a);i.push(c),c.choices&&await s(c.choices,c)}return i};return s(e,t).then(o=>(this.state.loadingChoices=!1,o))}async toChoice(e,t,i){if(typeof e==\"function\"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e==\"string\"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=bje(e.role,this.options)(this,e),typeof e.disabled==\"string\"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint=\"(disabled)\"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||\"\",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input=\"\",e.index=t,e.cursor=0,SQ.define(e,\"parent\",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+\"  \":e.indent||\"\"),e.path=i?i.path+\".\"+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,Bje.unstyle(e.message).length));let o={...e};return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial==\"function\"&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit(\"choice\",e,t,this),typeof e.onChoice==\"function\"&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,i){let n=await this.toChoice(e,t,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,t,i){let n={name:\"New choice name?\",editable:!0,newChoice:!0,...e},s=await this.addChoice(n,t,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input=\"\",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?\"  \".repeat(e.level-1):\"\":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return typeof t!=\"boolean\"&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelected<this.choices.length)return this.alert();let e=this.selectable.every(t=>t.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(t=>!!t.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof t!=\"boolean\"&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(n=>this.toggle(n,t));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return bne(this,this.choices),this.emit(\"toggle\",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=oT(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=t(s)),this.num=\"\",i(l)};if(s===\"0\"||s.length===1&&Number(s+\"0\")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=oT(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=oT(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>t&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===t-1?this.alert():e>t&&i===t-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=Sje(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=vje(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){xje(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&[\"disabled\",\"collapsed\",\"hidden\",\"completing\",\"readonly\"].some(i=>e[i]===!0)?!0:e&&e.role===\"heading\"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(t=>this.isEnabled(t));if(e.choices){let t=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&t.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t=\"value\"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,t),i),{})}filter(e,t){let n=typeof e==\"function\"?e:(a,l)=>[a.name,l].includes(e),o=(this.options.multiple?this.state._choices:this.choices).filter(n);return t?o.map(a=>a[t]):o}find(e,t){if(Qne(e))return t?e[t]:e;let n=typeof e==\"function\"?e:(o,a)=>[o.name,a].includes(e),s=this.choices.find(n);if(s)return t?s[t]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:t,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&t!==!1&&i!==!0&&(s=SQ.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(i=>i.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t==\"string\"||typeof t==\"number\"){let i=this.find(t);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return bne(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:i}=this,n=e.limit||this._limit||t.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!=\"string\"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function bne(r,e){if(e instanceof Promise)return e;if(typeof e==\"function\"){if(SQ.isAsyncFn(e))return e;e=e.call(r,r)}for(let t of e){if(Array.isArray(t.choices)){let i=t.choices.filter(n=>!r.isDisabled(n));t.enabled=i.every(n=>n.enabled===!0)}r.isDisabled(t)===!0&&delete t.enabled}return e}Sne.exports=aT});var dl=w((Dgt,vne)=>{\"use strict\";var Pje=Om(),AT=ji(),lT=class extends Pje{constructor(e){super(e),this.emptyError=this.options.emptyError||\"No items were selected\"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):\"\"}indicator(e,t){return this.multiple?super.indicator(e,t):\"\"}choiceMessage(e,t){let i=this.resolve(e.message,this.state,e,t);return e.role===\"heading\"&&!AT.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,t)}choiceSeparator(){return\":\"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await this.indicator(e,t)+(e.pad||\"\"),o=await this.resolve(e.hint,this.state,e,t);o&&!AT.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,t),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(\" \");return e.role===\"heading\"?c():e.disabled?(AT.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading===\"choices\")return this.styles.warning(\"Loading choices\");if(this.state.submitted)return\"\";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);t.length||t.push(this.styles.danger(\"No matching choices\"));let i=this.margin[0]+t.join(`\n`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(`\n`)}format(){return!this.state.submitted||this.state.cancelled?\"\":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(\", \"):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,i=\"\",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,\"\"].join(\" \"),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=\" \"+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,i,u,g].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};vne.exports=lT});var Pne=w((kgt,xne)=>{\"use strict\";var Dje=dl(),kje=(r,e)=>{let t=r.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(t),o=e(i.slice(s,s+t.length));return s>=0?i.slice(0,s)+o+i.slice(s+t.length):i}},cT=class extends Dje{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:i}=this.state;return this.input=i.slice(0,t)+e+i.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return t[e]===void 0?this.alert():(this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest==\"function\")return this.options.suggest.call(this,e,t);let i=e.toLowerCase();return t.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return\"\"}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(\", \");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!==\"pending\")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=kje(this.input,e),i=this.choices;this.choices=i.map(n=>({...n,message:t(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};xne.exports=cT});var gT=w((Rgt,Dne)=>{\"use strict\";var uT=ji();Dne.exports=(r,e={})=>{r.cursorHide();let{input:t=\"\",initial:i=\"\",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=uT.inverse(r.styles.primary),c=C=>l(r.styles.black(C)),u=t,g=\" \",f=c(g);if(r.blink&&r.blink.off===!0&&(c=C=>C,f=\"\"),s&&n===0&&i===\"\"&&t===\"\")return c(g);if(s&&n===0&&(t===i||t===\"\"))return c(i[0])+a(i.slice(1));i=uT.isPrimitive(i)?`${i}`:\"\",t=uT.isPrimitive(t)?`${t}`:\"\";let h=i&&i.startsWith(t)&&i!==t,p=h?c(i[t.length]):f;if(n!==t.length&&s===!0&&(u=t.slice(0,n)+c(t[n])+t.slice(n+1),p=\"\"),s===!1&&(p=\"\"),h){let C=r.styles.unstyle(u+p);return u+p+a(i.slice(C.length))}return u+p}});var vQ=w((Fgt,kne)=>{\"use strict\";var Rje=uo(),Fje=dl(),Nje=gT(),fT=class extends Fje{constructor(e){super({...e,multiple:!0}),this.type=\"form\",this.initial=this.options.initial,this.align=[this.options.align,\"right\"].find(t=>t!=null),this.emptyError=\"\",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(t=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:i,input:n}=t;return t.value=t.input=n.slice(0,i)+e+n.slice(i),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:i}=e;return e.value=e.input=i.slice(0,t-1)+i.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:i}=e;if(i[t]===void 0)return this.alert();let n=`${i}`.slice(0,t)+`${i}`.slice(t+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:i}=e;return t&&t.startsWith(i)&&i!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input=\"\",e.cursor=0,this.render()):this.alert()}separator(){return\"\"}format(e){return this.state.submitted?\"\":super.format(e)}pointer(){return\"\"}indicator(e){return e.input?\"\\u29BF\":\"\\u2299\"}async choiceSeparator(e,t){let i=await this.resolve(e.separator,this.state,e,t)||\":\";return i?\" \"+this.styles.disabled(i):\"\"}async renderChoice(e,t){await this.onChoice(e,t);let{state:i,styles:n}=this,{cursor:s,initial:o=\"\",name:a,hint:l,input:c=\"\"}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,C=this.index===t,y=e.validate||(()=>!0),B=await this.choiceSeparator(e,t),v=e.message;this.align===\"right\"&&(v=v.padStart(this.longest+1,\" \")),this.align===\"left\"&&(v=v.padEnd(this.longest+1,\" \"));let D=this.values[a]=c||o,L=c?\"success\":\"dark\";await y.call(e,D,this.state)!==!0&&(L=\"danger\");let H=n[L],j=H(await this.indicator(e,t))+(e.pad||\"\"),$=this.indent(e),V=()=>[$,j,v+B,c,p].filter(Boolean).join(\" \");if(i.submitted)return v=Rje.unstyle(v),c=g(c),p=\"\",V();if(e.format)c=await e.format.call(this,c,e,t);else{let W=this.styles.muted;c=Nje(this,{input:c,initial:o,pos:s,showCursor:C,color:W})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,D,e,t)),C&&(v=f(v)),e.error?c+=(c?\" \":\"\")+h(e.error.trim()):e.hint&&(c+=(c?\" \":\"\")+u(e.hint.trim())),V()}async submit(){return this.value=this.values,super.base.submit.call(this)}};kne.exports=fT});var hT=w((Ngt,Fne)=>{\"use strict\";var Lje=vQ(),Tje=()=>{throw new Error(\"expected prompt to have a custom authenticate method\")},Rne=(r=Tje)=>{class e extends Lje{constructor(i){super(i)}async submit(){this.value=await r.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return Rne(i)}}return e};Fne.exports=Rne()});var Tne=w((Lgt,Lne)=>{\"use strict\";var Oje=hT();function Mje(r,e){return r.username===this.options.username&&r.password===this.options.password}var Nne=(r=Mje)=>{let e=[{name:\"username\",message:\"username\"},{name:\"password\",message:\"password\",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class t extends Oje.create(r){constructor(n){super({...n,choices:e})}static create(n){return Nne(n)}}return t};Lne.exports=Nne()});var xQ=w((Tgt,One)=>{\"use strict\";var Uje=Yh(),{isPrimitive:Kje,hasColor:Hje}=ji(),pT=class extends Uje{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:i}=this;return i.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return Kje(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status===\"pending\"){let e=await this.element(\"hint\");return Hje(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(\" \");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=\" \"+g),a+=\" \"+u,this.clear(t),this.write([l,a,f].filter(Boolean).join(`\n`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};One.exports=pT});var Une=w((Ogt,Mne)=>{\"use strict\";var Gje=xQ(),dT=class extends Gje{constructor(e){super(e),this.default=this.options.default||(this.initial?\"(Y/n)\":\"(y/N)\")}};Mne.exports=dT});var Hne=w((Mgt,Kne)=>{\"use strict\";var Yje=dl(),jje=vQ(),jh=jje.prototype,CT=class extends Yje{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,\"left\"].find(t=>t!=null),this.emptyError=\"\",this.values={}}dispatch(e,t){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e===\"a\"||e===\"i\")?super[e]():jh.dispatch.call(this,e,t)}append(e,t){return jh.append.call(this,e,t)}delete(e,t){return jh.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?jh.next.call(this):super.next()}prev(){return this.focused.editable?jh.prev.call(this):super.prev()}async indicator(e,t){let i=e.indicator||\"\",n=e.editable?i:super.indicator(e,t);return await this.resolve(n,this.state,e,t)||\"\"}indent(e){return e.role===\"heading\"?\"\":e.editable?\" \":\"  \"}async renderChoice(e,t){return e.indent=\"\",e.editable?jh.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return\"\"}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!=\"function\"||t.role===\"heading\")continue;let i=t.parent?this.value[t.parent.name]:this.value;if(t.editable?i=t.value===t.name?t.initial||\"\":t.value:this.isDisabled(t)||(i=t.enabled===!0),e=await t.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e==\"string\"?e:\"Invalid Input\"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role===\"heading\"){this.value[e.name]={};continue}e.editable?t[e.name]=e.value===e.name?e.initial||\"\":e.value:this.isDisabled(e)||(t[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Kne.exports=CT});var au=w((Ugt,Gne)=>{\"use strict\";var qje=Yh(),Jje=gT(),{isPrimitive:Wje}=ji(),mT=class extends qje{constructor(e){super(e),this.initial=Wje(this.initial)?String(this.initial):\"\",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let i=this.state.prevKeypress;return this.state.prevKeypress=t,this.options.multiline===!0&&t.name===\"return\"&&(!i||i.name!==\"return\")?this.append(`\n`,t):super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value=\"\",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:i}=this.state;this.input=`${i}`.slice(0,t)+e+`${i}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),i=this.input.slice(e),n=t.split(\" \");this.state.clipboard.push(n.pop()),this.input=n.join(\" \"),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):\"\";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):Jje(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),i=await this.separator(),n=await this.message(),s=[t,n,i].filter(Boolean).join(\" \");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=\" \"+l),s+=\" \"+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(`\n`)),this.restore()}};Gne.exports=mT});var jne=w((Kgt,Yne)=>{\"use strict\";var zje=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),PQ=r=>zje(r).filter(Boolean);Yne.exports=(r,e={},t=\"\")=>{let{past:i=[],present:n=\"\"}=e,s,o;switch(r){case\"prev\":case\"undo\":return s=i.slice(0,i.length-1),o=i[i.length-1]||\"\",{past:PQ([t,...s]),present:o};case\"next\":case\"redo\":return s=i.slice(1),o=i[0]||\"\",{past:PQ([...s,t]),present:o};case\"save\":return{past:PQ([...i,t]),present:\"\"};case\"remove\":return o=PQ(i.filter(a=>a!==t)),n=\"\",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: \"${r}\"`)}}});var IT=w((Hgt,Jne)=>{\"use strict\";var Vje=au(),qne=jne(),ET=class extends Vje{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let i=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get(\"values\")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=qne(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion(\"prev\")}altDown(){return this.completion(\"next\")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=qne(\"save\",this.data,this.input),this.store.set(\"values\",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Jne.exports=ET});var zne=w((Ggt,Wne)=>{\"use strict\";var Xje=au(),yT=class extends Xje{format(){return\"\"}};Wne.exports=yT});var Xne=w((Ygt,Vne)=>{\"use strict\";var Zje=au(),wT=class extends Zje{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||\"\"}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:t=>t;return this.list.map(e).join(\", \")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return t!==!0?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Vne.exports=wT});var _ne=w((jgt,Zne)=>{\"use strict\";var _je=dl(),BT=class extends _je{constructor(e){super({...e,multiple:!0})}};Zne.exports=BT});var bT=w((qgt,$ne)=>{\"use strict\";var $je=au(),QT=class extends $je{constructor(e={}){super({style:\"number\",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:\"\",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e===\".\"&&this.input.includes(\".\")?this.alert(\"invalid number\"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,i=this.toNumber(this.input);return i>this.max+t?this.alert():(this.input=`${i+t}`,this.render())}down(e){let t=e||this.minor,i=this.toNumber(this.input);return i<this.min-t?this.alert():(this.input=`${i-t}`,this.render())}shiftDown(){return this.down(this.major)}shiftUp(){return this.up(this.major)}format(e=this.input){return typeof this.options.format==\"function\"?this.options.format.call(this,e):this.styles.info(e)}toNumber(e=\"\"){return this.float?+e:Math.round(+e)}isValue(e){return/^[-+]?[0-9]+((\\.)|(\\.[0-9]+))?$/.test(e)}submit(){let e=[this.input,this.initial].find(t=>this.isValue(t));return this.value=this.toNumber(e||0),super.submit()}};$ne.exports=QT});var tse=w((Jgt,ese)=>{ese.exports=bT()});var ise=w((Wgt,rse)=>{\"use strict\";var eqe=au(),ST=class extends eqe{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):\"\"}};rse.exports=ST});var ose=w((zgt,sse)=>{\"use strict\";var tqe=uo(),rqe=Om(),nse=ji(),vT=class extends rqe{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||\"left\"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||`\n   `;let t=e.startNumber||1;typeof this.scale==\"number\"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let i=0;i<this.scale.length;i++)t.scale.push({index:i})}this.widths[0]=Math.min(this.widths[0],e+3)}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}heading(e,t,i){return this.styles.strong(e)}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIndex>=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return\"\"}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.index)).join(\", \"):\"\"}pointer(){return\"\"}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?\"\":[\"\",...this.scale.map(i=>`   ${i.name} - ${i.message}`)].map(i=>this.styles.muted(i)).join(`\n`)}renderScaleHeading(e){let t=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading==\"function\"&&(t=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-t.join(\"\").length,n=Math.round(i/(t.length-1)),o=t.map(l=>this.styles.strong(l)).join(\" \".repeat(n)),a=\" \".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,t,i){if(typeof this.options.scaleIndicator==\"function\")return this.options.scaleIndicator.call(this,e,t,i);let n=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let i=e.scale.map(s=>this.scaleIndicator(e,s,t)),n=this.term===\"Hyper\"?\"\":\" \";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await e.hint;s&&!nse.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\\s+$/,\"\").padEnd(this.widths[0],\" \"),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,t),u=await this.renderScale(e,t),g=this.margin[1]+this.margin[3];this.scaleLength=tqe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=nse.wordWrap(c,{width:this.widths[0],newline:a}).split(`\n`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(\"\"),[l+n,h.join(`\n`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return\"\";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),t=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...t.map(n=>n.join(\" \"))].join(`\n`)}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=\"\";this.options.promptLine!==!1&&(o=[i,s,n,\"\"].join(\" \"),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=\" \"+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(t),this.write([a,o,c,g,f].filter(Boolean).join(`\n`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};sse.exports=vT});var lse=w((Vgt,Ase)=>{\"use strict\";var ase=uo(),iqe=(r=\"\")=>typeof r==\"string\"?r.replace(/^['\"]|['\"]$/g,\"\"):\"\",PT=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=iqe(e.initial||this.field.initial||\"\"),this.message=e.message||this.name,this.cursor=0,this.input=\"\",this.lines=[]}},nqe=async(r={},e={},t=i=>i)=>{let i=new Set,n=r.fields||[],s=r.template,o=[],a=[],l=[],c=1;typeof s==\"function\"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:\"bos\",value:\"\"});u<s.length-1;){let p=g();if(/^[^\\S\\n ]$/.test(p)){h({type:\"text\",value:p});continue}if(p===`\n`){h({type:\"newline\",value:p}),c++;continue}if(p===\"\\\\\"){p+=g(),h({type:\"text\",value:p});continue}if((p===\"$\"||p===\"#\"||p===\"{\")&&f()===\"{\"){let y=g();p+=y;let B={type:\"template\",open:p,inner:\"\",close:\"\",value:p},v;for(;v=g();){if(v===\"}\"){f()===\"}\"&&(v+=g()),B.value+=v,B.close=v;break}v===\":\"?(B.initial=\"\",B.key=B.inner):B.initial!==void 0&&(B.initial+=v),B.value+=v,B.inner+=v}B.template=B.open+(B.initial||B.inner)+B.close,B.key=B.key||B.inner,e.hasOwnProperty(B.key)&&(B.initial=e[B.key]),B=t(B),h(B),l.push(B.key),i.add(B.key);let D=a.find(L=>L.name===B.key);B.field=n.find(L=>L.name===B.key),D||(D=new PT(B),a.push(D)),D.lines.push(B.line-1);continue}let C=o[o.length-1];C.type===\"text\"&&C.line===c?C.value+=p:h({type:\"text\",value:p})}return h({type:\"eos\",value:\"\"}),{input:s,tabstops:o,unique:i,keys:l,items:a}};Ase.exports=async r=>{let e=r.options,t=new Set(e.required===!0?[]:e.required||[]),i={...e.values,...e.initial},{tabstops:n,items:s,keys:o}=await nqe(e,i),a=xT(\"result\",r,e),l=xT(\"format\",r,e),c=xT(\"validate\",r,e,!0),u=r.isValue.bind(r);return async(g={},f=!1)=>{let h=0;g.required=t,g.items=s,g.keys=o,g.output=\"\";let p=async(v,D,L,H)=>{let j=await c(v,D,L,H);return j===!1?\"Invalid field \"+L.name:j};for(let v of n){let D=v.value,L=v.key;if(v.type!==\"template\"){D&&(g.output+=D);continue}if(v.type===\"template\"){let H=s.find(_=>_.name===L);e.required===!0&&g.required.add(H.name);let j=[H.input,g.values[H.value],H.value,D].find(u),V=(H.field||{}).message||v.inner;if(f){let _=await p(g.values[L],g,H,h);if(_&&typeof _==\"string\"||_===!1){g.invalid.set(L,_);continue}g.invalid.delete(L);let A=await a(g.values[L],g,H,h);g.output+=ase.unstyle(A);continue}H.placeholder=!1;let W=D;D=await l(D,g,H,h),j!==D?(g.values[L]=j,D=r.styles.typing(j),g.missing.delete(V)):(g.values[L]=void 0,j=`<${V}>`,D=r.styles.primary(j),H.placeholder=!0,g.required.has(L)&&g.missing.add(V)),g.missing.has(V)&&g.validating&&(D=r.styles.warning(j)),g.invalid.has(L)&&g.validating&&(D=r.styles.danger(j)),h===g.index&&(W!==D?D=r.styles.underline(D):D=r.styles.heading(ase.unstyle(D))),h++}D&&(g.output+=D)}let C=g.output.split(`\n`).map(v=>\" \"+v),y=s.length,B=0;for(let v of s)g.invalid.has(v.name)&&v.lines.forEach(D=>{C[D][0]===\" \"&&(C[D]=g.styles.danger(g.symbols.bullet)+C[D].slice(1))}),r.isValue(g.values[v.name])&&B++;return g.completed=(B/y*100).toFixed(0),g.output=C.join(`\n`),g.output}};function xT(r,e,t,i){return(n,s,o,a)=>typeof o.field[r]==\"function\"?o.field[r].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var use=w((Xgt,cse)=>{\"use strict\";var sqe=uo(),oqe=lse(),aqe=Yh(),DT=class extends aqe{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await oqe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(t=this.styles.danger),t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:i,size:n}=this.state,s=[this.options.newline,`\n`].find(v=>v!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(\" \");this.state.prompt=c;let u=await this.header(),g=await this.error()||\"\",f=await this.hint()||\"\",h=i?\"\":await this.interpolate(this.state),p=this.state.key=t[e]||\"\",C=await this.format(p),y=await this.footer();C&&(c+=\" \"+C),f&&!C&&this.state.completed===0&&(c+=\" \"+f),this.clear(n);let B=[u,c,h,y,g.trim()];this.write(B.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:t,keys:i,index:n}=this.state,s=t.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!=\"function\"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:i,values:n}=this.state;if(e.size){let a=\"\";for(let[l,c]of e)a+=`Invalid ${l}: ${c}\n`;return this.state.error=a,super.submit()}if(t.size)return this.state.error=\"Required: \"+[...t.keys()].join(\", \"),super.submit();let o=sqe.unstyle(i).split(`\n`).map(a=>a.slice(1)).join(`\n`);return this.value={values:n,result:o},super.submit()}};cse.exports=DT});var fse=w((Zgt,gse)=>{\"use strict\";var Aqe=\"(Use <shift>+<up/down> to sort)\",lqe=dl(),kT=class extends lqe{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,Aqe].find(this.isValue.bind(this))}indicator(){return\"\"}async renderChoice(e,t){let i=await super.renderChoice(e,t),n=this.symbols.identicalTo+\" \",s=this.index===t&&this.sorting?this.styles.muted(n):\"  \";return this.options.drag===!1&&(s=\"\"),this.options.numbered===!0?s+`${t+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};gse.exports=kT});var pse=w((_gt,hse)=>{\"use strict\";var cqe=Om(),RT=class extends cqe{constructor(e={}){if(super(e),this.emptyError=e.emptyError||\"No items were selected\",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=[\"\",\"4 - Strongly Agree\",\"3 - Agree\",\"2 - Neutral\",\"1 - Disagree\",\"0 - Strongly Disagree\",\"\"];t=t.map(i=>this.styles.muted(i)),this.state.header=t.join(`\n   `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let i of t)i.scale=uqe(5,this.options),i.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],i=t.selected;return e.scale.forEach(n=>n.selected=!1),t.selected=!i,this.render()}indicator(){return\"\"}pointer(){return\"\"}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return\"   \"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=this.term===\"Hyper\",s=n?9:8,o=n?\"\":\" \",a=this.symbols.line.repeat(s),l=\" \".repeat(s+(n?0:1)),c=D=>(D?this.styles.success(\"\\u25C9\"):\"\\u25EF\")+o,u=t+1+\".\",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,t),h=this.indent(e),p=h+e.scale.map((D,L)=>c(L===e.scaleIdx)).join(a),C=D=>D===e.scaleIdx?g(D):D,y=h+e.scale.map((D,L)=>C(L)).join(l),B=()=>[u,f].filter(Boolean).join(\" \"),v=()=>[B(),p,y,\" \"].filter(Boolean).join(`\n`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return\"\";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger(\"No matching choices\")),t.join(`\n`)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(\", \"):\"\"}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(\" \");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=\" \"+l),c&&!o.includes(c)&&(o+=\" \"+c),e&&!l&&!u&&this.multiple&&this.type!==\"form\"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(`\n`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function uqe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>({...i}));let t=[];for(let i=1;i<r+1;i++)t.push({i,selected:!1});return t}hse.exports=RT});var Cse=w(($gt,dse)=>{dse.exports=IT()});var Ese=w((eft,mse)=>{\"use strict\";var gqe=xQ(),FT=class extends gqe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||\"no\",this.enabled=this.options.enabled||\"yes\",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e=\"\",t){switch(e.toLowerCase()){case\" \":return this.toggle();case\"1\":case\"y\":case\"t\":return this.enable();case\"0\":case\"n\":case\"f\":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(\" / \"))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(\" \");this.state.prompt=c,a&&!c.includes(a)&&(c+=\" \"+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};mse.exports=FT});var yse=w((tft,Ise)=>{\"use strict\";var fqe=dl(),NT=class extends fqe{constructor(e){if(super(e),typeof this.options.correctChoice!=\"number\"||this.options.correctChoice<0)throw new Error(\"Please specify the index of the correct answer from the list of choices\")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error(\"Please give at least two choices to the user\");if(this.options.correctChoice>i.length)throw new Error(\"Please specify the index of the correct answer from the list of choices\");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ise.exports=NT});var Bse=w(LT=>{\"use strict\";var wse=ji(),ui=(r,e)=>{wse.defineExport(LT,r,e),wse.defineExport(LT,r.toLowerCase(),e)};ui(\"AutoComplete\",()=>Pne());ui(\"BasicAuth\",()=>Tne());ui(\"Confirm\",()=>Une());ui(\"Editable\",()=>Hne());ui(\"Form\",()=>vQ());ui(\"Input\",()=>IT());ui(\"Invisible\",()=>zne());ui(\"List\",()=>Xne());ui(\"MultiSelect\",()=>_ne());ui(\"Numeral\",()=>tse());ui(\"Password\",()=>ise());ui(\"Scale\",()=>ose());ui(\"Select\",()=>dl());ui(\"Snippet\",()=>use());ui(\"Sort\",()=>fse());ui(\"Survey\",()=>pse());ui(\"Text\",()=>Cse());ui(\"Toggle\",()=>Ese());ui(\"Quiz\",()=>yse())});var bse=w((ift,Qse)=>{Qse.exports={ArrayPrompt:Om(),AuthPrompt:hT(),BooleanPrompt:xQ(),NumberPrompt:bT(),StringPrompt:au()}});var Um=w((nft,vse)=>{\"use strict\";var Sse=J(\"assert\"),OT=J(\"events\"),Cl=ji(),fo=class extends OT{constructor(e,t){super(),this.options=Cl.merge({},e),this.answers={...t}}register(e,t){if(Cl.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}Sse.equal(typeof t,\"function\",\"expected a function\");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t==\"function\"&&(t=await t.call(this)),await this.ask(Cl.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e==\"function\"&&(e=await e.call(this));let t=Cl.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Cl;if(typeof i==\"function\"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];Sse(this.prompts[i],`Prompt \"${i}\" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on(\"submit\",u=>{this.emit(\"answer\",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit(\"prompt\",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill===\"show\"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||Yh()}static get prompts(){return Bse()}static get types(){return bse()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return Cl.mixinEmitter(e,new OT),e}};Cl.mixinEmitter(fo,new OT);var TT=fo.prompts;for(let r of Object.keys(TT)){let e=r.toLowerCase(),t=i=>new TT[r](i).run();fo.prompt[e]=t,fo[e]=t,fo[r]||Reflect.defineProperty(fo,r,{get:()=>TT[r]})}var Mm=r=>{Cl.defineExport(fo,r,()=>fo.types[r])};Mm(\"ArrayPrompt\");Mm(\"AuthPrompt\");Mm(\"BooleanPrompt\");Mm(\"NumberPrompt\");Mm(\"StringPrompt\");vse.exports=fo});var Ose=w((qft,Tse)=>{function mqe(r,e){for(var t=-1,i=r==null?0:r.length;++t<i&&e(r[t],t,r)!==!1;);return r}Tse.exports=mqe});var Jh=w((Jft,Mse)=>{var Eqe=Y0(),Iqe=Qh();function yqe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s<o;){var a=e[s],l=i?i(t[a],r[a],a,t,r):void 0;l===void 0&&(l=r[a]),n?Iqe(t,a,l):Eqe(t,a,l)}return t}Mse.exports=yqe});var Kse=w((Wft,Use)=>{var wqe=Jh(),Bqe=Rh();function Qqe(r,e){return r&&wqe(e,Bqe(e),r)}Use.exports=Qqe});var Gse=w((zft,Hse)=>{function bqe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Hse.exports=bqe});var jse=w((Vft,Yse)=>{var Sqe=Sn(),vqe=aQ(),xqe=Gse(),Pqe=Object.prototype,Dqe=Pqe.hasOwnProperty;function kqe(r){if(!Sqe(r))return xqe(r);var e=vqe(r),t=[];for(var i in r)i==\"constructor\"&&(e||!Dqe.call(r,i))||t.push(i);return t}Yse.exports=kqe});var Wh=w((Xft,qse)=>{var Rqe=aL(),Fqe=jse(),Nqe=gm();function Lqe(r){return Nqe(r)?Rqe(r,!0):Fqe(r)}qse.exports=Lqe});var Wse=w((Zft,Jse)=>{var Tqe=Jh(),Oqe=Wh();function Mqe(r,e){return r&&Tqe(e,Oqe(e),r)}Jse.exports=Mqe});var YT=w((Ym,zh)=>{var Uqe=ys(),Zse=typeof Ym==\"object\"&&Ym&&!Ym.nodeType&&Ym,zse=Zse&&typeof zh==\"object\"&&zh&&!zh.nodeType&&zh,Kqe=zse&&zse.exports===Zse,Vse=Kqe?Uqe.Buffer:void 0,Xse=Vse?Vse.allocUnsafe:void 0;function Hqe(r,e){if(e)return r.slice();var t=r.length,i=Xse?Xse(t):new r.constructor(t);return r.copy(i),i}zh.exports=Hqe});var jT=w((_ft,_se)=>{function Gqe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t<i;)e[t]=r[t];return e}_se.exports=Gqe});var eoe=w(($ft,$se)=>{var Yqe=Jh(),jqe=lQ();function qqe(r,e){return Yqe(r,jqe(r),e)}$se.exports=qqe});var kQ=w((eht,toe)=>{var Jqe=AL(),Wqe=Jqe(Object.getPrototypeOf,Object);toe.exports=Wqe});var qT=w((tht,roe)=>{var zqe=q0(),Vqe=kQ(),Xqe=lQ(),Zqe=hL(),_qe=Object.getOwnPropertySymbols,$qe=_qe?function(r){for(var e=[];r;)zqe(e,Xqe(r)),r=Vqe(r);return e}:Zqe;roe.exports=$qe});var noe=w((rht,ioe)=>{var eJe=Jh(),tJe=qT();function rJe(r,e){return eJe(r,tJe(r),e)}ioe.exports=rJe});var ooe=w((iht,soe)=>{var iJe=fL(),nJe=qT(),sJe=Wh();function oJe(r){return iJe(r,sJe,nJe)}soe.exports=oJe});var Aoe=w((nht,aoe)=>{var aJe=Object.prototype,AJe=aJe.hasOwnProperty;function lJe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]==\"string\"&&AJe.call(r,\"index\")&&(t.index=r.index,t.input=r.input),t}aoe.exports=lJe});var RQ=w((sht,coe)=>{var loe=uL();function cJe(r){var e=new r.constructor(r.byteLength);return new loe(e).set(new loe(r)),e}coe.exports=cJe});var goe=w((oht,uoe)=>{var uJe=RQ();function gJe(r,e){var t=e?uJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}uoe.exports=gJe});var hoe=w((aht,foe)=>{var fJe=/\\w*$/;function hJe(r){var e=new r.constructor(r.source,fJe.exec(r));return e.lastIndex=r.lastIndex,e}foe.exports=hJe});var Eoe=w((Aht,moe)=>{var poe=Rc(),doe=poe?poe.prototype:void 0,Coe=doe?doe.valueOf:void 0;function pJe(r){return Coe?Object(Coe.call(r)):{}}moe.exports=pJe});var JT=w((lht,Ioe)=>{var dJe=RQ();function CJe(r,e){var t=e?dJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}Ioe.exports=CJe});var woe=w((cht,yoe)=>{var mJe=RQ(),EJe=goe(),IJe=hoe(),yJe=Eoe(),wJe=JT(),BJe=\"[object Boolean]\",QJe=\"[object Date]\",bJe=\"[object Map]\",SJe=\"[object Number]\",vJe=\"[object RegExp]\",xJe=\"[object Set]\",PJe=\"[object String]\",DJe=\"[object Symbol]\",kJe=\"[object ArrayBuffer]\",RJe=\"[object DataView]\",FJe=\"[object Float32Array]\",NJe=\"[object Float64Array]\",LJe=\"[object Int8Array]\",TJe=\"[object Int16Array]\",OJe=\"[object Int32Array]\",MJe=\"[object Uint8Array]\",UJe=\"[object Uint8ClampedArray]\",KJe=\"[object Uint16Array]\",HJe=\"[object Uint32Array]\";function GJe(r,e,t){var i=r.constructor;switch(e){case kJe:return mJe(r);case BJe:case QJe:return new i(+r);case RJe:return EJe(r,t);case FJe:case NJe:case LJe:case TJe:case OJe:case MJe:case UJe:case KJe:case HJe:return wJe(r,t);case bJe:return new i;case SJe:case PJe:return new i(r);case vJe:return IJe(r);case xJe:return new i;case DJe:return yJe(r)}}yoe.exports=GJe});var boe=w((uht,Qoe)=>{var YJe=Sn(),Boe=Object.create,jJe=function(){function r(){}return function(e){if(!YJe(e))return{};if(Boe)return Boe(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Qoe.exports=jJe});var WT=w((ght,Soe)=>{var qJe=boe(),JJe=kQ(),WJe=aQ();function zJe(r){return typeof r.constructor==\"function\"&&!WJe(r)?qJe(JJe(r)):{}}Soe.exports=zJe});var xoe=w((fht,voe)=>{var VJe=hm(),XJe=Jo(),ZJe=\"[object Map]\";function _Je(r){return XJe(r)&&VJe(r)==ZJe}voe.exports=_Je});var Roe=w((hht,koe)=>{var $Je=xoe(),e3e=nQ(),Poe=sQ(),Doe=Poe&&Poe.isMap,t3e=Doe?e3e(Doe):$Je;koe.exports=t3e});var Noe=w((pht,Foe)=>{var r3e=hm(),i3e=Jo(),n3e=\"[object Set]\";function s3e(r){return i3e(r)&&r3e(r)==n3e}Foe.exports=s3e});var Moe=w((dht,Ooe)=>{var o3e=Noe(),a3e=nQ(),Loe=sQ(),Toe=Loe&&Loe.isSet,A3e=Toe?a3e(Toe):o3e;Ooe.exports=A3e});var Yoe=w((Cht,Goe)=>{var l3e=fm(),c3e=Ose(),u3e=Y0(),g3e=Kse(),f3e=Wse(),h3e=YT(),p3e=jT(),d3e=eoe(),C3e=noe(),m3e=pL(),E3e=ooe(),I3e=hm(),y3e=Aoe(),w3e=woe(),B3e=WT(),Q3e=vs(),b3e=lm(),S3e=Roe(),v3e=Sn(),x3e=Moe(),P3e=Rh(),D3e=Wh(),k3e=1,R3e=2,F3e=4,Uoe=\"[object Arguments]\",N3e=\"[object Array]\",L3e=\"[object Boolean]\",T3e=\"[object Date]\",O3e=\"[object Error]\",Koe=\"[object Function]\",M3e=\"[object GeneratorFunction]\",U3e=\"[object Map]\",K3e=\"[object Number]\",Hoe=\"[object Object]\",H3e=\"[object RegExp]\",G3e=\"[object Set]\",Y3e=\"[object String]\",j3e=\"[object Symbol]\",q3e=\"[object WeakMap]\",J3e=\"[object ArrayBuffer]\",W3e=\"[object DataView]\",z3e=\"[object Float32Array]\",V3e=\"[object Float64Array]\",X3e=\"[object Int8Array]\",Z3e=\"[object Int16Array]\",_3e=\"[object Int32Array]\",$3e=\"[object Uint8Array]\",e8e=\"[object Uint8ClampedArray]\",t8e=\"[object Uint16Array]\",r8e=\"[object Uint32Array]\",ur={};ur[Uoe]=ur[N3e]=ur[J3e]=ur[W3e]=ur[L3e]=ur[T3e]=ur[z3e]=ur[V3e]=ur[X3e]=ur[Z3e]=ur[_3e]=ur[U3e]=ur[K3e]=ur[Hoe]=ur[H3e]=ur[G3e]=ur[Y3e]=ur[j3e]=ur[$3e]=ur[e8e]=ur[t8e]=ur[r8e]=!0;ur[O3e]=ur[Koe]=ur[q3e]=!1;function FQ(r,e,t,i,n,s){var o,a=e&k3e,l=e&R3e,c=e&F3e;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!v3e(r))return r;var u=Q3e(r);if(u){if(o=y3e(r),!a)return p3e(r,o)}else{var g=I3e(r),f=g==Koe||g==M3e;if(b3e(r))return h3e(r,a);if(g==Hoe||g==Uoe||f&&!n){if(o=l||f?{}:B3e(r),!a)return l?C3e(r,f3e(o,r)):d3e(r,g3e(o,r))}else{if(!ur[g])return n?r:{};o=w3e(r,g,a)}}s||(s=new l3e);var h=s.get(r);if(h)return h;s.set(r,o),x3e(r)?r.forEach(function(y){o.add(FQ(y,e,t,y,r,s))}):S3e(r)&&r.forEach(function(y,B){o.set(B,FQ(y,e,t,B,r,s))});var p=c?l?E3e:m3e:l?D3e:P3e,C=u?void 0:p(r);return c3e(C||r,function(y,B){C&&(B=y,y=r[B]),u3e(o,B,FQ(y,e,t,B,r,s))}),o}Goe.exports=FQ});var zT=w((mht,joe)=>{var i8e=Yoe(),n8e=1,s8e=4;function o8e(r){return i8e(r,n8e|s8e)}joe.exports=o8e});var Joe=w((Eht,qoe)=>{var a8e=UN();function A8e(r,e,t){return r==null?r:a8e(r,e,t)}qoe.exports=A8e});var Zoe=w((bht,Xoe)=>{function l8e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}Xoe.exports=l8e});var $oe=w((Sht,_oe)=>{var c8e=rm(),u8e=HR();function g8e(r,e){return e.length<2?r:c8e(r,u8e(e,0,-1))}_oe.exports=g8e});var tae=w((vht,eae)=>{var f8e=Bh(),h8e=Zoe(),p8e=$oe(),d8e=Zc();function C8e(r,e){return e=f8e(e,r),r=p8e(r,e),r==null||delete r[d8e(h8e(e))]}eae.exports=C8e});var iae=w((xht,rae)=>{var m8e=tae();function E8e(r,e){return r==null?!0:m8e(r,e)}rae.exports=E8e});var Aae=w((rpt,w8e)=>{w8e.exports={name:\"@yarnpkg/cli\",version:\"3.5.1\",license:\"BSD-2-Clause\",main:\"./sources/index.ts\",dependencies:{\"@yarnpkg/core\":\"workspace:^\",\"@yarnpkg/fslib\":\"workspace:^\",\"@yarnpkg/libzip\":\"workspace:^\",\"@yarnpkg/parsers\":\"workspace:^\",\"@yarnpkg/plugin-compat\":\"workspace:^\",\"@yarnpkg/plugin-dlx\":\"workspace:^\",\"@yarnpkg/plugin-essentials\":\"workspace:^\",\"@yarnpkg/plugin-file\":\"workspace:^\",\"@yarnpkg/plugin-git\":\"workspace:^\",\"@yarnpkg/plugin-github\":\"workspace:^\",\"@yarnpkg/plugin-http\":\"workspace:^\",\"@yarnpkg/plugin-init\":\"workspace:^\",\"@yarnpkg/plugin-link\":\"workspace:^\",\"@yarnpkg/plugin-nm\":\"workspace:^\",\"@yarnpkg/plugin-npm\":\"workspace:^\",\"@yarnpkg/plugin-npm-cli\":\"workspace:^\",\"@yarnpkg/plugin-pack\":\"workspace:^\",\"@yarnpkg/plugin-patch\":\"workspace:^\",\"@yarnpkg/plugin-pnp\":\"workspace:^\",\"@yarnpkg/plugin-pnpm\":\"workspace:^\",\"@yarnpkg/shell\":\"workspace:^\",chalk:\"^3.0.0\",\"ci-info\":\"^3.2.0\",clipanion:\"3.2.0-rc.4\",semver:\"^7.1.2\",tslib:\"^1.13.0\",typanion:\"^3.3.0\",yup:\"^0.32.9\"},devDependencies:{\"@types/semver\":\"^7.1.0\",\"@types/yup\":\"^0\",\"@yarnpkg/builder\":\"workspace:^\",\"@yarnpkg/monorepo\":\"workspace:^\",\"@yarnpkg/pnpify\":\"workspace:^\",micromatch:\"^4.0.2\"},peerDependencies:{\"@yarnpkg/core\":\"workspace:^\"},scripts:{postpack:\"rm -rf lib\",prepack:'run build:compile \"$(pwd)\"',\"build:cli+hook\":\"run build:pnp:hook && builder build bundle\",\"build:cli\":\"builder build bundle\",\"run:cli\":\"builder run\",\"update-local\":\"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/\"},publishConfig:{main:\"./lib/index.js\",types:\"./lib/index.d.ts\",bin:null},files:[\"/lib/**/*\",\"!/lib/pluginConfiguration.*\",\"!/lib/cli.*\"],\"@yarnpkg/builder\":{bundles:{standard:[\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\"]}},repository:{type:\"git\",url:\"ssh://git@github.com/yarnpkg/berry.git\",directory:\"packages/yarnpkg-cli\"},engines:{node:\">=12 <14 || 14.2 - 14.9 || >14.10.0\"}}});var nO=w((vmt,wae)=>{\"use strict\";wae.exports=function(e,t){t===!0&&(t=0);var i=\"\";if(typeof e==\"string\")try{i=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(i=e.protocol);var n=i.split(/\\:|\\+/).filter(Boolean);return typeof t==\"number\"?n[t]:n}});var Qae=w((xmt,Bae)=>{\"use strict\";var H8e=nO();function G8e(r){var e={protocols:[],protocol:null,port:null,resource:\"\",host:\"\",user:\"\",password:\"\",pathname:\"\",hash:\"\",search:\"\",href:r,query:{},parse_failed:!1};try{var t=new URL(r);e.protocols=H8e(t),e.protocol=e.protocols[0],e.port=t.port,e.resource=t.hostname,e.host=t.host,e.user=t.username||\"\",e.password=t.password||\"\",e.pathname=t.pathname,e.hash=t.hash.slice(1),e.search=t.search.slice(1),e.href=t.href,e.query=Object.fromEntries(t.searchParams)}catch{e.protocols=[\"file\"],e.protocol=e.protocols[0],e.port=\"\",e.resource=\"\",e.user=\"\",e.pathname=\"\",e.hash=\"\",e.search=\"\",e.href=r,e.query={},e.parse_failed=!0}return e}Bae.exports=G8e});var vae=w((Pmt,Sae)=>{\"use strict\";var Y8e=Qae();function j8e(r){return r&&typeof r==\"object\"&&\"default\"in r?r:{default:r}}var q8e=j8e(Y8e),J8e=\"text/plain\",W8e=\"us-ascii\",bae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),z8e=(r,{stripHash:e})=>{let t=/^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(\";\");s=e?\"\":s;let a=!1;o[o.length-1]===\"base64\"&&(o.pop(),a=!0);let l=(o.shift()||\"\").toLowerCase(),u=[...o.map(g=>{let[f,h=\"\"]=g.split(\"=\").map(p=>p.trim());return f===\"charset\"&&(h=h.toLowerCase(),h===W8e)?\"\":`${f}${h?`=${h}`:\"\"}`}).filter(Boolean)];return a&&u.push(\"base64\"),(u.length>0||l&&l!==J8e)&&u.unshift(l),`data:${u.join(\";\")},${a?n.trim():n}${s?`#${s}`:\"\"}`};function V8e(r,e){if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},r=r.trim(),/^data:/i.test(r))return z8e(r,e);if(/^view-source:/i.test(r))throw new Error(\"`view-source:` is not supported as it is a non-standard protocol\");let t=r.startsWith(\"//\");!t&&/^\\.*\\//.test(r)||(r=r.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&n.protocol===\"https:\"&&(n.protocol=\"http:\"),e.forceHttps&&n.protocol===\"http:\"&&(n.protocol=\"https:\"),e.stripAuthentication&&(n.username=\"\",n.password=\"\"),e.stripHash?n.hash=\"\":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,\"\")),n.pathname){let o=/\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g,a=0,l=\"\";for(;;){let u=o.exec(n.pathname);if(!u)break;let g=u[0],f=u.index,h=n.pathname.slice(a,f);l+=h.replace(/\\/{2,}/g,\"/\"),l+=g,a=f+g.length}let c=n.pathname.slice(a,n.pathname.length);l+=c.replace(/\\/{2,}/g,\"/\"),n.pathname=l}if(n.pathname)try{n.pathname=decodeURI(n.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let o=n.pathname.split(\"/\"),a=o[o.length-1];bae(a,e.removeDirectoryIndex)&&(o=o.slice(0,-1),n.pathname=o.slice(1).join(\"/\")+\"/\")}if(n.hostname&&(n.hostname=n.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])bae(o,e.removeQueryParameters)&&n.searchParams.delete(o);if(e.removeQueryParameters===!0&&(n.search=\"\"),e.sortQueryParameters){n.searchParams.sort();try{n.search=decodeURIComponent(n.search)}catch{}}e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\\/$/,\"\"));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname===\"/\"&&!s.endsWith(\"/\")&&n.hash===\"\"&&(r=r.replace(/\\/$/,\"\")),(e.removeTrailingSlash||n.pathname===\"/\")&&n.hash===\"\"&&e.removeSingleSlash&&(r=r.replace(/\\/$/,\"\")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\\/\\//,\"\")),r}var sO=(r,e=!1)=>{let t=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\\/\\/)([\\w\\.\\-@]+)[\\/:]([\\~,\\.\\w,\\-,\\_,\\/]+?(?:\\.git|\\/)?)$/,i=s=>{let o=new Error(s);throw o.subject_url=r,o};(typeof r!=\"string\"||!r.trim())&&i(\"Invalid url.\"),r.length>sO.MAX_INPUT_LENGTH&&i(\"Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.\"),e&&(typeof e!=\"object\"&&(e={stripHash:!1}),r=V8e(r,e));let n=q8e.default(r);if(n.parse_failed){let s=n.href.match(t);s?(n.protocols=[\"ssh\"],n.protocol=\"ssh\",n.resource=s[2],n.host=s[2],n.user=s[1],n.pathname=`/${s[3]}`,n.parse_failed=!1):i(\"URL parsing failed.\")}return n};sO.MAX_INPUT_LENGTH=2048;Sae.exports=sO});var Dae=w((Dmt,Pae)=>{\"use strict\";var X8e=nO();function xae(r){if(Array.isArray(r))return r.indexOf(\"ssh\")!==-1||r.indexOf(\"rsync\")!==-1;if(typeof r!=\"string\")return!1;var e=X8e(r);if(r=r.substring(r.indexOf(\"://\")+3),xae(e))return!0;var t=new RegExp(\".([a-zA-Z\\\\d]+):(\\\\d+)/\");return!r.match(t)&&r.indexOf(\"@\")<r.indexOf(\":\")}Pae.exports=xae});var Fae=w((kmt,Rae)=>{\"use strict\";var Z8e=vae(),kae=Dae();function _8e(r){var e=Z8e(r);return e.token=\"\",e.password===\"x-oauth-basic\"?e.token=e.user:e.user===\"x-token-auth\"&&(e.token=e.password),kae(e.protocols)||e.protocols.length===0&&kae(r)?e.protocol=\"ssh\":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol=\"file\",e.protocols=[\"file\"]),e.href=e.href.replace(/\\/$/,\"\"),e}Rae.exports=_8e});var Lae=w((Rmt,Nae)=>{\"use strict\";var $8e=Fae();function oO(r){if(typeof r!=\"string\")throw new Error(\"The url must be a string.\");var e=/^([a-z\\d-]{1,39})\\/([-\\.\\w]{1,100})$/i;e.test(r)&&(r=\"https://github.com/\"+r);var t=$8e(r),i=t.resource.split(\".\"),n=null;switch(t.toString=function(y){return oO.stringify(this,y)},t.source=i.length>2?i.slice(1-i.length).join(\".\"):t.source=t.resource,t.git_suffix=/\\.git$/.test(t.pathname),t.name=decodeURIComponent((t.pathname||t.href).replace(/(^\\/)|(\\/$)/g,\"\").replace(/\\.git$/,\"\")),t.owner=decodeURIComponent(t.user),t.source){case\"git.cloudforge.com\":t.owner=t.user,t.organization=i[0],t.source=\"cloudforge.com\";break;case\"visualstudio.com\":if(t.resource===\"vs-ssh.visualstudio.com\"){n=t.name.split(\"/\"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3],t.full_name=n[2]+\"/\"+n[3]);break}else{n=t.name.split(\"/\"),n.length===2?(t.owner=n[1],t.name=n[1],t.full_name=\"_git/\"+t.name):n.length===3?(t.name=n[2],n[0]===\"DefaultCollection\"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+\"/_git/\"+t.name):(t.owner=n[0],t.full_name=t.owner+\"/_git/\"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+\"/\"+t.owner+\"/_git/\"+t.name);break}case\"dev.azure.com\":case\"azure.com\":if(t.resource===\"ssh.dev.azure.com\"){n=t.name.split(\"/\"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3]);break}else{n=t.name.split(\"/\"),n.length===5?(t.organization=n[0],t.owner=n[1],t.name=n[4],t.full_name=\"_git/\"+t.name):n.length===3?(t.name=n[2],n[0]===\"DefaultCollection\"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+\"/_git/\"+t.name):(t.owner=n[0],t.full_name=t.owner+\"/_git/\"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+\"/\"+t.owner+\"/_git/\"+t.name),t.query&&t.query.path&&(t.filepath=t.query.path.replace(/^\\/+/g,\"\")),t.query&&t.query.version&&(t.ref=t.query.version.replace(/^GB/,\"\"));break}default:n=t.name.split(\"/\");var s=n.length-1;if(n.length>=2){var o=n.indexOf(\"-\",2),a=n.indexOf(\"blob\",2),l=n.indexOf(\"tree\",2),c=n.indexOf(\"commit\",2),u=n.indexOf(\"src\",2),g=n.indexOf(\"raw\",2),f=n.indexOf(\"edit\",2);s=o>0?o-1:a>0?a-1:l>0?l-1:c>0?c-1:u>0?u-1:g>0?g-1:f>0?f-1:s,t.owner=n.slice(0,s).join(\"/\"),t.name=n[s],c&&(t.commit=n[s+2])}t.ref=\"\",t.filepathtype=\"\",t.filepath=\"\";var h=n.length>s&&n[s+1]===\"-\"?s+1:s;n.length>h+2&&[\"raw\",\"src\",\"blob\",\"tree\",\"edit\"].indexOf(n[h+1])>=0&&(t.filepathtype=n[h+1],t.ref=n[h+2],n.length>h+3&&(t.filepath=n.slice(h+3).join(\"/\"))),t.organization=t.owner;break}t.full_name||(t.full_name=t.owner,t.name&&(t.full_name&&(t.full_name+=\"/\"),t.full_name+=t.name)),t.owner.startsWith(\"scm/\")&&(t.source=\"bitbucket-server\",t.owner=t.owner.replace(\"scm/\",\"\"),t.organization=t.owner,t.full_name=t.owner+\"/\"+t.name);var p=/(projects|users)\\/(.*?)\\/repos\\/(.*?)((\\/.*$)|$)/,C=p.exec(t.pathname);return C!=null&&(t.source=\"bitbucket-server\",C[1]===\"users\"?t.owner=\"~\"+C[2]:t.owner=C[2],t.organization=t.owner,t.name=C[3],n=C[4].split(\"/\"),n.length>1&&([\"raw\",\"browse\"].indexOf(n[1])>=0?(t.filepathtype=n[1],n.length>2&&(t.filepath=n.slice(2).join(\"/\"))):n[1]===\"commits\"&&n.length>2&&(t.commit=n[2])),t.full_name=t.owner+\"/\"+t.name,t.query.at?t.ref=t.query.at:t.ref=\"\"),t}oO.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join(\"+\"):r.protocol);var t=r.port?\":\"+r.port:\"\",i=r.user||\"git\",n=r.git_suffix?\".git\":\"\";switch(e){case\"ssh\":return t?\"ssh://\"+i+\"@\"+r.resource+t+\"/\"+r.full_name+n:i+\"@\"+r.resource+\":\"+r.full_name+n;case\"git+ssh\":case\"ssh+git\":case\"ftp\":case\"ftps\":return e+\"://\"+i+\"@\"+r.resource+t+\"/\"+r.full_name+n;case\"http\":case\"https\":var s=r.token?e4e(r):r.user&&(r.protocols.includes(\"http\")||r.protocols.includes(\"https\"))?r.user+\"@\":\"\";return e+\"://\"+s+r.resource+t+\"/\"+t4e(r)+n;default:return r.href}};function e4e(r){switch(r.source){case\"bitbucket.org\":return\"x-token-auth:\"+r.token+\"@\";default:return r.token+\"@\"}}function t4e(r){switch(r.source){case\"bitbucket-server\":return\"scm/\"+r.full_name;default:return\"\"+r.full_name}}Nae.exports=oO});var xO=w((wyt,tAe)=>{var w4e=Qh(),B4e=Ih();function Q4e(r,e,t){(t!==void 0&&!B4e(r[e],t)||t===void 0&&!(e in r))&&w4e(r,e,t)}tAe.exports=Q4e});var iAe=w((Byt,rAe)=>{var b4e=gm(),S4e=Jo();function v4e(r){return S4e(r)&&b4e(r)}rAe.exports=v4e});var oAe=w((Qyt,sAe)=>{var x4e=Fc(),P4e=kQ(),D4e=Jo(),k4e=\"[object Object]\",R4e=Function.prototype,F4e=Object.prototype,nAe=R4e.toString,N4e=F4e.hasOwnProperty,L4e=nAe.call(Object);function T4e(r){if(!D4e(r)||x4e(r)!=k4e)return!1;var e=P4e(r);if(e===null)return!0;var t=N4e.call(e,\"constructor\")&&e.constructor;return typeof t==\"function\"&&t instanceof t&&nAe.call(t)==L4e}sAe.exports=T4e});var PO=w((byt,aAe)=>{function O4e(r,e){if(!(e===\"constructor\"&&typeof r[e]==\"function\")&&e!=\"__proto__\")return r[e]}aAe.exports=O4e});var lAe=w((Syt,AAe)=>{var M4e=Jh(),U4e=Wh();function K4e(r){return M4e(r,U4e(r))}AAe.exports=K4e});var pAe=w((vyt,hAe)=>{var cAe=xO(),H4e=YT(),G4e=JT(),Y4e=jT(),j4e=WT(),uAe=nm(),gAe=vs(),q4e=iAe(),J4e=lm(),W4e=K0(),z4e=Sn(),V4e=oAe(),X4e=oQ(),fAe=PO(),Z4e=lAe();function _4e(r,e,t,i,n,s,o){var a=fAe(r,t),l=fAe(e,t),c=o.get(l);if(c){cAe(r,t,c);return}var u=s?s(a,l,t+\"\",r,e,o):void 0,g=u===void 0;if(g){var f=gAe(l),h=!f&&J4e(l),p=!f&&!h&&X4e(l);u=l,f||h||p?gAe(a)?u=a:q4e(a)?u=Y4e(a):h?(g=!1,u=H4e(l,!0)):p?(g=!1,u=G4e(l,!0)):u=[]:V4e(l)||uAe(l)?(u=a,uAe(a)?u=Z4e(a):(!z4e(a)||W4e(a))&&(u=j4e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),cAe(r,t,u)}hAe.exports=_4e});var mAe=w((xyt,CAe)=>{var $4e=fm(),eWe=xO(),tWe=sL(),rWe=pAe(),iWe=Sn(),nWe=Wh(),sWe=PO();function dAe(r,e,t,i,n){r!==e&&tWe(e,function(s,o){if(n||(n=new $4e),iWe(s))rWe(r,e,o,t,dAe,i,n);else{var a=i?i(sWe(r,o),s,o+\"\",r,e,n):void 0;a===void 0&&(a=s),eWe(r,o,a)}},nWe)}CAe.exports=dAe});var IAe=w((Pyt,EAe)=>{var oWe=J0(),aWe=GN(),AWe=YN();function lWe(r,e){return AWe(aWe(r,e,oWe),r+\"\")}EAe.exports=lWe});var wAe=w((Dyt,yAe)=>{var cWe=Ih(),uWe=gm(),gWe=im(),fWe=Sn();function hWe(r,e,t){if(!fWe(t))return!1;var i=typeof e;return(i==\"number\"?uWe(t)&&gWe(e,t.length):i==\"string\"&&e in t)?cWe(t[e],r):!1}yAe.exports=hWe});var QAe=w((kyt,BAe)=>{var pWe=IAe(),dWe=wAe();function CWe(r){return pWe(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s==\"function\"?(n--,s):void 0,o&&dWe(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i<n;){var a=t[i];a&&r(e,a,i,s)}return e})}BAe.exports=CWe});var SAe=w((Ryt,bAe)=>{var mWe=mAe(),EWe=QAe(),IWe=EWe(function(r,e,t){mWe(r,e,t)});bAe.exports=IWe});var KAe=w((kwt,UAe)=>{var UO;UAe.exports=()=>(typeof UO>\"u\"&&(UO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),UO)});var ale=w((tBt,ole)=>{var zO=Symbol(\"arg flag\"),kn=class extends Error{constructor(e,t){super(e),this.name=\"ArgError\",this.code=t,Object.setPrototypeOf(this,kn.prototype)}};function uE(r,{argv:e=process.argv.slice(2),permissive:t=!1,stopAtPositional:i=!1}={}){if(!r)throw new kn(\"argument specification object is required\",\"ARG_CONFIG_NO_SPEC\");let n={_:[]},s={},o={};for(let a of Object.keys(r)){if(!a)throw new kn(\"argument key cannot be an empty string\",\"ARG_CONFIG_EMPTY_KEY\");if(a[0]!==\"-\")throw new kn(`argument key must start with '-' but found: '${a}'`,\"ARG_CONFIG_NONOPT_KEY\");if(a.length===1)throw new kn(`argument key must have a name; singular '-' keys are not allowed: ${a}`,\"ARG_CONFIG_NONAME_KEY\");if(typeof r[a]==\"string\"){s[a]=r[a];continue}let l=r[a],c=!1;if(Array.isArray(l)&&l.length===1&&typeof l[0]==\"function\"){let[u]=l;l=(g,f,h=[])=>(h.push(u(g,f,h[h.length-1])),h),c=u===Boolean||u[zO]===!0}else if(typeof l==\"function\")c=l===Boolean||l[zO]===!0;else throw new kn(`type missing or not a function or valid array type: ${a}`,\"ARG_CONFIG_VAD_TYPE\");if(a[1]!==\"-\"&&a.length>2)throw new kn(`short argument keys (with a single hyphen) must have only one character: ${a}`,\"ARG_CONFIG_SHORTOPT_TOOLONG\");o[a]=[l,c]}for(let a=0,l=e.length;a<l;a++){let c=e[a];if(i&&n._.length>0){n._=n._.concat(e.slice(a));break}if(c===\"--\"){n._=n._.concat(e.slice(a+1));break}if(c.length>1&&c[0]===\"-\"){let u=c[1]===\"-\"||c.length===2?[c]:c.slice(1).split(\"\").map(g=>`-${g}`);for(let g=0;g<u.length;g++){let f=u[g],[h,p]=f[1]===\"-\"?f.split(/=(.*)/,2):[f,void 0],C=h;for(;C in s;)C=s[C];if(!(C in o))if(t){n._.push(f);continue}else throw new kn(`unknown or unexpected option: ${h}`,\"ARG_UNKNOWN_OPTION\");let[y,B]=o[C];if(!B&&g+1<u.length)throw new kn(`option requires argument (but was followed by another short argument): ${h}`,\"ARG_MISSING_REQUIRED_SHORTARG\");if(B)n[C]=y(!0,C,n[C]);else if(p===void 0){if(e.length<a+2||e[a+1].length>1&&e[a+1][0]===\"-\"&&!(e[a+1].match(/^-?\\d*(\\.(?=\\d))?\\d*$/)&&(y===Number||typeof BigInt<\"u\"&&y===BigInt))){let v=h===C?\"\":` (alias for ${C})`;throw new kn(`option requires argument: ${h}${v}`,\"ARG_MISSING_REQUIRED_LONGARG\")}n[C]=y(e[a+1],C,n[C]),++a}else n[C]=y(p,C,n[C])}}else n._.push(c)}return n}uE.flag=r=>(r[zO]=!0,r);uE.COUNT=uE.flag((r,e,t)=>(t||0)+1);uE.ArgError=kn;ole.exports=uE});var mle=w((kBt,Cle)=>{var _O;Cle.exports=()=>(typeof _O>\"u\"&&(_O=J(\"zlib\").brotliDecompressSync(Buffer.from(\"W/EQYSRCt4MiaLkqOCpK+moWsCzgDfmn9MLIaFVyqjAK1yGeoPj6HSvExxngDitiau+Xqfp3Xk7PSgMma+aXSv5mxy1dbicN5xMilhYiCMBg4aJMQETd/IRWPwjS5prEC348COTPqbn/svnS8FewO2l9jbJhvQ/8rZxkmE4JRKmzqrZMlPrHq3tACrFClS0TNbdnmY5gUssNEllj3n9jqkrF87xy/X7qdpbprG30OQG5RCxHaJb2M2y+6a53Z4KFc6qTXbcg1Ho7rvx63/Qz+471FSTKVYoV5OvwWaVYmUpRhOk+fc9iHmYgYgCiBHKIdeB6/LXmdvedh3GiAJJbAsjvfKjdSMq8zWIbbagwwjJSlsr329srDQ2BgSgnDHrmzshtv1ulSWfp7F1JI7msS+kEBQdQOmunfLOUBsPTu9N7wHhif4uSxNtyDmIzJWGsSkrUs49PN1nqkSU0fWj2gCzZ8gs4QRbutmFWVfqJdzrf3SQGAZIAIQSx3btmssxRDvrw9Ue7ssxhm5ND2oKJh6gR7Hfb8v6p4Q45Z5B387/doUL99k08W7BLtozxzeEu+1d9sOwP5PNgIBc1a5P8s5pgLTsvpNt8mOKCHjDV4zU13j3x+SUZO3KKvWHGQMZ5xXXR/uoQeg75C5Cp+Yz9M0Cp2CbO/JcB3ECOsXRQrA3Yf19jeKG8f5mtWieWvUUyDg9C78uQBWMNdn3mq9oUxT3BiunPbqdHCwiN+wt+JfO3FLTxf85HBywqM7xZUiMGpy1ztOkEh7hXolBZUCL5oSYjNi43nVRoI6wkkB192fbbyjmFqL8f5SiVthulU99YxS08FedLOuD3YMn4NbfFeSH5NyY+2lXnHAEw0ITBp9w3VosV/8OUCHXso87cAq7dFnntFgkjBWx4cBPhHERFdxXSzwgnbRCY8NfzKaDKZVKiyA64CnTI9QGlGYwCmO+18VoSdPIQoU2MRuE/nF3A71fiyJn+q/aVsfACDWtlYadgK/9BOJ3d9MaEkGBKZR5CMOptdJaTfw9mp9HYw/+jw9e32xMFMfKWXsTC2H9aRSU2rEIr8a2Ivp3dW0m1mrz1FSZyly5jeS9BOfaLI0U6vpaIXgp0/1lnqfDHhZ+5gqUGp/d6LjDYtDW6bxjCtFxSQl9sRGKGlWJSd1m4fkwC1OS4Cp0wqfgd7ewB1rWTuYH6mgRHlhD8bTxCz/DPxqChTUHvJlnNZiHT+O8qb/6CitwQ7c4KbPSo3/dtHOEyR/KabkkxP7RyU3C1cl58pYHkg2E//7iLEhxB/QC7OHnq+ccslCT8d28uDpf7OL6M5c1bCssPMtL7jBWT9Y4iz9wyX0ARSGZiMiwRrKbxyNdXSHR0eN6S5iOA2MxSBCtjyarfGLV3VyWT70ug9s/QZ/20ds9+2nejvboAt3XW6lnFBSRt5yyRQzJawoJYsD6btx1B5wF5RVv/+bAfpDNM6NVGPFogwUEN5LbJrKN6Lcyw7vFRyvdhDTtRxfD410/Duk/opBUCKHrH4nCnw7r58q8DxKFmW/+M+omXYgrGXRoZe3gK0PYtu611OXltQumAExHdX0Xi7cJOep1j0ndxwB+yIKgb+5jCJghq20OyeCgDj5GNXvqIRx9yLGq8K+HswNtsX0SQcu2L73bJKxrPE1nnKUX3IVzt2TTn75AugsTDacsT9NxeODu9qo6dsHfiAy51L5qBUKdnYzRRQiERdDWvUlaSf8P4wxR9W7szSQlPFKpZtETwJnWUC0E+7xVr/ZcD0pb9tr8z0p7zlgNge2hSslSAy30IFlTtMfzouLUwEu6BrFkCQnQQRmueYxlxVbN8HZ9St1qbXV6CgnwYsU4RtaUxXfs8ap3siPQk7p2N4PwOAIhnQXboznQFp0nekFwZveuoGu1HOW6j+nfVMKzTp00a9b0kS90/0a6Yc3nXTYqRXhI3iBOVzZPkYZycJMP2CaV7lCf0AE8e4clCHS1aaFFmX4yeO3ZEVXW5kgU6qsJjwcsfpSkQqj0DxUTXLL4L6YZb0qosEIjcVmrXX2zP2jvOkbdUTEKxuq9WWOC/DufXaTY838Banq8pDpUg1CwV7RcUrX0RJYW7Yy3r1KgRnKQK35pw78Ao9Q0IkPceZyshw/XtcY+q8RvTJhg/UVpy+M2JYhVnDpJ6zdUYt5wR/rcWkuqDXT2JPAiXQbXQUTysq/mlRKyVGnEUfpFL34cB0/2XnN8yaBD5CgZwsAhc2WYr1TiXtftA6grhgYaU/NDzZt+F0CuQ54jhSKG0BBNusBwJatVivz5LDkCK2s9w5JjnYQFpPGfzXcYuOsbsPrIPx2k3c15ABH1ZNpMLDflua988xp1DVx4PYIWJxRfra9c8BanH7EVjYUlU/UxedhOdv1ip5mJcynEPCxGflXwQm8RNoWMtgcmwcSDBC9g6rNFSI1uXRoa25VSbCm2tVuke8aRHnFbofJt4xTr6IlYZ/5R+nsah5tWTtbv1jZGWq2hXmFu9WwZAdFwueIJiT3GEZk8hf4YROQxOE9G/oCm2K5Gfn9erlREu3z6Wtz4GHp6vRrvfg1nC02SyfzXfC2AoOPHjxkI9+2k+VsFKp5qIjzxipvc7Jyw2VAIiRJaJA7yWKSnWQFKBPWx9BjncB1ej0YWhJekQCgg5kEeSwNHPC4NFJCaV/K9Z8t+Jubj0JijMa1II5j3yFP1XAYMNJH0woLKKdRqexrEyn0iASHHOLl7+IcFmr4OAuNIuaiXiXbKSLb/blXY3cmQ3cb4ftbMXL4x9uGF9tA4S+Lx0lBl6rL6u8TW3Pj1TJ3bGKz+bU2lRkX48Jqgq5CKYmSED7YvQpXQNrHW5M6wjRU2XpNoi/0wkdktU+Wjrodhy8aY231kPdSG9fPz6lX5RUinl817N6JoOpWzbFzVTr96eKc2uukyK+ZpNO6KvhAQlqLsuSPFL8ILL4evRMJyfO0oY3iRtRmoqj9GF4JsSuZF0cJWXO0+fk3JH1j56Vt1oZdSfDHAeHWxi2k3KvUKJfqOuRY8wbbNLg8MnQ8Jzf2Vlj0C0gqZPJmw3yy0vZZpxUdnop3mlG9wN7vHLtXfpfybVOqBklYTuhDjICaOp422a3LYOzEWoSBUXlhD+Z1qX7nNS7dTF2HXrdE/OroHRhvEoZoXBwkNqrsg1ziinNJlBw69NbjjcZGM+SDaS9wg4w2iqHoAm7fvucaUmmjj9mmkLGL/dwDf4NypeV9cWUeaZy20DQOhxRiPTuuawNfeQrEy/5RpHa+y1QHF70gP26gF/w5I02R8INNzX/ekb/4MEIw9p6FFbcJ8IWpV9kQtnk+Nqbj06/pcZFYSBPKj0/NPtHXsL0yAnrwQFzQkRxrZ6dc4sTi3MT47m6YpxvCxnmInnc1dCco0BXTMjpb2YvhMXnpbF0+YMdExmO53jgahUWAkuyAu5lrEsRMrpst4sCo5YteFSCfieZiG/mZkgH/yivoE4IK8LCf+jW0AuHtXf9D7p+dfDZCcNvUWc1tmdfY9NI8Vzql9zvnBY0rNT1fm11jbT/Y/zS053xx/6c7GgSi1huMRp9ivJGgn0Kn1qk2Fb9QXikZh3t+Vxj37PqB6XB/ehVuSF2dYy7Fu43ofpn15zZ5UvAfcJe+c5U7b6qyWyeGJ1WqG1nwxVcz1Rl6TW0ZROkzLYG8ngpLqmERnARGQdJ8oxhrUKbAB0XVL7Gks/aWS9gHOr0tdheVPQoJ0I2kQ4QGMuM5InnbCWxcqzu2eSZwNgc0jH5l76JTJMN/dr49lCwTlsdz+XKOg61BmbZlZc3WBEQcV3A3oRdAnG/SPiP77YWo+OkC1Mi2QUSxFF2LnzTKfEsgmtrz7P3stboF8RjioXdnBraLxVd9rpEFmjiVpgZgHpIgSc6lDrqmJVL0+vU6UCjBn66RzKtRhCX57sIhx08XJsW6jS5c6vojPcp5IjHauRu+AIxUXh8Z9O7otSAt7eUO/LwkHQFX6nnAZg8xQIUhRIzT96t+M2f/YXeYFtnm0d34qtRVpCjxEVlDTn9Pa/vF7EWjkpysd2ZnGErVQ4egieI4moUWTlQdGi6GjROGIHPmpwlQLxaPCpOwpO4H0hFZNBQV9QgiAILk9YcTUoznLpsk6CIhap/d4mRZb4kojLN1ss1oFJhPoiGK6vDPeEt8j4e7+FNkwU0FVvGgnqYH2pNgBWB1S4rCng1N49OPMJ/Da+Zemj+BnRJTrGRcCLolxnzw5yKMFsmblhCcf8F/xVc6HrJHrgeqW7wj4rAq/rdu1WcaAFZ3l6tGPHeaS21kwH5Gfu137QJr9UQftq7FEP+mqBcKFmFp/tLPgoXksFqFj+4Uz1nEptGABwuY3RxNQrskVc0XoWpEjqtGy73f4F59bJk5XyAa7QlUKLQODFFRQ3VEeglbdAGDpzSkcjAlMzU03Rx7UfQerrG9E9Y1ISdBfiXFW5AcnDusVzVVy3f7muGvxFnq0S290lNJoNiQDlfXeyTb7wI3sfzwF86jM/vnvtGApvCRrWfkCCX2X+o7CnD3LaeltgGtG+DOK2vL0GNtTjfILtLf1UKs/usBJCDzGYMBocm0QgjpTkU+dWhJN59wKSuxn4rNmT2QzhzZwr7XrYnxn9iLTzoIjHeXlRnhxFT/4smFPBeZ+lYHRdGzqw9IT4uESAQ6cvzKTBlnjtXZl9/F7x7SsOyzdxPhWX5IGQsnjFybnXWiFuCKL81o4XhxH6OO173jwIsZDLm6ebeHDGr8zitC1T76DZXeZ+8Y05+IE6+RIGvx1WvnawMLbnysxaQwYZv66VKHTiOic8msbyS2N8bYiPSg2+P7APD/e2HPlemcSYApc3N872ppNbK++KobaWdzV7qqQRPy2Ly6B15M9ikqoXK+REgPIo2VB9OWqn30bOEhm0t8joJT4oRCOSe9uCc7MdAJHHTJw5LD06JsbQz5jgz9N461NFh3YYQgaRfdM0jess3XuemO2qwCwZCz99A5/+uY96GxPsFzS4/nR7QJmZ3CXL+HnzTt8V7zi8Kjh6VbL9KXPtiTZ1sOu3Rg/OwHMMliYcQ53dMHbNuOTSJMvzXUuH3BnzZJ24ea9MRpHsu4pEI68pK8eriwWzTVWV87uPzG+efBQDkrNZr+VFXviGhU9HXryapMemRY4boFQPspiBnaXOQo61uTn/pnQJQrgAz6mSeU+ozfQxZVpL5fdcSnvSpAaUUhb1lyG9aUmop21vHkltGbG2wNFNVzhJoFZTYEOoRGN+z8TBXkNCCt0RpFSVcP04362JN7upET1gejcu+911fnRjIszdMmckhJ7RDQ9XlWeE7PsGV2qZlc6YoPm+32BJ32Pg9YTrH3z7gPr8akI7iJffcwOSHNVXDskSZHUP1546Yj382b/8AAMz65R3Hi0z4JiJJ+Z5bLP4LKHrxIiY1gvZwtmh/keGXE6D/TJ/dKG4qcDZu37sw4FNQPRjM33/V5/f3IwAouMiddX5WOYSrEzvv6Wb/Qyg41+PtFvi5IWCvZMXnk70vZlk6kH//gwHE+RQK7teBDLU7juBpXMcna+m/W3eni3zUpYWpggX9txZ5tarymxSxMkiYTWEuqANdS/cRkvJ1kolsk3VMstm7ZC6ykoIfGbcchaHeKJmGfro3K7nHztPyLw35poyVHKdPiNdHbwsXnqpUVDXNrTuwwsXCgOr8r44L+83XCQS7c5TTJY9j+r+xMpJnU2xfosLrd6gJsFBovcYa+pTDZRT0j1CtumcGm9MhxLOIXWKijUbHQe8lzzXEShNANSD6gWIpKaEUdDuTwTHSnwFxMzCG5lwQpGYhTNm4QrQybMaehEd76OCDEKtFPopgQYG16hZDoPx42LhMmLU8QjAR39b6uLhJMGofD62GIeh6ElEdkKqRKzNoVxFscVr14blIzFSVIgq3cr3C5DpmnhE1hCnIbCLrL0jFfOiSW/kUONuj9M/Y6cBTkPuIUB93qcB/59g0pUnhRhWsWzo/AvuFTUifoy4fWG5YmOB5d3ODEOCEfjmj5eRs66QmIEr+tFWXFG34ZR4z2NxWNpCTfVxjDlOcCBDJQitGz6/WWmt9lpb/Hktnkz3SPx5jluFcQdBkBvtT25SrufHA9mW2+0l9bIMKNNOCBW1ztE1hwpQZ7GHCWgfUUTQWYnveH2VjvKiYOlB2tQT1XdCfwIafWVjdN5OAXrNvvpKEjZqBLF/lpJkt6cl9adpSgfAu0vcm8X1cJGqScFpzuYTWkNBPd66fXwtzQ/FqSMEfwrPRS5HmFPw4nM0QN1LQ9HdgNsV4NNYHV0UvKtdPYeyTFO1ZkDhXLMaMvCufZDomTDiHc0vuMA3U3uFkFRPFaKzt0rGt7ziuqBXWwWmE+zcAoB7saJYEkHtonf3wOxCpj8IKq3w5Wc3Y+dl7NY8wsjQmSHGM9FWt7Pr7Zq9u75Fftyufrx0ftxefrwkfpTeYn3+nxyNbMsxcAh4fIEFnCoOI5nV0tCKKU72tqIBgy8nsnyxGC6MBhmGrBEGOSY+EB/DgeAu76wn8RJ4mCDeJ8Cqs9NYjd3W0vzAw7ajAYMvdzJ9sxgunAYZBq3S/aXE+X129nZJbNkmywdYPHNl3XE8e1Rr4v24iNizE6Y/FjpZ1qrHov1EVXuX42r5cYOyDXQShzda3wozvN+qeSs9xnu/mYE1ItmcDgbJT4uWN/RP2unuOZKYKbh6cnggr3G8WGnx8YCzzdW40Ysp45WzRarOUtSSsqzaWTxn3gwCOQrM/JnN0/zJ/MSG2W9WtS8Hbz0dlPTGcOwiUfNPQjnjJPibPnGa8yfARU8InJztIi7AnUt8+QXgsUtr2DVO1NAxvo3DJJ4BlVeYO95PHLVlJ4WNEo0QwzTnGaE1NrW8fzWda4LgHj0ASDTsgDkEifbnJtzByC1ra8BSexmnH40tBNsd1jJ9VYOinKkNr5xsg2VKfrMkb8/w47Cn5WF6G39qeVzWGb1ONEk+VDtQbadtDA87rTKkX1jTc3Xx1Cq24YYlw1e1NP+8u95tzoXIyjq58DajVPyITHof8o6K4H4b9rna+d7iWIjna+pLWexPHtsrapk2a77WnrYXf+HZQ0RVvEncDS7fN3DTPWRPDIPU+zWiUyAMjc8FeqoKf8I5JaQ5W2q0/DG6z/QXF/YaaTXpcQpWO1vMj88y6nyj+mKyVNn5T2Z4kmfl4ZRFjXnntrKsaDigWLW+cEpXgQTr/OuVDLQeNJlfSokdseseEeJZvdKY2+8Ollzg1Nc0x9pHijBFe5gbtblUHVE/MGds3wLevW5kcBJsyxEg+EUrW4ufPhEmU87f/5EDB393DqdU0vgTbsOHmMazNaQxYpH6gb+uTt/m8ZSwdPh4n5w1j0Dzz7aOINYXn1FY+7yWuBH7toQ5H22nLfOLPeuBGeu5ZpRV9s9lvvI+fF67E3rzkVaczuDPQSar8e8r6jyolqV8ByiOi/cVYlLwAFUtbzD03mElyD7zybHt5qd3lrqPjQttqfbsa7aK2jOqcNDEObkzSbTZctYDCbjr9h0P3cRPFeqaRH21whhYN6VXFoGSomr22RoovOcUiES0LbfHlH7LEZzamJ6BDCMAXGsQxZseQof699gmEDnpj29WZTe3swUZFQqa3/dEjJhZ8rtA2K4bYecaZh7ieKeI+fuBiNGZAqBZxSZU9/Z33RDdeLFt0NW4w4R2OkAbObRPhs0sevHzeGcLu4gyDnQVRjdgHerjEFYasrbOEtingbB5b2MeD73XIT2GjndzYFQRS3K6N9gk7W3423B3AV6g4S+V9XD6cWjs7t/GY9xtCltnMELchmMF3i6id+dF8+PF8uPF9ON4BDLPtlJotDAA84VB6+D1LbOIASHg1ltqJC8TORXDo24BnC82eB28/tbZxJgwEsvvyRGxvLKaStfiRrU/qajB0apCKjK8pUen2raoOEQtsJZNHJ2ZHTnKJkFCt/xIUV4NgLrHnbN8OhQZMjQI0qZm7eEtL8hQr/NnpBr60RO2nMmOULPJsPdgLRHLmGCyJDF6jGlYV/+mYFkRXrF0VoqSo2uYS1SG6z51iRCZTImPfOGFVMZY6hJhOyZDcgNCmMl59AvQWNkjh3wYNdQit/jgDHmGt/dSYrvkB98MUL1/i7xKuY5/nZoujGgGMZNgbLW2NDPPnYfOuudm0E22bzHju3uh3EbEIlNI1BvS9P+/LHsX4WlJuramJIB61GNklu4nIyRl47Mb1rwBb3CXvUVH9kg+9t/HJVA816x7EWh3VaYvfEV0rtkdt5OfUuCmb/FTbKCPzhlVtkIlZKVpfJUAibzrqIAZF+weL9C2JT4EgyhUJf0bQOLCJHQC0/608AgmcqmFhjIANFUEiUVNf34Ig7CJ2Iz5oQsiLDoZhyxwuJMUSgCVOoqQMNSY1jaJmUqdkymRpw+dF4FEauT1bSN57vO1/I32w0PlwP7K2Eh87J+5jIcqlFYMx2/QIO/s9Ptkct8sh0QRYDOk3L5+nlZG9vCazjYt1vsztNkBf4OTPkeWUA3S7kCjtLjFCNWM1q8wcWefZo2L7DV3q0NASvndXrT3YKoP2ZO+xjLDEI3jH25z/8RN1VFgHdR1EMAd0ovXWR99HRQUrRY+ZNjWL7NZs/ShjA56162JafoZFwN6AVFhxQQD8a2seYxC4qKFwny2rkLisgPL0NIj/drQkZfc65m1iLd6qIYPv7kdMOInI6e4CEMLK8YHH4RlWZjDLCu8gYfKZ2e+yD+6D1DZ0cuLiJB4u93j9Eqe/ngjWHLfCgKeHgTNd7eC2x4i7gGzj8H4a9MlykI4nsPOta0MEw9prgYXtaGL996HqsIGFJTjIIYDGQIVpD/1RH35NUQfBWdUCCqP8GAIy+aSSwaJhgtegL7dFPzrcJUmBzE9Pk+dwOUezyK6CTvpCBF99ViafQJlcCieDwj3O5AmQmpfw+MJqZFWSzMcQaxdj4dwUlFNJGvWELMndpq6vO/zoPfXUmGYuvAysnkkE7+la09jUClrkaQ/JvwsKsWmV0GLqCRm1wmzd6xnhjvviq1CiUwPh82OYYdE7dn3+JyWa0gIP0rC9T4iGlHlIZ9lY9Uj0ng3SGFmJq6xK4W14tc5zSXDm1MgP8N47OSo7sUGMLQtalgPk3llTf/a+G9uY9HY7+HyHjM8zHidreeIkkogGNqKTOeqHCfHYl9E7b5aDqsqVznA/YHGiujTolW1kpM/wxJW3NNBKBC03l4kikDe3a8/P0qwXvSe/CfrzBWO3p8TgfAXoClzi86RECHTXtDY5wb0WmBsu+VWQ8lbzZBD12yjh1B4jBv5x/rvIqf3MapU0FErPg7T5xPH7Hqtx+WeSF+vukPJVfWiLA7bZ3R0iiG0qdxBscvepRvFx8ZGyQbzY8aXLvr1RAez6KDg503jK5V9JEjBpLWVN3suiERdSvyfeeKi5i5pYQQxqsXKOTa0gGedHHqEQsqfGSlAXRrLMZ5jQMiKrWHR/u0EUR5i8J10M74EdrjbboxgcMK0ycYOa3y/nkpvFWmbMtiW+P4nxliuOZlsSswt2zgAdNWuTVSqPxJOwvEubgzKkps2rgU14qxlVo/wzgHSm6LIHgHmOh8hPGV/FuGLSGFYuTf5/4lh4hGZ2EpeVhGR834BFlZUjpACd20LNReudHPWNwLWFNNhH9MCqwhN9LZsvq58lxWKiKeL2uPIktBZq1dwKKEl/Bb7Gf8XTsdBcWamBLU5K9czI0le7Sv+FXwP0CQ4ZHpYsyWrDajEwWOj4VA5kchWx9u8vzJ5+Lw77L3+T7JO7g/krNhVJGHUH4MtP6pau4QyGEOn+kOslczKOUBb/ydqrL4tJQs70DBpCqRioVfQzraN4lnufyyggQqdDh82IFrm9Rsup9OxWjn/GZuXxcv6Q0YJK6H7AjUtTG0UfnbSf1o1k+tA1YEGnTiwA8B//EH/+emrjH0s2/6P2aMx3jgzL3wBgdsH7mw6/jGyu6VbKRh3R2Nb3sT2bB9Fp7D8yAKrmOG50/arGV6hySImYSgBrbGAgIdzkaL4Pcp2ls8+B45MMt9kewfyG++zLPAPApxLUn/hQgjyJjREU3qiHb5YiLfcUym7q2duEKB1gxktimsYka6uUwHuXYiUxYJ1u73Ipes/v57zxZqiMjYjJh8878rqIzrBjcbW8Tmkyz7et8sepGpEwkyiU3DxE6PFeNGUn23EVMkbvLTesQVmtyQTHjTMZxUpFkXsl1872so7szuzLB0A7sl6p2rZ3Ecga/NmEtthC12OCKAzeAmxXK1P2GB2a+qXZyf6RFZrFp35E/NruabseyuzaCzntk5bmnnpBSP8BeEd7TCDBStbCRrmvhEzZg7jwFCV1ADcv7WApYc1yoOguey3OZUsgHTDhQTOHCK3/a8hQgQzaSO6YIPVtJ/zSpq8CILtUHiT0ftjtKfoA32Ebk0y/XZWv46U5+6f1LotMpfbAc1bMMm1xTq7UDbhnhBKdCnjTJSXdIVDjJHs8p/h8NCuQ08io/t7K25ZKhbrOFHQAPj1wsHyw1oJIc2kWkKTIWZ5Mrbd18QWn/wVDhjKSoaFvw+1phnx4Sw8VqlotzhvIuDyT7ToNhlcEBjXXRyg3eqeZB8mMQiH94ySG7/iAdPamgtTAQheYYOJDxivjVWdvJO/DkQ/f7l1Ulb5Jd4glO26GdAfrrh8YkOCJJp3vjyGI9Npy7LYfIkVdwABBrZD9eKFEWjZyPD9cf2VUI7pzZBSby2LG0N4AblqKpSgEZGneb4RiR+O0gmg9bDFQrycWiYcNdeayFpI7E5bbT/mt+2VsfKKSd2g7keY1XuhBp+o3GAbDYTQb5SSDd45xCZQwKN5KI0K+9BH7ldQyLBs/u/4O21/CXnE0biIDr/48fDQPDdkeCjX3o0PS7wbZaNcBAEx46TyfTPzJ5OAGyUaeqdFkbNgY8lcL5oknjOLSTK/QEBJ6zGd4yWMP2Yxaj+UOg+E0yF4+8Yp81m+EwxVBQdPipCRHHOWM8pf/TJZ84cUFaSu86cVRmTKhfH6SiVdsGSx1ptYSlZ7LD6jy7Avhy9vYwCjQW1byo5qAv00k21cyAywXSaULn/0vxZYSgnEIMUJzhikb9oKFrG0aP7sc8f/rRAgtoHkIgAW64Y2NMjBCM6xBq2+wXNnhL+H1R0sAO00gUtLJN1tJQzbjPA/BKll62rHkWHNxvBlWwSLgJrg0z4otGUMm+wt2nS0My9xGZrBQ4E14SQwJnUrGNGPk+np6HYtzV+5IfnS9XMEhZM978nu8Pdu5d0uCbmVc8HvT+s8ab6UnGHzr0igsmIX7DIDcHXFkfWixIg76i8hS/Wc6Zb31Uvq6mAo0c4ph4z6hkvmdyOlN2hp7RYIDsQXa0qt7vE0wE8xDv3+wg6jOwg1xvpg3kcIuBmcnwI+ytaxikGqYttjVUhtjGlJ7rqbnvNCkIJ8J6bN3S9pnNZ34xggdEbFAFUd8f/3nu95Xwfc8NFn1qiDbhjzIXtDNjD5ZJbUmDRkrJF7zQvsBrF+ChZORkY+FljS1hanu2wU0gZUBd+pY3m6pMZ7344PwD+ArTDbUcuCZCVWIxQFVqwavqSY+YUTdVCNGmsV7sJqO0Tm9sK9s3QlXwK/tlaunaGNIDonleSbZup1G/MdCfoQ4xtr2lZkuazivCfA8kUo8MbCAfNDCxK+Mv+5s8BiNolqEdoULnuBtmXQwIGzlPT6IEaUXtB3Y8T9gF0CAgUw/vKcgVuPfmpwfZx2XGEVtezqQ0dks/zCvuXEARmJMl9KQeEgXn7YAVULlcGSpxD8vNstchLQxEx9XpaRi3z9jWh54eZ5z6Fj4bDPyi08Q5Rjja+te9i4/6I1SbJk13N4rJKKoPSFdFOSgQ8ABRhtQIO5o6bg/kDdCk6ChN25fVxzuiNf7Mjf8PScN4d1n6bUbLm1ZPCOFpjMW4cLfOXfgrUMgvu9iwaGzX0WAn4CsMofkGY2fknj0Z/Ga4wl5ITSm8OuGtW2QaHewjxbFgvUw6FGuVjRKu/wDW2Am3ksbPxWdqcDfjUNMAX1e2vZigvKrpGCDItHxDhc8ojPazpyVOWJlTv+pUGG9IoZhCrHxFETfXsZ9ZqO4e5at/sKUNxJkSbQcYzvylZy2yX9uunikvLL5QXZ9YPM2zfsJM5chIOSkAZ0tKqcMKzKB1s23SxV+C4hqPERWJJ5pBcdd+2awse5G3BEqUrgBH6TvzbPp9oRz/WjLsEHtrEKFpUb8nQ6cdN0ZuRSLBgzHAZbPTq8RfDO3rlPIj+FbXKYJp/xkZCm830iobV6i70e+wMpGXc85mM85mM8tsd4Z8U+I/8P5U1KFfx3VjTmtDb68DZaL12EcsamMcsZ7B0wYzlB8ReaQMkxPzwWjDjzen86mKU989Da5q/6iHZAkyjRQj0psO22ocK1Mfl5x9CIQtUmPt+2Um3l5WDeYShdTunzNQ4b0G2PQJRraSp2pMuHsCX0fKsVQKkobjeg4+VP7YRJ38RFy3Py944daCoVrfXAofXijdFDcs9f8OYlNyDsfau9nS0BKbSovjtjl1KXFjwX+L8BY2lgvs/ByYZNvqcXsYlqLwmap1edVyrxwcnNRolNbJEiVNql3rFjfNkWa9tHH9VhKD/itQ0Yh83nhqhHraOkI7rWHjcvuP+r1Keu/HfUwZPtZh/798yA+mOjlvyku5oO5NlrOK1//h/fReU/XReekRH7ScKrzlyIkjWEg39nMpWzEmJ9H2i6jJ+bRT3XI+4UgtiPG97fcCAV3X4RJ3V00nTf1BvfYtf+vaIniUQI7ik/94diU/b9le78jIV8baLDU7p+17wyuajztNM0oiMCyU07HM1EAYY97achUehuxuFnBlEcVHpD4+t+v8TcFz2tlxntKv2Q0zqQUHeHqjoTIcp47z8CJvOOXhKjlf5j8zVOmqSgcEY+u242gZCQAUEeOpXp51gO5JTXr/qS2pm9sQ0wi54XVXAFNq2/7hc0FURVnSUVGOrrrJEw0VWVvHQlEaqL7euRMHuq/3ucvLJP6i6hHM8AG9MR6kKLqnjSBniO4HG/+F9VVRnEQXoenl08D88uqiNN8PCe15FQjRDx7dpiuyJiuCIZ+lyTCLT3iEWTBzDXAXFJTeusOKWg79WqbKxQkxpvQz99rKTHLJuNdQ7ULv05z+i/wHNTMiUYzXXLuPbLoZ4ACBsnYqYXcpgBOshg4/u0O3XqE5jFeVEtKhRFw2WOt/77rJR4qtv29zlx9CzevBYkYkmjaauAo+fp8ZbAaQ8e930Daw8Za4CO0TslkNxpLy2H7dcl0/BaTXKjmDIJ3DMbCF7+IXIx6KehkBpTWI4Rq2q2YkcDiBamsuAo8l2x45KVbv8zOVT62Str84nGbIJo9nId5a9Zuw6eAbSOyq2A02TMDEO+e/FQh4cm5mQsO1EKebth6wVLNgEgt7XH8J9uKmC0CXKGEfVUxSHQrHAemEK69cU2YUHxIImDrTLkUMl96JU3kb4ebuigj0H0XgBXii+oIMlMOVBAZeUDSpi0k52k7ZJSpipsr1Lcw7FpdRu1AU7mD21HvsQWaNxeNMfNZTMBzJrVXBx8F/P/LY0pXxRdw9v7leis2zNCygPk6Lg2BfIgzPjc02LvUdL1OEjq3KIOop9c9EKgPXK9RW+1Hl5hqp2+8jwRqvZuYYKc/jgOzxxWYAJJyczH1PpGOnIRa/YSdZ8Hn2+NNCOljHfCukk1Iom/fHvJ8FoBNNHd19Ty0n+qQsYhYc6hccrr0qUK+XGtao6Man1Wp7Fk5zW/TF57Pa9OncgUS1M7iGi6hunDCYmgKyQFLzFBTmiUT2cdaIWVr2y9QKBJZYdTZvk/rrNOqD6Nh6AEDtIORxeEv3GBK9ml/hEvsPcRwRmScdja8ho6cPYQgGfoI0cx/tRRcms83RppF1IqpZanmHu9YkResm2bdMKDp8MHAMt+a7mqoWJrQpsALN26gZ5L61atruolG0+EpPPSg58dhjJea4LJmM3wycX+QXa28P2pjv+jWlNCZtx8CMGjrjWSlcicp9RyZCn8EgWY6zpBtTc7gPYFS1w50Hd/vag9dWLkuWrulVEQD7Sv7ZV+OVSgx26CwQlSu+rVJxjhimFJVipFy45JCysxf2OwtEcewdLhgfFNAVCTdhPOyxUp9+LAnwjF36xlTHvxlZcAjdunD7BhXjVyuNyYjnZtlqTXGWCO0kFOo1zBEiu1DM3TD7z/j+iMs8sZs+y1l85sMHyLifVEWbG4brncg47fjd0f1gh/5HAEgv/R1qRrAvu7RIxcPTqFgvXs8XW4j3Iv5JSGjNGOBuql06W56486/tgjfqUpa/i4/rWPQcGLnOxpU1wr1xtbnPh8scUvxmZ2wB3tv0C1bTYM0IQ7eTjskj8DKyGzX3UCbiHX2P5U+ANUdDS8+Y50fjr1TKyuXgJqamYPWn1QK69JUguKXnTM+kGT4lSB6exwotza1tnbYvGQm6IV+nowQa97FHQ4wiryzi5mN7FObSET+LB1VVc6XmTwMxsCmjdYJVEflw5HKQS/llzNqs0iNVx9LQwrzy3UK+KkuR5jJ7ydVNt3WjVYvlMYeXU12z4wgSXvdljKvji/BFBrvVU9uPUlThoi7dKrxDSb1ORMX2aucAafqG4Ozf6jcwpbYcPGsgkwcj5oUjciBuclxtdJIWTpPHl6EJHeKmcQwDKqyXxaq+KXtYAitTbTby9io8hoPk1ECLINbHq1pAc+8+FfnjTw4RISYmURLAstUuqEXNuEMnpN6cg/Pj6JC4fPZTmKbF3kLyLK+nUXVUA0pirNGUXEZIlFH8gnp1Q+ti9OAG2mQIsLrspLTV9M5o984dLTMvviqZNvFHZuOcB8kxkNeDP1vbJR22Kq34PHmZ2C/56nURkX1a7Dr2OXePwzBu+VMM+wTqh1Y6xo43ty4m7l5+OU35viNJVZhW+O5Tg1HV/xHYdngDfHAE1nJeKQ4pZLNO0RvTRNRxSdZzuzUeU/8v22JQHtqC/YUUdw1ht6uAuW5dkBTI5F5MJOmiaZtzafYxhVK2tZJ1shbOgknG0TJ2Ur8wlU6+EhkvMWOvIIHij4MdblmCbsxXm+pXACkA9CyL7T/GcDxFv2f5J+3axuDzlrUyLb4eqENfv+MvyiUVBeVYel48tjCa/KsWED84RZ08/rkhMy5w4Ho2y98viaci3A8uk1fi41Vi7YZUhHycG6P/wI5TZ/4PC+TZknL4nFgv50j34izPnsittHA/5bZwlx+SQsKs63JSPd0XiMR/1r6ZL+62IISp68dJ99bndzi4Rfp53+BZxb5hmZr5Rk5F17VfcXXilrYRFpVnacAZ7vRxIU1z5yBn3cFSjInYRkktu3y5qfSiERzg2l1FoQx/zhvpIXxkMAp81OgMlTnt0RymmWujV2eEzouqnZUMQ7wrJJfKu6snA9igwcKVGDHO47cgY+UBHc74uiMKadenrsgPvYVc1cc4s6TEfABl7A7qAOR7BmFQ1cjdpXj2/ibTgq2YeObddoAHixGrOPRzwrWsKymuG2bZe+n4GQfqMGqN0dRD+pWOO23eOeUkp8c/TOmA6ZdkEL3XkUzyiQ2OshMlt5En5bKuS4Ij4D/L5gswS5yX72zBDrmYQfV1lrfSkcNESJSAfVT/r5xUBKgt5JjUn113iHIjSbwCd03Dxnz/YBAgEursORSrkthMPTrg3kdUWq3qfG+brbbeK8Fpihrglr0wqD/uxgxtwAYS8s651NN0bO+tSnjGUyHtkUkb4IJ+Dlszm+KDXBES4zzauj8Wid0tdJnDbJrvyE0+6euxaklnJ8NG9gvjnt2teq0/+Oz3ctrjqdCRn77EE0yYn+2/Xxc0BJYjLIeQVId1AsOIOGLzr1vYQPhY/jtVvIguZTA+45rgrJF9XKIogUmveMgzA5gVTD+AcuAZj1ArtsH2xt/1CinG9vaWQo842nPprym9gz7BhX24D0wa3lB1qhW3gbX/TdP5PLY+6dPb/g3eoc4E+19ltx3/5stheIuXP97X3syPLgYRgW5p1YAZ9hwhfbXzFlg53M5b4iOwPE7NLm5GyMDwMmHndlJ314IJh2b/YTP3nSafSa/WOavXro6HbqpDOoozRHUenIE22eBBc=\",\"base64\")).toString()),_O)});var ble=w((nM,sM)=>{(function(r){nM&&typeof nM==\"object\"&&typeof sM<\"u\"?sM.exports=r():typeof define==\"function\"&&define.amd?define([],r):typeof window<\"u\"?window.isWindows=r():typeof global<\"u\"?global.isWindows=r():typeof self<\"u\"?self.isWindows=r():this.isWindows=r()})(function(){\"use strict\";return function(){return process&&(process.platform===\"win32\"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var Ple=w((D0t,xle)=>{\"use strict\";oM.ifExists=mze;var np=J(\"util\"),Ls=J(\"path\"),Sle=ble(),pze=/^#!\\s*(?:\\/usr\\/bin\\/env)?\\s*([^ \\t]+)(.*)$/,dze={createPwshFile:!0,createCmdFile:Sle(),fs:J(\"fs\")},Cze=new Map([[\".js\",\"node\"],[\".cjs\",\"node\"],[\".mjs\",\"node\"],[\".cmd\",\"cmd\"],[\".bat\",\"cmd\"],[\".ps1\",\"pwsh\"],[\".sh\",\"sh\"]]);function vle(r){let e={...dze,...r},t=e.fs;return e.fs_={chmod:t.chmod?np.promisify(t.chmod):async()=>{},mkdir:np.promisify(t.mkdir),readFile:np.promisify(t.readFile),stat:np.promisify(t.stat),unlink:np.promisify(t.unlink),writeFile:np.promisify(t.writeFile)},e}async function oM(r,e,t){let i=vle(t);await i.fs_.stat(r),await Ize(r,e,i)}function mze(r,e,t){return oM(r,e,t).catch(()=>{})}function Eze(r,e){return e.fs_.unlink(r).catch(()=>{})}async function Ize(r,e,t){let i=await bze(r,t);return await yze(e,t),wze(r,e,i,t)}function yze(r,e){return e.fs_.mkdir(Ls.dirname(r),{recursive:!0})}function wze(r,e,t,i){let n=vle(i),s=[{generator:xze,extension:\"\"}];return n.createCmdFile&&s.push({generator:vze,extension:\".cmd\"}),n.createPwshFile&&s.push({generator:Pze,extension:\".ps1\"}),Promise.all(s.map(o=>Sze(r,e+o.extension,t,o.generator,n)))}function Bze(r,e){return Eze(r,e)}function Qze(r,e){return Dze(r,e)}async function bze(r,e){let n=(await e.fs_.readFile(r,\"utf8\")).trim().split(/\\r*\\n/)[0].match(pze);if(!n){let s=Ls.extname(r).toLowerCase();return{program:Cze.get(s)||null,additionalArgs:\"\"}}return{program:n[1],additionalArgs:n[2]}}async function Sze(r,e,t,i,n){let s=n.preserveSymlinks?\"--preserve-symlinks\":\"\",o=[t.additionalArgs,s].filter(a=>a).join(\" \");return n=Object.assign({},n,{prog:t.program,args:o}),await Bze(e,n),await n.fs_.writeFile(e,i(r,e,n),\"utf8\"),Qze(e,n)}function vze(r,e,t){let n=Ls.relative(Ls.dirname(e),r).split(\"/\").join(\"\\\\\"),s=Ls.isAbsolute(n)?`\"${n}\"`:`\"%~dp0\\\\${n}\"`,o,a=t.prog,l=t.args||\"\",c=aM(t.nodePath).win32;a?(o=`\"%~dp0\\\\${a}.exe\"`,n=s):(a=s,l=\"\",n=\"\");let u=t.progArgs?`${t.progArgs.join(\" \")} `:\"\",g=c?`@SET NODE_PATH=${c}\\r\n`:\"\";return o?g+=`@IF EXIST ${o} (\\r\n  ${o} ${l} ${n} ${u}%*\\r\n) ELSE (\\r\n  @SETLOCAL\\r\n  @SET PATHEXT=%PATHEXT:;.JS;=;%\\r\n  ${a} ${l} ${n} ${u}%*\\r\n)\\r\n`:g+=`@${a} ${l} ${n} ${u}%*\\r\n`,g}function xze(r,e,t){let i=Ls.relative(Ls.dirname(e),r),n=t.prog&&t.prog.split(\"\\\\\").join(\"/\"),s;i=i.split(\"\\\\\").join(\"/\");let o=Ls.isAbsolute(i)?`\"${i}\"`:`\"$basedir/${i}\"`,a=t.args||\"\",l=aM(t.nodePath).posix;n?(s=`\"$basedir/${t.prog}\"`,i=o):(n=o,a=\"\",i=\"\");let c=t.progArgs?`${t.progArgs.join(\" \")} `:\"\",u=`#!/bin/sh\nbasedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\\\\\,/,g')\")\n\ncase \\`uname\\` in\n    *CYGWIN*) basedir=\\`cygpath -w \"$basedir\"\\`;;\nesac\n\n`,g=t.nodePath?`export NODE_PATH=\"${l}\"\n`:\"\";return s?u+=`${g}if [ -x ${s} ]; then\n  exec ${s} ${a} ${i} ${c}\"$@\"\nelse\n  exec ${n} ${a} ${i} ${c}\"$@\"\nfi\n`:u+=`${g}${n} ${a} ${i} ${c}\"$@\"\nexit $?\n`,u}function Pze(r,e,t){let i=Ls.relative(Ls.dirname(e),r),n=t.prog&&t.prog.split(\"\\\\\").join(\"/\"),s=n&&`\"${n}$exe\"`,o;i=i.split(\"\\\\\").join(\"/\");let a=Ls.isAbsolute(i)?`\"${i}\"`:`\"$basedir/${i}\"`,l=t.args||\"\",c=aM(t.nodePath),u=c.win32,g=c.posix;s?(o=`\"$basedir/${t.prog}$exe\"`,i=a):(s=a,l=\"\",i=\"\");let f=t.progArgs?`${t.progArgs.join(\" \")} `:\"\",h=`#!/usr/bin/env pwsh\n$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n\n$exe=\"\"\n${t.nodePath?`$env_node_path=$env:NODE_PATH\n$env:NODE_PATH=\"${u}\"\n`:\"\"}if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n  # Fix case when both the Windows and Linux builds of Node\n  # are installed in the same directory\n  $exe=\".exe\"\n}`;return t.nodePath&&(h+=` else {\n  $env:NODE_PATH=\"${g}\"\n}`),o?h+=`\n$ret=0\nif (Test-Path ${o}) {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${o} ${l} ${i} ${f}$args\n  } else {\n    & ${o} ${l} ${i} ${f}$args\n  }\n  $ret=$LASTEXITCODE\n} else {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${s} ${l} ${i} ${f}$args\n  } else {\n    & ${s} ${l} ${i} ${f}$args\n  }\n  $ret=$LASTEXITCODE\n}\n${t.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $ret\n`:h+=`\n# Support pipeline input\nif ($MyInvocation.ExpectingInput) {\n  $input | & ${s} ${l} ${i} ${f}$args\n} else {\n  & ${s} ${l} ${i} ${f}$args\n}\n${t.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $LASTEXITCODE\n`,h}function Dze(r,e){return e.fs_.chmod(r,493)}function aM(r){if(!r)return{win32:\"\",posix:\"\"};let e=typeof r==\"string\"?r.split(Ls.delimiter):Array.from(r),t={};for(let i=0;i<e.length;i++){let n=e[i].split(\"/\").join(\"\\\\\"),s=Sle()?e[i].split(\"\\\\\").join(\"/\").replace(/^([^:\\\\/]*):/,(o,a)=>`/mnt/${a.toLowerCase()}`):e[i];t.win32=t.win32?`${t.win32};${n}`:n,t.posix=t.posix?`${t.posix}:${s}`:s,t[i]={win32:n,posix:s}}return t}xle.exports=oM});var EM=w((zQt,Vle)=>{Vle.exports=J(\"stream\")});var $le=w((VQt,_le)=>{\"use strict\";function Xle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function Xze(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?Xle(Object(t),!0).forEach(function(i){Zze(r,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):Xle(Object(t)).forEach(function(i){Object.defineProperty(r,i,Object.getOwnPropertyDescriptor(t,i))})}return r}function Zze(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function _ze(r,e){if(!(r instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function Zle(r,e){for(var t=0;t<e.length;t++){var i=e[t];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(r,i.key,i)}}function $ze(r,e,t){return e&&Zle(r.prototype,e),t&&Zle(r,t),r}var e5e=J(\"buffer\"),pb=e5e.Buffer,t5e=J(\"util\"),IM=t5e.inspect,r5e=IM&&IM.custom||\"inspect\";function i5e(r,e,t){pb.prototype.copy.call(r,e,t)}_le.exports=function(){function r(){_ze(this,r),this.head=null,this.tail=null,this.length=0}return $ze(r,[{key:\"push\",value:function(t){var i={data:t,next:null};this.length>0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:\"unshift\",value:function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:\"shift\",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(t){if(this.length===0)return\"\";for(var i=this.head,n=\"\"+i.data;i=i.next;)n+=t+i.data;return n}},{key:\"concat\",value:function(t){if(this.length===0)return pb.alloc(0);for(var i=pb.allocUnsafe(t>>>0),n=this.head,s=0;n;)i5e(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:\"consume\",value:function(t,i){var n;return t<this.head.data.length?(n=this.head.data.slice(0,t),this.head.data=this.head.data.slice(t)):t===this.head.data.length?n=this.shift():n=i?this._getString(t):this._getBuffer(t),n}},{key:\"first\",value:function(){return this.head.data}},{key:\"_getString\",value:function(t){var i=this.head,n=1,s=i.data;for(t-=s.length;i=i.next;){var o=i.data,a=t>o.length?o.length:t;if(a===o.length?s+=o:s+=o.slice(0,t),t-=a,t===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:\"_getBuffer\",value:function(t){var i=pb.allocUnsafe(t),n=this.head,s=1;for(n.data.copy(i),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(i,i.length-t,0,a),t-=a,t===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:r5e,value:function(t,i){return IM(this,Xze({},i,{depth:0,customInspect:!1}))}}]),r}()});var wM=w((XQt,tce)=>{\"use strict\";function n5e(r,e){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(yM,this,r)):process.nextTick(yM,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(s){!e&&s?t._writableState?t._writableState.errorEmitted?process.nextTick(db,t):(t._writableState.errorEmitted=!0,process.nextTick(ece,t,s)):process.nextTick(ece,t,s):e?(process.nextTick(db,t),e(s)):process.nextTick(db,t)}),this)}function ece(r,e){yM(r,e),db(r)}function db(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit(\"close\")}function s5e(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function yM(r,e){r.emit(\"error\",e)}function o5e(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit(\"error\",e)}tce.exports={destroy:n5e,undestroy:s5e,errorOrDestroy:o5e}});var Sl=w((ZQt,nce)=>{\"use strict\";var ice={};function Os(r,e,t){t||(t=Error);function i(s,o,a){return typeof e==\"string\"?e:e(s,o,a)}class n extends t{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=t.name,n.prototype.code=r,ice[r]=n}function rce(r,e){if(Array.isArray(r)){let t=r.length;return r=r.map(i=>String(i)),t>2?`one of ${e} ${r.slice(0,t-1).join(\", \")}, or `+r[t-1]:t===2?`one of ${e} ${r[0]} or ${r[1]}`:`of ${e} ${r[0]}`}else return`of ${e} ${String(r)}`}function a5e(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function A5e(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function l5e(r,e,t){return typeof t!=\"number\"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}Os(\"ERR_INVALID_OPT_VALUE\",function(r,e){return'The value \"'+e+'\" is invalid for option \"'+r+'\"'},TypeError);Os(\"ERR_INVALID_ARG_TYPE\",function(r,e,t){let i;typeof e==\"string\"&&a5e(e,\"not \")?(i=\"must not be\",e=e.replace(/^not /,\"\")):i=\"must be\";let n;if(A5e(r,\" argument\"))n=`The ${r} ${i} ${rce(e,\"type\")}`;else{let s=l5e(r,\".\")?\"property\":\"argument\";n=`The \"${r}\" ${s} ${i} ${rce(e,\"type\")}`}return n+=`. Received type ${typeof t}`,n},TypeError);Os(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\");Os(\"ERR_METHOD_NOT_IMPLEMENTED\",function(r){return\"The \"+r+\" method is not implemented\"});Os(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\");Os(\"ERR_STREAM_DESTROYED\",function(r){return\"Cannot call \"+r+\" after a stream was destroyed\"});Os(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\");Os(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\");Os(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\");Os(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError);Os(\"ERR_UNKNOWN_ENCODING\",function(r){return\"Unknown encoding: \"+r},TypeError);Os(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\");nce.exports.codes=ice});var BM=w((_Qt,sce)=>{\"use strict\";var c5e=Sl().codes.ERR_INVALID_OPT_VALUE;function u5e(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function g5e(r,e,t,i){var n=u5e(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:\"highWaterMark\";throw new c5e(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}sce.exports={getHighWaterMark:g5e}});var oce=w(($Qt,QM)=>{typeof Object.create==\"function\"?QM.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:QM.exports=function(e,t){if(t){e.super_=t;var i=function(){};i.prototype=t.prototype,e.prototype=new i,e.prototype.constructor=e}}});var vl=w((ebt,SM)=>{try{if(bM=J(\"util\"),typeof bM.inherits!=\"function\")throw\"\";SM.exports=bM.inherits}catch{SM.exports=oce()}var bM});var Ace=w((tbt,ace)=>{ace.exports=J(\"util\").deprecate});var PM=w((rbt,hce)=>{\"use strict\";hce.exports=Tr;function cce(r){var e=this;this.next=null,this.entry=null,this.finish=function(){U5e(e,r)}}var ap;Tr.WritableState=dE;var f5e={deprecate:Ace()},uce=EM(),mb=J(\"buffer\").Buffer,h5e=global.Uint8Array||function(){};function p5e(r){return mb.from(r)}function d5e(r){return mb.isBuffer(r)||r instanceof h5e}var xM=wM(),C5e=BM(),m5e=C5e.getHighWaterMark,xl=Sl().codes,E5e=xl.ERR_INVALID_ARG_TYPE,I5e=xl.ERR_METHOD_NOT_IMPLEMENTED,y5e=xl.ERR_MULTIPLE_CALLBACK,w5e=xl.ERR_STREAM_CANNOT_PIPE,B5e=xl.ERR_STREAM_DESTROYED,Q5e=xl.ERR_STREAM_NULL_VALUES,b5e=xl.ERR_STREAM_WRITE_AFTER_END,S5e=xl.ERR_UNKNOWN_ENCODING,Ap=xM.errorOrDestroy;vl()(Tr,uce);function v5e(){}function dE(r,e,t){ap=ap||qu(),r=r||{},typeof t!=\"boolean\"&&(t=e instanceof ap),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=m5e(this,r,\"writableHighWaterMark\",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=r.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=r.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){N5e(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new cce(this)}dE.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(dE.prototype,\"buffer\",{get:f5e.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch{}})();var Cb;typeof Symbol==\"function\"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==\"function\"?(Cb=Function.prototype[Symbol.hasInstance],Object.defineProperty(Tr,Symbol.hasInstance,{value:function(e){return Cb.call(this,e)?!0:this!==Tr?!1:e&&e._writableState instanceof dE}})):Cb=function(e){return e instanceof this};function Tr(r){ap=ap||qu();var e=this instanceof ap;if(!e&&!Cb.call(Tr,this))return new Tr(r);this._writableState=new dE(r,this,e),this.writable=!0,r&&(typeof r.write==\"function\"&&(this._write=r.write),typeof r.writev==\"function\"&&(this._writev=r.writev),typeof r.destroy==\"function\"&&(this._destroy=r.destroy),typeof r.final==\"function\"&&(this._final=r.final)),uce.call(this)}Tr.prototype.pipe=function(){Ap(this,new w5e)};function x5e(r,e){var t=new b5e;Ap(r,t),process.nextTick(e,t)}function P5e(r,e,t,i){var n;return t===null?n=new Q5e:typeof t!=\"string\"&&!e.objectMode&&(n=new E5e(\"chunk\",[\"string\",\"Buffer\"],t)),n?(Ap(r,n),process.nextTick(i,n),!1):!0}Tr.prototype.write=function(r,e,t){var i=this._writableState,n=!1,s=!i.objectMode&&d5e(r);return s&&!mb.isBuffer(r)&&(r=p5e(r)),typeof e==\"function\"&&(t=e,e=null),s?e=\"buffer\":e||(e=i.defaultEncoding),typeof t!=\"function\"&&(t=v5e),i.ending?x5e(this,t):(s||P5e(this,i,r,t))&&(i.pendingcb++,n=k5e(this,i,s,r,e,t)),n};Tr.prototype.cork=function(){this._writableState.corked++};Tr.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&gce(this,r))};Tr.prototype.setDefaultEncoding=function(e){if(typeof e==\"string\"&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new S5e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Tr.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function D5e(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e==\"string\"&&(e=mb.from(e,t)),e}Object.defineProperty(Tr.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function k5e(r,e,t,i,n,s){if(!t){var o=D5e(e,i,n);i!==o&&(t=!0,n=\"buffer\",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length<e.highWaterMark;if(l||(e.needDrain=!0),e.writing||e.corked){var c=e.lastBufferedRequest;e.lastBufferedRequest={chunk:i,encoding:n,isBuf:t,callback:s,next:null},c?c.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else vM(r,e,!1,a,i,n,s);return l}function vM(r,e,t,i,n,s,o){e.writelen=i,e.writecb=o,e.writing=!0,e.sync=!0,e.destroyed?e.onwrite(new B5e(\"write\")):t?r._writev(n,e.onwrite):r._write(n,s,e.onwrite),e.sync=!1}function R5e(r,e,t,i,n){--e.pendingcb,t?(process.nextTick(n,i),process.nextTick(pE,r,e),r._writableState.errorEmitted=!0,Ap(r,i)):(n(i),r._writableState.errorEmitted=!0,Ap(r,i),pE(r,e))}function F5e(r){r.writing=!1,r.writecb=null,r.length-=r.writelen,r.writelen=0}function N5e(r,e){var t=r._writableState,i=t.sync,n=t.writecb;if(typeof n!=\"function\")throw new y5e;if(F5e(t),e)R5e(r,t,i,e,n);else{var s=fce(t)||r.destroyed;!s&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&gce(r,t),i?process.nextTick(lce,r,t,s,n):lce(r,t,s,n)}}function lce(r,e,t,i){t||L5e(r,e),e.pendingcb--,i(),pE(r,e)}function L5e(r,e){e.length===0&&e.needDrain&&(e.needDrain=!1,r.emit(\"drain\"))}function gce(r,e){e.bufferProcessing=!0;var t=e.bufferedRequest;if(r._writev&&t&&t.next){var i=e.bufferedRequestCount,n=new Array(i),s=e.corkedRequestsFree;s.entry=t;for(var o=0,a=!0;t;)n[o]=t,t.isBuf||(a=!1),t=t.next,o+=1;n.allBuffers=a,vM(r,e,!0,e.length,n,\"\",s.finish),e.pendingcb++,e.lastBufferedRequest=null,s.next?(e.corkedRequestsFree=s.next,s.next=null):e.corkedRequestsFree=new cce(e),e.bufferedRequestCount=0}else{for(;t;){var l=t.chunk,c=t.encoding,u=t.callback,g=e.objectMode?1:l.length;if(vM(r,e,!1,g,l,c,u),t=t.next,e.bufferedRequestCount--,e.writing)break}t===null&&(e.lastBufferedRequest=null)}e.bufferedRequest=t,e.bufferProcessing=!1}Tr.prototype._write=function(r,e,t){t(new I5e(\"_write()\"))};Tr.prototype._writev=null;Tr.prototype.end=function(r,e,t){var i=this._writableState;return typeof r==\"function\"?(t=r,r=null,e=null):typeof e==\"function\"&&(t=e,e=null),r!=null&&this.write(r,e),i.corked&&(i.corked=1,this.uncork()),i.ending||M5e(this,i,t),this};Object.defineProperty(Tr.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function fce(r){return r.ending&&r.length===0&&r.bufferedRequest===null&&!r.finished&&!r.writing}function T5e(r,e){r._final(function(t){e.pendingcb--,t&&Ap(r,t),e.prefinished=!0,r.emit(\"prefinish\"),pE(r,e)})}function O5e(r,e){!e.prefinished&&!e.finalCalled&&(typeof r._final==\"function\"&&!e.destroyed?(e.pendingcb++,e.finalCalled=!0,process.nextTick(T5e,r,e)):(e.prefinished=!0,r.emit(\"prefinish\")))}function pE(r,e){var t=fce(e);if(t&&(O5e(r,e),e.pendingcb===0&&(e.finished=!0,r.emit(\"finish\"),e.autoDestroy))){var i=r._readableState;(!i||i.autoDestroy&&i.endEmitted)&&r.destroy()}return t}function M5e(r,e,t){e.ending=!0,pE(r,e),t&&(e.finished?process.nextTick(t):r.once(\"finish\",t)),e.ended=!0,r.writable=!1}function U5e(r,e,t){var i=r.entry;for(r.entry=null;i;){var n=i.callback;e.pendingcb--,n(t),i=i.next}e.corkedRequestsFree.next=r}Object.defineProperty(Tr.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(e){!this._writableState||(this._writableState.destroyed=e)}});Tr.prototype.destroy=xM.destroy;Tr.prototype._undestroy=xM.undestroy;Tr.prototype._destroy=function(r,e){e(r)}});var qu=w((ibt,dce)=>{\"use strict\";var K5e=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};dce.exports=aa;var pce=RM(),kM=PM();vl()(aa,pce);for(DM=K5e(kM.prototype),Eb=0;Eb<DM.length;Eb++)Ib=DM[Eb],aa.prototype[Ib]||(aa.prototype[Ib]=kM.prototype[Ib]);var DM,Ib,Eb;function aa(r){if(!(this instanceof aa))return new aa(r);pce.call(this,r),kM.call(this,r),this.allowHalfOpen=!0,r&&(r.readable===!1&&(this.readable=!1),r.writable===!1&&(this.writable=!1),r.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once(\"end\",H5e)))}Object.defineProperty(aa.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});Object.defineProperty(aa.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});Object.defineProperty(aa.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function H5e(){this._writableState.ended||process.nextTick(G5e,this)}function G5e(r){r.end()}Object.defineProperty(aa.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(e){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=e,this._writableState.destroyed=e)}})});var Ece=w((FM,mce)=>{var yb=J(\"buffer\"),fA=yb.Buffer;function Cce(r,e){for(var t in r)e[t]=r[t]}fA.from&&fA.alloc&&fA.allocUnsafe&&fA.allocUnsafeSlow?mce.exports=yb:(Cce(yb,FM),FM.Buffer=lp);function lp(r,e,t){return fA(r,e,t)}Cce(fA,lp);lp.from=function(r,e,t){if(typeof r==\"number\")throw new TypeError(\"Argument must not be a number\");return fA(r,e,t)};lp.alloc=function(r,e,t){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");var i=fA(r);return e!==void 0?typeof t==\"string\"?i.fill(e,t):i.fill(e):i.fill(0),i};lp.allocUnsafe=function(r){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");return fA(r)};lp.allocUnsafeSlow=function(r){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");return yb.SlowBuffer(r)}});var TM=w(yce=>{\"use strict\";var LM=Ece().Buffer,Ice=LM.isEncoding||function(r){switch(r=\"\"+r,r&&r.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function Y5e(r){if(!r)return\"utf8\";for(var e;;)switch(r){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return r;default:if(e)return;r=(\"\"+r).toLowerCase(),e=!0}}function j5e(r){var e=Y5e(r);if(typeof e!=\"string\"&&(LM.isEncoding===Ice||!Ice(r)))throw new Error(\"Unknown encoding: \"+r);return e||r}yce.StringDecoder=CE;function CE(r){this.encoding=j5e(r);var e;switch(this.encoding){case\"utf16le\":this.text=X5e,this.end=Z5e,e=4;break;case\"utf8\":this.fillLast=W5e,e=4;break;case\"base64\":this.text=_5e,this.end=$5e,e=3;break;default:this.write=e6e,this.end=t6e;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=LM.allocUnsafe(e)}CE.prototype.write=function(r){if(r.length===0)return\"\";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return\"\";t=this.lastNeed,this.lastNeed=0}else t=0;return t<r.length?e?e+this.text(r,t):this.text(r,t):e||\"\"};CE.prototype.end=V5e;CE.prototype.text=z5e;CE.prototype.fillLast=function(r){if(this.lastNeed<=r.length)return r.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,this.lastTotal-this.lastNeed,0,r.length),this.lastNeed-=r.length};function NM(r){return r<=127?0:r>>5===6?2:r>>4===14?3:r>>3===30?4:r>>6===2?-1:-2}function q5e(r,e,t){var i=e.length-1;if(i<t)return 0;var n=NM(e[i]);return n>=0?(n>0&&(r.lastNeed=n-1),n):--i<t||n===-2?0:(n=NM(e[i]),n>=0?(n>0&&(r.lastNeed=n-2),n):--i<t||n===-2?0:(n=NM(e[i]),n>=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function J5e(r,e,t){if((e[0]&192)!==128)return r.lastNeed=0,\"\\uFFFD\";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return r.lastNeed=1,\"\\uFFFD\";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return r.lastNeed=2,\"\\uFFFD\"}}function W5e(r){var e=this.lastTotal-this.lastNeed,t=J5e(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function z5e(r,e){var t=q5e(this,r,e);if(!this.lastNeed)return r.toString(\"utf8\",e);this.lastTotal=t;var i=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,i),r.toString(\"utf8\",e,i)}function V5e(r){var e=r&&r.length?this.write(r):\"\";return this.lastNeed?e+\"\\uFFFD\":e}function X5e(r,e){if((r.length-e)%2===0){var t=r.toString(\"utf16le\",e);if(t){var i=t.charCodeAt(t.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString(\"utf16le\",e,r.length-1)}function Z5e(r){var e=r&&r.length?this.write(r):\"\";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,t)}return e}function _5e(r,e){var t=(r.length-e)%3;return t===0?r.toString(\"base64\",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString(\"base64\",e,r.length-t))}function $5e(r){var e=r&&r.length?this.write(r):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function e6e(r){return r.toString(this.encoding)}function t6e(r){return r&&r.length?this.write(r):\"\"}});var wb=w((sbt,Qce)=>{\"use strict\";var wce=Sl().codes.ERR_STREAM_PREMATURE_CLOSE;function r6e(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,i=new Array(t),n=0;n<t;n++)i[n]=arguments[n];r.apply(this,i)}}}function i6e(){}function n6e(r){return r.setHeader&&typeof r.abort==\"function\"}function Bce(r,e,t){if(typeof e==\"function\")return Bce(r,null,e);e||(e={}),t=r6e(t||i6e);var i=e.readable||e.readable!==!1&&r.readable,n=e.writable||e.writable!==!1&&r.writable,s=function(){r.writable||a()},o=r._writableState&&r._writableState.finished,a=function(){n=!1,o=!0,i||t.call(r)},l=r._readableState&&r._readableState.endEmitted,c=function(){i=!1,l=!0,n||t.call(r)},u=function(p){t.call(r,p)},g=function(){var p;if(i&&!l)return(!r._readableState||!r._readableState.ended)&&(p=new wce),t.call(r,p);if(n&&!o)return(!r._writableState||!r._writableState.ended)&&(p=new wce),t.call(r,p)},f=function(){r.req.on(\"finish\",a)};return n6e(r)?(r.on(\"complete\",a),r.on(\"abort\",g),r.req?f():r.on(\"request\",f)):n&&!r._writableState&&(r.on(\"end\",s),r.on(\"close\",s)),r.on(\"end\",c),r.on(\"finish\",a),e.error!==!1&&r.on(\"error\",u),r.on(\"close\",g),function(){r.removeListener(\"complete\",a),r.removeListener(\"abort\",g),r.removeListener(\"request\",f),r.req&&r.req.removeListener(\"finish\",a),r.removeListener(\"end\",s),r.removeListener(\"close\",s),r.removeListener(\"finish\",a),r.removeListener(\"end\",c),r.removeListener(\"error\",u),r.removeListener(\"close\",g)}}Qce.exports=Bce});var Sce=w((obt,bce)=>{\"use strict\";var Bb;function Pl(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var s6e=wb(),Dl=Symbol(\"lastResolve\"),Ju=Symbol(\"lastReject\"),mE=Symbol(\"error\"),Qb=Symbol(\"ended\"),Wu=Symbol(\"lastPromise\"),OM=Symbol(\"handlePromise\"),zu=Symbol(\"stream\");function kl(r,e){return{value:r,done:e}}function o6e(r){var e=r[Dl];if(e!==null){var t=r[zu].read();t!==null&&(r[Wu]=null,r[Dl]=null,r[Ju]=null,e(kl(t,!1)))}}function a6e(r){process.nextTick(o6e,r)}function A6e(r,e){return function(t,i){r.then(function(){if(e[Qb]){t(kl(void 0,!0));return}e[OM](t,i)},i)}}var l6e=Object.getPrototypeOf(function(){}),c6e=Object.setPrototypeOf((Bb={get stream(){return this[zu]},next:function(){var e=this,t=this[mE];if(t!==null)return Promise.reject(t);if(this[Qb])return Promise.resolve(kl(void 0,!0));if(this[zu].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[mE]?a(e[mE]):o(kl(void 0,!0))})});var i=this[Wu],n;if(i)n=new Promise(A6e(i,this));else{var s=this[zu].read();if(s!==null)return Promise.resolve(kl(s,!1));n=new Promise(this[OM])}return this[Wu]=n,n}},Pl(Bb,Symbol.asyncIterator,function(){return this}),Pl(Bb,\"return\",function(){var e=this;return new Promise(function(t,i){e[zu].destroy(null,function(n){if(n){i(n);return}t(kl(void 0,!0))})})}),Bb),l6e),u6e=function(e){var t,i=Object.create(c6e,(t={},Pl(t,zu,{value:e,writable:!0}),Pl(t,Dl,{value:null,writable:!0}),Pl(t,Ju,{value:null,writable:!0}),Pl(t,mE,{value:null,writable:!0}),Pl(t,Qb,{value:e._readableState.endEmitted,writable:!0}),Pl(t,OM,{value:function(s,o){var a=i[zu].read();a?(i[Wu]=null,i[Dl]=null,i[Ju]=null,s(kl(a,!1))):(i[Dl]=s,i[Ju]=o)},writable:!0}),t));return i[Wu]=null,s6e(e,function(n){if(n&&n.code!==\"ERR_STREAM_PREMATURE_CLOSE\"){var s=i[Ju];s!==null&&(i[Wu]=null,i[Dl]=null,i[Ju]=null,s(n)),i[mE]=n;return}var o=i[Dl];o!==null&&(i[Wu]=null,i[Dl]=null,i[Ju]=null,o(kl(void 0,!0))),i[Qb]=!0}),e.on(\"readable\",a6e.bind(null,i)),i};bce.exports=u6e});var Dce=w((abt,Pce)=>{\"use strict\";function vce(r,e,t,i,n,s,o){try{var a=r[s](o),l=a.value}catch(c){t(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function g6e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){vce(s,i,n,o,a,\"next\",l)}function a(l){vce(s,i,n,o,a,\"throw\",l)}o(void 0)})}}function xce(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function f6e(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?xce(Object(t),!0).forEach(function(i){h6e(r,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):xce(Object(t)).forEach(function(i){Object.defineProperty(r,i,Object.getOwnPropertyDescriptor(t,i))})}return r}function h6e(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var p6e=Sl().codes.ERR_INVALID_ARG_TYPE;function d6e(r,e,t){var i;if(e&&typeof e.next==\"function\")i=e;else if(e&&e[Symbol.asyncIterator])i=e[Symbol.asyncIterator]();else if(e&&e[Symbol.iterator])i=e[Symbol.iterator]();else throw new p6e(\"iterable\",[\"Iterable\"],e);var n=new r(f6e({objectMode:!0},t)),s=!1;n._read=function(){s||(s=!0,o())};function o(){return a.apply(this,arguments)}function a(){return a=g6e(function*(){try{var l=yield i.next(),c=l.value,u=l.done;u?n.push(null):n.push(yield c)?o():s=!1}catch(g){n.destroy(g)}}),a.apply(this,arguments)}return n}Pce.exports=d6e});var RM=w((lbt,Kce)=>{\"use strict\";Kce.exports=Kt;var cp;Kt.ReadableState=Nce;var Abt=J(\"events\").EventEmitter,Fce=function(e,t){return e.listeners(t).length},IE=EM(),bb=J(\"buffer\").Buffer,C6e=global.Uint8Array||function(){};function m6e(r){return bb.from(r)}function E6e(r){return bb.isBuffer(r)||r instanceof C6e}var MM=J(\"util\"),Dt;MM&&MM.debuglog?Dt=MM.debuglog(\"stream\"):Dt=function(){};var I6e=$le(),qM=wM(),y6e=BM(),w6e=y6e.getHighWaterMark,Sb=Sl().codes,B6e=Sb.ERR_INVALID_ARG_TYPE,Q6e=Sb.ERR_STREAM_PUSH_AFTER_EOF,b6e=Sb.ERR_METHOD_NOT_IMPLEMENTED,S6e=Sb.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,up,UM,KM;vl()(Kt,IE);var EE=qM.errorOrDestroy,HM=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function v6e(r,e,t){if(typeof r.prependListener==\"function\")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function Nce(r,e,t){cp=cp||qu(),r=r||{},typeof t!=\"boolean\"&&(t=e instanceof cp),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=w6e(this,r,\"readableHighWaterMark\",t),this.buffer=new I6e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(up||(up=TM().StringDecoder),this.decoder=new up(r.encoding),this.encoding=r.encoding)}function Kt(r){if(cp=cp||qu(),!(this instanceof Kt))return new Kt(r);var e=this instanceof cp;this._readableState=new Nce(r,this,e),this.readable=!0,r&&(typeof r.read==\"function\"&&(this._read=r.read),typeof r.destroy==\"function\"&&(this._destroy=r.destroy)),IE.call(this)}Object.defineProperty(Kt.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Kt.prototype.destroy=qM.destroy;Kt.prototype._undestroy=qM.undestroy;Kt.prototype._destroy=function(r,e){e(r)};Kt.prototype.push=function(r,e){var t=this._readableState,i;return t.objectMode?i=!0:typeof r==\"string\"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=bb.from(r,e),e=\"\"),i=!0),Lce(this,r,e,!1,i)};Kt.prototype.unshift=function(r){return Lce(this,r,null,!0,!1)};function Lce(r,e,t,i,n){Dt(\"readableAddChunk\",e);var s=r._readableState;if(e===null)s.reading=!1,D6e(r,s);else{var o;if(n||(o=x6e(s,e)),o)EE(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!=\"string\"&&!s.objectMode&&Object.getPrototypeOf(e)!==bb.prototype&&(e=m6e(e)),i)s.endEmitted?EE(r,new S6e):GM(r,s,e,!0);else if(s.ended)EE(r,new Q6e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?GM(r,s,e,!1):jM(r,s)):GM(r,s,e,!1)}else i||(s.reading=!1,jM(r,s))}return!s.ended&&(s.length<s.highWaterMark||s.length===0)}function GM(r,e,t,i){e.flowing&&e.length===0&&!e.sync?(e.awaitDrain=0,r.emit(\"data\",t)):(e.length+=e.objectMode?1:t.length,i?e.buffer.unshift(t):e.buffer.push(t),e.needReadable&&vb(r)),jM(r,e)}function x6e(r,e){var t;return!E6e(e)&&typeof e!=\"string\"&&e!==void 0&&!r.objectMode&&(t=new B6e(\"chunk\",[\"string\",\"Buffer\",\"Uint8Array\"],e)),t}Kt.prototype.isPaused=function(){return this._readableState.flowing===!1};Kt.prototype.setEncoding=function(r){up||(up=TM().StringDecoder);var e=new up(r);this._readableState.decoder=e,this._readableState.encoding=this._readableState.decoder.encoding;for(var t=this._readableState.buffer.head,i=\"\";t!==null;)i+=e.write(t.data),t=t.next;return this._readableState.buffer.clear(),i!==\"\"&&this._readableState.buffer.push(i),this._readableState.length=i.length,this};var kce=1073741824;function P6e(r){return r>=kce?r=kce:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function Rce(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=P6e(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}Kt.prototype.read=function(r){Dt(\"read\",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Dt(\"read: emitReadable\",e.length,e.ended),e.length===0&&e.ended?YM(this):vb(this),null;if(r=Rce(r,e),r===0&&e.ended)return e.length===0&&YM(this),null;var i=e.needReadable;Dt(\"need readable\",i),(e.length===0||e.length-r<e.highWaterMark)&&(i=!0,Dt(\"length less than watermark\",i)),e.ended||e.reading?(i=!1,Dt(\"reading or ended\",i)):i&&(Dt(\"do read\"),e.reading=!0,e.sync=!0,e.length===0&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(r=Rce(t,e)));var n;return r>0?n=Mce(r,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&YM(this)),n!==null&&this.emit(\"data\",n),n};function D6e(r,e){if(Dt(\"onEofChunk\"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?vb(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Tce(r)))}}function vb(r){var e=r._readableState;Dt(\"emitReadable\",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Dt(\"emitReadable\",e.flowing),e.emittedReadable=!0,process.nextTick(Tce,r))}function Tce(r){var e=r._readableState;Dt(\"emitReadable_\",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit(\"readable\"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,JM(r)}function jM(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(k6e,r,e))}function k6e(r,e){for(;!e.reading&&!e.ended&&(e.length<e.highWaterMark||e.flowing&&e.length===0);){var t=e.length;if(Dt(\"maybeReadMore read 0\"),r.read(0),t===e.length)break}e.readingMore=!1}Kt.prototype._read=function(r){EE(this,new b6e(\"_read()\"))};Kt.prototype.pipe=function(r,e){var t=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=r;break;case 1:i.pipes=[i.pipes,r];break;default:i.pipes.push(r);break}i.pipesCount+=1,Dt(\"pipe count=%d opts=%j\",i.pipesCount,e);var n=(!e||e.end!==!1)&&r!==process.stdout&&r!==process.stderr,s=n?a:C;i.endEmitted?process.nextTick(s):t.once(\"end\",s),r.on(\"unpipe\",o);function o(y,B){Dt(\"onunpipe\"),y===t&&B&&B.hasUnpiped===!1&&(B.hasUnpiped=!0,u())}function a(){Dt(\"onend\"),r.end()}var l=R6e(t);r.on(\"drain\",l);var c=!1;function u(){Dt(\"cleanup\"),r.removeListener(\"close\",h),r.removeListener(\"finish\",p),r.removeListener(\"drain\",l),r.removeListener(\"error\",f),r.removeListener(\"unpipe\",o),t.removeListener(\"end\",a),t.removeListener(\"end\",C),t.removeListener(\"data\",g),c=!0,i.awaitDrain&&(!r._writableState||r._writableState.needDrain)&&l()}t.on(\"data\",g);function g(y){Dt(\"ondata\");var B=r.write(y);Dt(\"dest.write\",B),B===!1&&((i.pipesCount===1&&i.pipes===r||i.pipesCount>1&&Uce(i.pipes,r)!==-1)&&!c&&(Dt(\"false write response, pause\",i.awaitDrain),i.awaitDrain++),t.pause())}function f(y){Dt(\"onerror\",y),C(),r.removeListener(\"error\",f),Fce(r,\"error\")===0&&EE(r,y)}v6e(r,\"error\",f);function h(){r.removeListener(\"finish\",p),C()}r.once(\"close\",h);function p(){Dt(\"onfinish\"),r.removeListener(\"close\",h),C()}r.once(\"finish\",p);function C(){Dt(\"unpipe\"),t.unpipe(r)}return r.emit(\"pipe\",t),i.flowing||(Dt(\"pipe resume\"),t.resume()),r};function R6e(r){return function(){var t=r._readableState;Dt(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Fce(r,\"data\")&&(t.flowing=!0,JM(r))}}Kt.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit(\"unpipe\",this,t),this);if(!r){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s<n;s++)i[s].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var o=Uce(e.pipes,r);return o===-1?this:(e.pipes.splice(o,1),e.pipesCount-=1,e.pipesCount===1&&(e.pipes=e.pipes[0]),r.emit(\"unpipe\",this,t),this)};Kt.prototype.on=function(r,e){var t=IE.prototype.on.call(this,r,e),i=this._readableState;return r===\"data\"?(i.readableListening=this.listenerCount(\"readable\")>0,i.flowing!==!1&&this.resume()):r===\"readable\"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Dt(\"on readable\",i.length,i.reading),i.length?vb(this):i.reading||process.nextTick(F6e,this)),t};Kt.prototype.addListener=Kt.prototype.on;Kt.prototype.removeListener=function(r,e){var t=IE.prototype.removeListener.call(this,r,e);return r===\"readable\"&&process.nextTick(Oce,this),t};Kt.prototype.removeAllListeners=function(r){var e=IE.prototype.removeAllListeners.apply(this,arguments);return(r===\"readable\"||r===void 0)&&process.nextTick(Oce,this),e};function Oce(r){var e=r._readableState;e.readableListening=r.listenerCount(\"readable\")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount(\"data\")>0&&r.resume()}function F6e(r){Dt(\"readable nexttick read 0\"),r.read(0)}Kt.prototype.resume=function(){var r=this._readableState;return r.flowing||(Dt(\"resume\"),r.flowing=!r.readableListening,N6e(this,r)),r.paused=!1,this};function N6e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(L6e,r,e))}function L6e(r,e){Dt(\"resume\",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit(\"resume\"),JM(r),e.flowing&&!e.reading&&r.read(0)}Kt.prototype.pause=function(){return Dt(\"call pause flowing=%j\",this._readableState.flowing),this._readableState.flowing!==!1&&(Dt(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this};function JM(r){var e=r._readableState;for(Dt(\"flow\",e.flowing);e.flowing&&r.read()!==null;);}Kt.prototype.wrap=function(r){var e=this,t=this._readableState,i=!1;r.on(\"end\",function(){if(Dt(\"wrapped end\"),t.decoder&&!t.ended){var o=t.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),r.on(\"data\",function(o){if(Dt(\"wrapped data\"),t.decoder&&(o=t.decoder.write(o)),!(t.objectMode&&o==null)&&!(!t.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,r.pause())}});for(var n in r)this[n]===void 0&&typeof r[n]==\"function\"&&(this[n]=function(a){return function(){return r[a].apply(r,arguments)}}(n));for(var s=0;s<HM.length;s++)r.on(HM[s],this.emit.bind(this,HM[s]));return this._read=function(o){Dt(\"wrapped _read\",o),i&&(i=!1,r.resume())},this};typeof Symbol==\"function\"&&(Kt.prototype[Symbol.asyncIterator]=function(){return UM===void 0&&(UM=Sce()),UM(this)});Object.defineProperty(Kt.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(Kt.prototype,\"readableBuffer\",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(Kt.prototype,\"readableFlowing\",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});Kt._fromList=Mce;Object.defineProperty(Kt.prototype,\"readableLength\",{enumerable:!1,get:function(){return this._readableState.length}});function Mce(r,e){if(e.length===0)return null;var t;return e.objectMode?t=e.buffer.shift():!r||r>=e.length?(e.decoder?t=e.buffer.join(\"\"):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function YM(r){var e=r._readableState;Dt(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(T6e,e,r))}function T6e(r,e){if(Dt(\"endReadableNT\",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit(\"end\"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol==\"function\"&&(Kt.from=function(r,e){return KM===void 0&&(KM=Dce()),KM(Kt,r,e)});function Uce(r,e){for(var t=0,i=r.length;t<i;t++)if(r[t]===e)return t;return-1}});var WM=w((cbt,Gce)=>{\"use strict\";Gce.exports=hA;var xb=Sl().codes,O6e=xb.ERR_METHOD_NOT_IMPLEMENTED,M6e=xb.ERR_MULTIPLE_CALLBACK,U6e=xb.ERR_TRANSFORM_ALREADY_TRANSFORMING,K6e=xb.ERR_TRANSFORM_WITH_LENGTH_0,Pb=qu();vl()(hA,Pb);function H6e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit(\"error\",new M6e);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),i(r);var n=this._readableState;n.reading=!1,(n.needReadable||n.length<n.highWaterMark)&&this._read(n.highWaterMark)}function hA(r){if(!(this instanceof hA))return new hA(r);Pb.call(this,r),this._transformState={afterTransform:H6e.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,r&&(typeof r.transform==\"function\"&&(this._transform=r.transform),typeof r.flush==\"function\"&&(this._flush=r.flush)),this.on(\"prefinish\",G6e)}function G6e(){var r=this;typeof this._flush==\"function\"&&!this._readableState.destroyed?this._flush(function(e,t){Hce(r,e,t)}):Hce(this,null,null)}hA.prototype.push=function(r,e){return this._transformState.needTransform=!1,Pb.prototype.push.call(this,r,e)};hA.prototype._transform=function(r,e,t){t(new O6e(\"_transform()\"))};hA.prototype._write=function(r,e,t){var i=this._transformState;if(i.writecb=t,i.writechunk=r,i.writeencoding=e,!i.transforming){var n=this._readableState;(i.needTransform||n.needReadable||n.length<n.highWaterMark)&&this._read(n.highWaterMark)}};hA.prototype._read=function(r){var e=this._transformState;e.writechunk!==null&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0};hA.prototype._destroy=function(r,e){Pb.prototype._destroy.call(this,r,function(t){e(t)})};function Hce(r,e,t){if(e)return r.emit(\"error\",e);if(t!=null&&r.push(t),r._writableState.length)throw new K6e;if(r._transformState.transforming)throw new U6e;return r.push(null)}});var qce=w((ubt,jce)=>{\"use strict\";jce.exports=yE;var Yce=WM();vl()(yE,Yce);function yE(r){if(!(this instanceof yE))return new yE(r);Yce.call(this,r)}yE.prototype._transform=function(r,e,t){t(null,r)}});var Xce=w((gbt,Vce)=>{\"use strict\";var zM;function Y6e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var zce=Sl().codes,j6e=zce.ERR_MISSING_ARGS,q6e=zce.ERR_STREAM_DESTROYED;function Jce(r){if(r)throw r}function J6e(r){return r.setHeader&&typeof r.abort==\"function\"}function W6e(r,e,t,i){i=Y6e(i);var n=!1;r.on(\"close\",function(){n=!0}),zM===void 0&&(zM=wb()),zM(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,J6e(r))return r.abort();if(typeof r.destroy==\"function\")return r.destroy();i(o||new q6e(\"pipe\"))}}}function Wce(r){r()}function z6e(r,e){return r.pipe(e)}function V6e(r){return!r.length||typeof r[r.length-1]!=\"function\"?Jce:r.pop()}function X6e(){for(var r=arguments.length,e=new Array(r),t=0;t<r;t++)e[t]=arguments[t];var i=V6e(e);if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new j6e(\"streams\");var n,s=e.map(function(o,a){var l=a<e.length-1,c=a>0;return W6e(o,l,c,function(u){n||(n=u),u&&s.forEach(Wce),!l&&(s.forEach(Wce),i(n))})});return e.reduce(z6e)}Vce.exports=X6e});var gp=w((Ms,BE)=>{var wE=J(\"stream\");process.env.READABLE_STREAM===\"disable\"&&wE?(BE.exports=wE.Readable,Object.assign(BE.exports,wE),BE.exports.Stream=wE):(Ms=BE.exports=RM(),Ms.Stream=wE||Ms,Ms.Readable=Ms,Ms.Writable=PM(),Ms.Duplex=qu(),Ms.Transform=WM(),Ms.PassThrough=qce(),Ms.finished=wb(),Ms.pipeline=Xce())});var $ce=w((fbt,_ce)=>{\"use strict\";var{Buffer:Eo}=J(\"buffer\"),Zce=Symbol.for(\"BufferList\");function fr(r){if(!(this instanceof fr))return new fr(r);fr._init.call(this,r)}fr._init=function(e){Object.defineProperty(this,Zce,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};fr.prototype._new=function(e){return new fr(e)};fr.prototype._offset=function(e){if(e===0)return[0,0];let t=0;for(let i=0;i<this._bufs.length;i++){let n=t+this._bufs[i].length;if(e<n||i===this._bufs.length-1)return[i,e-t];t=n}};fr.prototype._reverseOffset=function(r){let e=r[0],t=r[1];for(let i=0;i<e;i++)t+=this._bufs[i].length;return t};fr.prototype.get=function(e){if(e>this.length||e<0)return;let t=this._offset(e);return this._bufs[t[0]][t[1]]};fr.prototype.slice=function(e,t){return typeof e==\"number\"&&e<0&&(e+=this.length),typeof t==\"number\"&&t<0&&(t+=this.length),this.copy(null,0,e,t)};fr.prototype.copy=function(e,t,i,n){if((typeof i!=\"number\"||i<0)&&(i=0),(typeof n!=\"number\"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||Eo.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&t||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:Eo.concat(this._bufs,this.length);for(let g=0;g<this._bufs.length;g++)this._bufs[g].copy(e,c),c+=this._bufs[g].length;return e}if(l<=this._bufs[o[0]].length-u)return s?this._bufs[o[0]].copy(e,t,u,u+l):this._bufs[o[0]].slice(u,u+l);s||(e=Eo.allocUnsafe(a));for(let g=o[0];g<this._bufs.length;g++){let f=this._bufs[g].length-u;if(l>f)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};fr.prototype.shallowSlice=function(e,t){if(e=e||0,t=typeof t!=\"number\"?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return this._new();let i=this._offset(e),n=this._offset(t),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};fr.prototype.toString=function(e,t,i){return this.slice(t,i).toString(e)};fr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};fr.prototype.duplicate=function(){let e=this._new();for(let t=0;t<this._bufs.length;t++)e.append(this._bufs[t]);return e};fr.prototype.append=function(e){if(e==null)return this;if(e.buffer)this._appendBuffer(Eo.from(e.buffer,e.byteOffset,e.byteLength));else if(Array.isArray(e))for(let t=0;t<e.length;t++)this.append(e[t]);else if(this._isBufferList(e))for(let t=0;t<e._bufs.length;t++)this.append(e._bufs[t]);else typeof e==\"number\"&&(e=e.toString()),this._appendBuffer(Eo.from(e));return this};fr.prototype._appendBuffer=function(e){this._bufs.push(e),this.length+=e.length};fr.prototype.indexOf=function(r,e,t){if(t===void 0&&typeof e==\"string\"&&(t=e,e=void 0),typeof r==\"function\"||Array.isArray(r))throw new TypeError('The \"value\" argument must be one of type string, Buffer, BufferList, or Uint8Array.');if(typeof r==\"number\"?r=Eo.from([r]):typeof r==\"string\"?r=Eo.from(r,t):this._isBufferList(r)?r=r.slice():Array.isArray(r.buffer)?r=Eo.from(r.buffer,r.byteOffset,r.byteLength):Eo.isBuffer(r)||(r=Eo.from(r)),e=Number(e||0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),r.length===0)return e>this.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n<this._bufs.length;n++){let o=this._bufs[n];for(;s<o.length;)if(o.length-s>=r.length){let l=o.indexOf(r,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-r.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,r))return l;s++}s=0}return-1};fr.prototype._match=function(r,e){if(this.length-r<e.length)return!1;for(let t=0;t<e.length;t++)if(this.get(r+t)!==e[t])return!1;return!0};(function(){let r={readDoubleBE:8,readDoubleLE:8,readFloatBE:4,readFloatLE:4,readInt32BE:4,readInt32LE:4,readUInt32BE:4,readUInt32LE:4,readInt16BE:2,readInt16LE:2,readUInt16BE:2,readUInt16LE:2,readInt8:1,readUInt8:1,readIntBE:null,readIntLE:null,readUIntBE:null,readUIntLE:null};for(let e in r)(function(t){r[t]===null?fr.prototype[t]=function(i,n){return this.slice(i,i+n)[t](0,n)}:fr.prototype[t]=function(i=0){return this.slice(i,i+r[t])[t](0)}})(e)})();fr.prototype._isBufferList=function(e){return e instanceof fr||fr.isBufferList(e)};fr.isBufferList=function(e){return e!=null&&e[Zce]};_ce.exports=fr});var eue=w((hbt,Db)=>{\"use strict\";var VM=gp().Duplex,Z6e=vl(),QE=$ce();function Ji(r){if(!(this instanceof Ji))return new Ji(r);if(typeof r==\"function\"){this._callback=r;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on(\"pipe\",function(i){i.on(\"error\",e)}),this.on(\"unpipe\",function(i){i.removeListener(\"error\",e)}),r=null}QE._init.call(this,r),VM.call(this)}Z6e(Ji,VM);Object.assign(Ji.prototype,QE.prototype);Ji.prototype._new=function(e){return new Ji(e)};Ji.prototype._write=function(e,t,i){this._appendBuffer(e),typeof i==\"function\"&&i()};Ji.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Ji.prototype.end=function(e){VM.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Ji.prototype._destroy=function(e,t){this._bufs.length=0,this.length=0,t(e)};Ji.prototype._isBufferList=function(e){return e instanceof Ji||e instanceof QE||Ji.isBufferList(e)};Ji.isBufferList=QE.isBufferList;Db.exports=Ji;Db.exports.BufferListStream=Ji;Db.exports.BufferList=QE});var _M=w(hp=>{var _6e=Buffer.alloc,$6e=\"0000000000000000000\",eVe=\"7777777777777777777\",tue=\"0\".charCodeAt(0),rue=Buffer.from(\"ustar\\0\",\"binary\"),tVe=Buffer.from(\"00\",\"binary\"),rVe=Buffer.from(\"ustar \",\"binary\"),iVe=Buffer.from(\" \\0\",\"binary\"),nVe=parseInt(\"7777\",8),bE=257,ZM=263,sVe=function(r,e,t){return typeof r!=\"number\"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},oVe=function(r){switch(r){case 0:return\"file\";case 1:return\"link\";case 2:return\"symlink\";case 3:return\"character-device\";case 4:return\"block-device\";case 5:return\"directory\";case 6:return\"fifo\";case 7:return\"contiguous-file\";case 72:return\"pax-header\";case 55:return\"pax-global-header\";case 27:return\"gnu-long-link-path\";case 28:case 30:return\"gnu-long-path\"}return null},aVe=function(r){switch(r){case\"file\":return 0;case\"link\":return 1;case\"symlink\":return 2;case\"character-device\":return 3;case\"block-device\":return 4;case\"directory\":return 5;case\"fifo\":return 6;case\"contiguous-file\":return 7;case\"pax-header\":return 72}return 0},iue=function(r,e,t,i){for(;t<i;t++)if(r[t]===e)return t;return i},nue=function(r){for(var e=256,t=0;t<148;t++)e+=r[t];for(var i=156;i<512;i++)e+=r[i];return e},Rl=function(r,e){return r=r.toString(8),r.length>e?eVe.slice(0,e)+\" \":$6e.slice(0,e-r.length)+r+\" \"};function AVe(r){var e;if(r[0]===128)e=!0;else if(r[0]===255)e=!1;else return null;for(var t=[],i=r.length-1;i>0;i--){var n=r[i];e?t.push(n):t.push(255-n)}var s=0,o=t.length;for(i=0;i<o;i++)s+=t[i]*Math.pow(256,i);return e?s:-1*s}var Fl=function(r,e,t){if(r=r.slice(e,e+t),e=0,r[e]&128)return AVe(r);for(;e<r.length&&r[e]===32;)e++;for(var i=sVe(iue(r,32,e,r.length),r.length,r.length);e<i&&r[e]===0;)e++;return i===e?0:parseInt(r.slice(e,i).toString(),8)},fp=function(r,e,t,i){return r.slice(e,iue(r,0,e,e+t)).toString(i)},XM=function(r){var e=Buffer.byteLength(r),t=Math.floor(Math.log(e)/Math.log(10))+1;return e+t>=Math.pow(10,t)&&t++,e+t+r};hp.decodeLongPath=function(r,e){return fp(r,0,r.length,e)};hp.encodePax=function(r){var e=\"\";r.name&&(e+=XM(\" path=\"+r.name+`\n`)),r.linkname&&(e+=XM(\" linkpath=\"+r.linkname+`\n`));var t=r.pax;if(t)for(var i in t)e+=XM(\" \"+i+\"=\"+t[i]+`\n`);return Buffer.from(e)};hp.decodePax=function(r){for(var e={};r.length;){for(var t=0;t<r.length&&r[t]!==32;)t++;var i=parseInt(r.slice(0,t).toString(),10);if(!i)return e;var n=r.slice(t+1,i-1).toString(),s=n.indexOf(\"=\");if(s===-1)return e;e[n.slice(0,s)]=n.slice(s+1),r=r.slice(i)}return e};hp.encode=function(r){var e=_6e(512),t=r.name,i=\"\";if(r.typeflag===5&&t[t.length-1]!==\"/\"&&(t+=\"/\"),Buffer.byteLength(t)!==t.length)return null;for(;Buffer.byteLength(t)>100;){var n=t.indexOf(\"/\");if(n===-1)return null;i+=i?\"/\"+t.slice(0,n):t.slice(0,n),t=t.slice(n+1)}return Buffer.byteLength(t)>100||Buffer.byteLength(i)>155||r.linkname&&Buffer.byteLength(r.linkname)>100?null:(e.write(t),e.write(Rl(r.mode&nVe,6),100),e.write(Rl(r.uid,6),108),e.write(Rl(r.gid,6),116),e.write(Rl(r.size,11),124),e.write(Rl(r.mtime.getTime()/1e3|0,11),136),e[156]=tue+aVe(r.type),r.linkname&&e.write(r.linkname,157),rue.copy(e,bE),tVe.copy(e,ZM),r.uname&&e.write(r.uname,265),r.gname&&e.write(r.gname,297),e.write(Rl(r.devmajor||0,6),329),e.write(Rl(r.devminor||0,6),337),i&&e.write(i,345),e.write(Rl(nue(e),6),148),e)};hp.decode=function(r,e,t){var i=r[156]===0?0:r[156]-tue,n=fp(r,0,100,e),s=Fl(r,100,8),o=Fl(r,108,8),a=Fl(r,116,8),l=Fl(r,124,12),c=Fl(r,136,12),u=oVe(i),g=r[157]===0?null:fp(r,157,100,e),f=fp(r,265,32),h=fp(r,297,32),p=Fl(r,329,8),C=Fl(r,337,8),y=nue(r);if(y===8*32)return null;if(y!==Fl(r,148,8))throw new Error(\"Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?\");if(rue.compare(r,bE,bE+6)===0)r[345]&&(n=fp(r,345,155,e)+\"/\"+n);else if(!(rVe.compare(r,bE,bE+6)===0&&iVe.compare(r,ZM,ZM+2)===0)){if(!t)throw new Error(\"Invalid tar header: unknown format.\")}return i===0&&n&&n[n.length-1]===\"/\"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:C}}});var uue=w((dbt,cue)=>{var oue=J(\"util\"),lVe=eue(),SE=_M(),aue=gp().Writable,Aue=gp().PassThrough,lue=function(){},sue=function(r){return r&=511,r&&512-r},cVe=function(r,e){var t=new kb(r,e);return t.end(),t},uVe=function(r,e){return e.path&&(r.name=e.path),e.linkpath&&(r.linkname=e.linkpath),e.size&&(r.size=parseInt(e.size,10)),r.pax=e,r},kb=function(r,e){this._parent=r,this.offset=e,Aue.call(this,{autoDestroy:!1})};oue.inherits(kb,Aue);kb.prototype.destroy=function(r){this._parent.destroy(r)};var pA=function(r){if(!(this instanceof pA))return new pA(r);aue.call(this,r),r=r||{},this._offset=0,this._buffer=lVe(),this._missing=0,this._partial=!1,this._onparse=lue,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,t=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=sue(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(sue(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=SE.decodePax(t.slice(0,f)),t.consume(f),s()},l=function(){var f=e._header.size;e._pax=SE.decodePax(t.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),t.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=SE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=SE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=SE.decode(t.slice(0,512),r.filenameEncoding,r.allowUnknownFormat)}catch(p){e.emit(\"error\",p)}if(t.consume(512),!h){e._parse(512,g),i();return}if(h.type===\"gnu-long-path\"){e._parse(h.size,c),i();return}if(h.type===\"gnu-long-link-path\"){e._parse(h.size,u),i();return}if(h.type===\"pax-global-header\"){e._parse(h.size,a),i();return}if(h.type===\"pax-header\"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=uVe(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type===\"directory\"){e._parse(512,g),e.emit(\"entry\",h,cVe(e,f),n);return}e._stream=new kb(e,f),e.emit(\"entry\",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};oue.inherits(pA,aue);pA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit(\"error\",r),this.emit(\"close\"),this._stream&&this._stream.emit(\"close\"))};pA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};pA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=lue,this._overflow?this._write(this._overflow,void 0,r):r()}};pA.prototype._write=function(r,e,t){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(r.length&&(this._partial=!0),r.length<s)return this._missing-=r.length,this._overflow=null,i?i.write(r,t):(n.append(r),t());this._cb=t,this._missing=0;var o=null;r.length>s&&(o=r.slice(s),r=r.slice(0,s)),i?i.end(r):n.append(r),this._overflow=o,this._onparse()}};pA.prototype._final=function(r){if(this._partial)return this.destroy(new Error(\"Unexpected end of data\"));r()};cue.exports=pA});var fue=w((Cbt,gue)=>{gue.exports=J(\"fs\").constants||J(\"constants\")});var mue=w((mbt,Cue)=>{var pp=fue(),hue=Pk(),Fb=vl(),gVe=Buffer.alloc,pue=gp().Readable,dp=gp().Writable,fVe=J(\"string_decoder\").StringDecoder,Rb=_M(),hVe=parseInt(\"755\",8),pVe=parseInt(\"644\",8),due=gVe(1024),e1=function(){},$M=function(r,e){e&=511,e&&r.push(due.slice(0,512-e))};function dVe(r){switch(r&pp.S_IFMT){case pp.S_IFBLK:return\"block-device\";case pp.S_IFCHR:return\"character-device\";case pp.S_IFDIR:return\"directory\";case pp.S_IFIFO:return\"fifo\";case pp.S_IFLNK:return\"symlink\"}return\"file\"}var Nb=function(r){dp.call(this),this.written=0,this._to=r,this._destroyed=!1};Fb(Nb,dp);Nb.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};Nb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var Lb=function(){dp.call(this),this.linkname=\"\",this._decoder=new fVe(\"utf-8\"),this._destroyed=!1};Fb(Lb,dp);Lb.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};Lb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var vE=function(){dp.call(this),this._destroyed=!1};Fb(vE,dp);vE.prototype._write=function(r,e,t){t(new Error(\"No body allowed for this entry\"))};vE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var Aa=function(r){if(!(this instanceof Aa))return new Aa(r);pue.call(this,r),this._drain=e1,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Fb(Aa,pue);Aa.prototype.entry=function(r,e,t){if(this._stream)throw new Error(\"already piping an entry\");if(!(this._finalized||this._destroyed)){typeof e==\"function\"&&(t=e,e=null),t||(t=e1);var i=this;if((!r.size||r.type===\"symlink\")&&(r.size=0),r.type||(r.type=dVe(r.mode)),r.mode||(r.mode=r.type===\"directory\"?hVe:pVe),r.uid||(r.uid=0),r.gid||(r.gid=0),r.mtime||(r.mtime=new Date),typeof e==\"string\"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){r.size=e.length,this._encode(r);var n=this.push(e);return $M(i,r.size),n?process.nextTick(t):this._drain=t,new vE}if(r.type===\"symlink\"&&!r.linkname){var s=new Lb;return hue(s,function(a){if(a)return i.destroy(),t(a);r.linkname=s.linkname,i._encode(r),t()}),s}if(this._encode(r),r.type!==\"file\"&&r.type!==\"contiguous-file\")return process.nextTick(t),new vE;var o=new Nb(this);return this._stream=o,hue(o,function(a){if(i._stream=null,a)return i.destroy(),t(a);if(o.written!==r.size)return i.destroy(),t(new Error(\"size mismatch\"));$M(i,r.size),i._finalizing&&i.finalize(),t()}),o}};Aa.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(due),this.push(null))};Aa.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit(\"error\",r),this.emit(\"close\"),this._stream&&this._stream.destroy&&this._stream.destroy())};Aa.prototype._encode=function(r){if(!r.pax){var e=Rb.encode(r);if(e){this.push(e);return}}this._encodePax(r)};Aa.prototype._encodePax=function(r){var e=Rb.encodePax({name:r.name,linkname:r.linkname,pax:r.pax}),t={name:\"PaxHeader\",mode:r.mode,uid:r.uid,gid:r.gid,size:e.length,mtime:r.mtime,type:\"pax-header\",linkname:r.linkname&&\"PaxHeader\",uname:r.uname,gname:r.gname,devmajor:r.devmajor,devminor:r.devminor};this.push(Rb.encode(t)),this.push(e),$M(this,e.length),t.size=r.size,t.type=r.type,this.push(Rb.encode(t))};Aa.prototype._read=function(r){var e=this._drain;this._drain=e1,e()};Cue.exports=Aa});var Eue=w(t1=>{t1.extract=uue();t1.pack=mue()});var kue=w((Kbt,Due)=>{\"use strict\";var Xu=class{constructor(e,t,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]==\"string\"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=t||{},this.__providers=xue(i.filter(n=>n!=null&&typeof n==\"object\")),this.__isFiggyPudding=!0}get(e){return a1(this,e,!0)}get[Symbol.toStringTag](){return\"FiggyPudding\"}forEach(e,t=this){for(let[i,n]of this.entries())e.call(t,n,i,this)}toJSON(){let e={};return this.forEach((t,i)=>{e[i]=t}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let t=e||this.__opts.other;if(t){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(t):kVe(n);for(let[o,a]of s)t(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Xu(this.__specs,this.__opts,xue(this.__providers).concat(e)),Pue)}};try{let r=J(\"util\");Xu.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+\" \"+r.inspect(this.toJSON(),t)}}catch{}function PVe(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:\"EBADKEY\"})}function a1(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))PVe(e);else{i||(i={});let n;for(let s of r.__providers){if(n=vue(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=vue(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default==\"function\"?i.default(r):i.default:n}}function vue(r,e){let t;return e.__isFiggyPudding?t=a1(e,r,!1):typeof e.get==\"function\"?t=e.get(r):t=e[r],t}var Pue={has(r,e){return e in r.__specs&&a1(r,e,!1)!==void 0},ownKeys(r){return Object.keys(r.__specs)},get(r,e){return typeof e==\"symbol\"||e.slice(0,2)===\"__\"||e in Xu.prototype?r[e]:r.get(e)},set(r,e,t){if(typeof e==\"symbol\"||e.slice(0,2)===\"__\")return r[e]=t,!0;throw new Error(\"figgyPudding options cannot be modified. Use .concat() instead.\")},deleteProperty(){throw new Error(\"figgyPudding options cannot be deleted. Use .concat() and shadow them instead.\")}};Due.exports=DVe;function DVe(r,e){function t(...i){return new Proxy(new Xu(r,e,i),Pue)}return t}function xue(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function kVe(r){return Object.keys(r).map(e=>[e,r[e]])}});var Nue=w((Hbt,ua)=>{\"use strict\";var PE=J(\"crypto\"),RVe=kue(),FVe=J(\"stream\").Transform,Rue=[\"sha256\",\"sha384\",\"sha512\"],NVe=/^[a-z0-9+/]+(?:=?=?)$/i,LVe=/^([^-]+)-([^?]+)([?\\S*]*)$/,TVe=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\\?[\\x21-\\x7E]*)*$/,OVe=/^[\\x21-\\x7E]+$/,an=RVe({algorithms:{default:[\"sha512\"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>qVe},Promise:{default:()=>Promise},sep:{default:\" \"},single:{default:!1},size:{},strict:{default:!1}}),Nl=class{get isHash(){return!0}constructor(e,t){t=an(t);let i=!!t.strict;this.source=e.trim();let n=this.source.match(i?TVe:LVe);if(!n||i&&!Rue.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split(\"?\"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,\"base64\").toString(\"hex\")}toJSON(){return this.toString()}toString(e){if(e=an(e),e.strict&&!(Rue.some(i=>i===this.algorithm)&&this.digest.match(NVe)&&(this.options||[]).every(i=>i.match(OVe))))return\"\";let t=this.options&&this.options.length?`?${this.options.join(\"?\")}`:\"\";return`${this.algorithm}-${this.digest}${t}`}},Zu=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=an(e);let t=e.sep||\" \";return e.strict&&(t=t.replace(/\\S+/g,\" \")),Object.keys(this).map(i=>this[i].map(n=>Nl.prototype.toString.call(n,e)).filter(n=>n.length).join(t)).filter(i=>i.length).join(t)}concat(e,t){t=an(t);let i=typeof e==\"string\"?e:xE(e,t);return ca(`${this.toString(t)} ${i}`,t)}hexDigest(){return ca(this,{single:!0}).hexDigest()}match(e,t){t=an(t);let i=ca(e,t),n=i.pickAlgorithm(t);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=an(e);let t=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>t(n,s)||n)}};ua.exports.parse=ca;function ca(r,e){if(e=an(e),typeof r==\"string\")return A1(r,e);if(r.algorithm&&r.digest){let t=new Zu;return t[r.algorithm]=[r],A1(xE(t,e),e)}else return A1(xE(r,e),e)}function A1(r,e){return e.single?new Nl(r,e):r.trim().split(/\\s+/).reduce((t,i)=>{let n=new Nl(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;t[s]||(t[s]=[]),t[s].push(n)}return t},new Zu)}ua.exports.stringify=xE;function xE(r,e){return e=an(e),r.algorithm&&r.digest?Nl.prototype.toString.call(r,e):typeof r==\"string\"?xE(ca(r,e),e):Zu.prototype.toString.call(r,e)}ua.exports.fromHex=MVe;function MVe(r,e,t){t=an(t);let i=t.options&&t.options.length?`?${t.options.join(\"?\")}`:\"\";return ca(`${e}-${Buffer.from(r,\"hex\").toString(\"base64\")}${i}`,t)}ua.exports.fromData=UVe;function UVe(r,e){e=an(e);let t=e.algorithms,i=e.options&&e.options.length?`?${e.options.join(\"?\")}`:\"\";return t.reduce((n,s)=>{let o=PE.createHash(s).update(r).digest(\"base64\"),a=new Nl(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new Zu)}ua.exports.fromStream=KVe;function KVe(r,e){e=an(e);let t=e.Promise||Promise,i=l1(e);return new t((n,s)=>{r.pipe(i),r.on(\"error\",s),i.on(\"error\",s);let o;i.on(\"integrity\",a=>{o=a}),i.on(\"end\",()=>n(o)),i.on(\"data\",()=>{})})}ua.exports.checkData=HVe;function HVe(r,e,t){if(t=an(t),e=ca(e,t),!Object.keys(e).length){if(t.error)throw Object.assign(new Error(\"No valid integrity hashes to check against\"),{code:\"EINTEGRITY\"});return!1}let i=e.pickAlgorithm(t),n=PE.createHash(i).update(r).digest(\"base64\"),s=ca({algorithm:i,digest:n}),o=s.match(e,t);if(o||!t.error)return o;if(typeof t.size==\"number\"&&r.length!==t.size){let a=new Error(`data size mismatch when checking ${e}.\n  Wanted: ${t.size}\n  Found: ${r.length}`);throw a.code=\"EBADSIZE\",a.found=r.length,a.expected=t.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${r.length} bytes)`);throw a.code=\"EINTEGRITY\",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ua.exports.checkStream=GVe;function GVe(r,e,t){t=an(t);let i=t.Promise||Promise,n=l1(t.concat({integrity:e}));return new i((s,o)=>{r.pipe(n),r.on(\"error\",o),n.on(\"error\",o);let a;n.on(\"verified\",l=>{a=l}),n.on(\"end\",()=>s(a)),n.on(\"data\",()=>{})})}ua.exports.integrityStream=l1;function l1(r){r=an(r);let e=r.integrity&&ca(r.integrity,r),t=e&&Object.keys(e).length,i=t&&e.pickAlgorithm(r),n=t&&e[i],s=Array.from(new Set(r.algorithms.concat(i?[i]:[]))),o=s.map(PE.createHash),a=0,l=new FVe({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on(\"end\",()=>{let c=r.options&&r.options.length?`?${r.options.join(\"?\")}`:\"\",u=ca(o.map((f,h)=>`${s[h]}-${f.digest(\"base64\")}${c}`).join(\" \"),r),g=t&&u.match(e,r);if(typeof r.size==\"number\"&&a!==r.size){let f=new Error(`stream size mismatch when checking ${e}.\n  Wanted: ${r.size}\n  Found: ${a}`);f.code=\"EBADSIZE\",f.found=a,f.expected=r.size,f.sri=e,l.emit(\"error\",f)}else if(r.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code=\"EINTEGRITY\",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit(\"error\",f)}else l.emit(\"size\",a),l.emit(\"integrity\",u),g&&l.emit(\"verified\",g)});return l}ua.exports.create=YVe;function YVe(r){r=an(r);let e=r.algorithms,t=r.options.length?`?${r.options.join(\"?\")}`:\"\",i=e.map(PE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest(\"base64\"),c=new Nl(`${a}-${l}${t}`,r);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new Zu)}}}var jVe=new Set(PE.getHashes()),Fue=[\"md5\",\"whirlpool\",\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"sha3\",\"sha3-256\",\"sha3-384\",\"sha3-512\",\"sha3_256\",\"sha3_384\",\"sha3_512\"].filter(r=>jVe.has(r));function qVe(r,e){return Fue.indexOf(r.toLowerCase())>=Fue.indexOf(e.toLowerCase())?r:e}});var sm={};ut(sm,{BuildType:()=>O0,Cache:()=>Rt,Configuration:()=>ye,DEFAULT_LOCK_FILENAME:()=>ok,DEFAULT_RC_FILENAME:()=>sk,FormatType:()=>xi,InstallMode:()=>es,LightReport:()=>ra,LinkType:()=>Ef,Manifest:()=>ot,MessageName:()=>Ct,MultiFetcher:()=>Df,PackageExtensionStatus:()=>Xx,PackageExtensionType:()=>Vx,Project:()=>je,ProjectLookup:()=>ck,Report:()=>vi,ReportError:()=>at,SettingsType:()=>ak,StreamReport:()=>Ge,TAG_REGEXP:()=>Rf,TelemetryManager:()=>Sh,ThrowReport:()=>ti,VirtualFetcher:()=>Ff,Workspace:()=>bh,WorkspaceFetcher:()=>Lf,WorkspaceResolver:()=>jr,YarnVersion:()=>Lr,execUtils:()=>Cr,folderUtils:()=>Lw,formatUtils:()=>ee,hashUtils:()=>li,httpUtils:()=>Xt,miscUtils:()=>Ie,nodeUtils:()=>ws,parseMessageName:()=>TI,scriptUtils:()=>Wt,semverUtils:()=>vt,stringifyMessageName:()=>FA,structUtils:()=>P,tgzUtils:()=>mi,treeUtils:()=>$n});var Cr={};ut(Cr,{EndStrategy:()=>hk,ExecError:()=>Yw,PipeError:()=>dC,execvp:()=>tk,pipevp:()=>Wo});var Wp={};ut(Wp,{AliasFS:()=>bo,CustomDir:()=>Hp,CwdFS:()=>qt,DEFAULT_COMPRESSION_LEVEL:()=>Xl,FakeFS:()=>Ia,Filename:()=>xt,JailFS:()=>So,LazyFS:()=>Sg,LinkStrategy:()=>CS,NoFS:()=>jp,NodeFS:()=>$t,PortablePath:()=>Oe,PosixFS:()=>vg,ProxiedFS:()=>pi,VirtualFS:()=>Br,ZipFS:()=>Wr,ZipOpenFS:()=>Mn,constants:()=>xr,extendFs:()=>AI,normalizeLineEndings:()=>Vl,npath:()=>U,opendir:()=>tI,patchFs:()=>QS,ppath:()=>x,statUtils:()=>Op,toFilename:()=>Kr,xfs:()=>M});var xr={};ut(xr,{SAFE_TIME:()=>iU,S_IFDIR:()=>Jl,S_IFLNK:()=>zl,S_IFMT:()=>qs,S_IFREG:()=>Wl});var qs=61440,Jl=16384,Wl=32768,zl=40960,iU=456789e3;var Op={};ut(Op,{BigIntStatsEntry:()=>Bg,DEFAULT_MODE:()=>Lp,DirEntry:()=>cS,StatEntry:()=>Ea,areStatsEqual:()=>gS,clearStats:()=>WE,convertToBigIntStats:()=>zE,makeDefaultStats:()=>Tp,makeEmptyStats:()=>Fge});var uS=Pe(J(\"util\"));var Lp=33188,cS=class{constructor(){this.name=\"\";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},Ea=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Lp;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},Bg=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Lp);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}};function Tp(){return new Ea}function Fge(){return WE(Tp())}function WE(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(r,e)){let t=r[e];typeof t==\"number\"?r[e]=0:typeof t==\"bigint\"?r[e]=BigInt(0):uS.types.isDate(t)&&(r[e]=new Date(0))}return r}function zE(r){let e=new Bg;for(let t in r)if(Object.prototype.hasOwnProperty.call(r,t)){let i=r[t];typeof i==\"number\"?e[t]=BigInt(i):uS.types.isDate(i)&&(e[t]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function gS(r,e){if(r.atimeMs!==e.atimeMs||r.birthtimeMs!==e.birthtimeMs||r.blksize!==e.blksize||r.blocks!==e.blocks||r.ctimeMs!==e.ctimeMs||r.dev!==e.dev||r.gid!==e.gid||r.ino!==e.ino||r.isBlockDevice()!==e.isBlockDevice()||r.isCharacterDevice()!==e.isCharacterDevice()||r.isDirectory()!==e.isDirectory()||r.isFIFO()!==e.isFIFO()||r.isFile()!==e.isFile()||r.isSocket()!==e.isSocket()||r.isSymbolicLink()!==e.isSymbolicLink()||r.mode!==e.mode||r.mtimeMs!==e.mtimeMs||r.nlink!==e.nlink||r.rdev!==e.rdev||r.size!==e.size||r.uid!==e.uid)return!1;let t=r,i=e;return!(t.atimeNs!==i.atimeNs||t.mtimeNs!==i.mtimeNs||t.ctimeNs!==i.ctimeNs||t.birthtimeNs!==i.birthtimeNs)}var XE=Pe(J(\"fs\"));var Mp=Pe(J(\"path\"));var Oe={root:\"/\",dot:\".\",parent:\"..\"},xt={nodeModules:\"node_modules\",manifest:\"package.json\",lockfile:\"yarn.lock\",virtual:\"__virtual__\",pnpJs:\".pnp.js\",pnpCjs:\".pnp.cjs\",rc:\".yarnrc.yml\"},U=Object.create(Mp.default),x=Object.create(Mp.default.posix);U.cwd=()=>process.cwd();x.cwd=()=>fS(process.cwd());x.resolve=(...r)=>r.length>0&&x.isAbsolute(r[0])?Mp.default.posix.resolve(...r):Mp.default.posix.resolve(x.cwd(),...r);var nU=function(r,e,t){return e=r.normalize(e),t=r.normalize(t),e===t?\".\":(e.endsWith(r.sep)||(e=e+r.sep),t.startsWith(e)?t.slice(e.length):null)};U.fromPortablePath=sU;U.toPortablePath=fS;U.contains=(r,e)=>nU(U,r,e);x.contains=(r,e)=>nU(x,r,e);var Nge=/^([a-zA-Z]:.*)$/,Lge=/^\\/\\/(\\.\\/)?(.*)$/,Tge=/^\\/([a-zA-Z]:.*)$/,Oge=/^\\/unc\\/(\\.dot\\/)?(.*)$/;function sU(r){if(process.platform!==\"win32\")return r;let e,t;if(e=r.match(Tge))r=e[1];else if(t=r.match(Oge))r=`\\\\\\\\${t[1]?\".\\\\\":\"\"}${t[2]}`;else return r;return r.replace(/\\//g,\"\\\\\")}function fS(r){if(process.platform!==\"win32\")return r;r=r.replace(/\\\\/g,\"/\");let e,t;return(e=r.match(Nge))?r=`/${e[1]}`:(t=r.match(Lge))&&(r=`/unc/${t[1]?\".dot/\":\"\"}${t[2]}`),r}function VE(r,e){return r===U?sU(e):fS(e)}function Kr(r){if(U.parse(r).dir!==\"\"||x.parse(r).dir!==\"\")throw new Error(`Invalid filename: \"${r}\"`);return r}var ZE=new Date(456789e3*1e3),CS=(t=>(t.Allow=\"allow\",t.ReadOnly=\"readOnly\",t))(CS||{});async function oU(r,e,t,i,n){let s=r.pathUtils.normalize(e),o=t.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:ZE,mtime:ZE}:await t.lstatPromise(o);await r.mkdirpPromise(r.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof r.lutimesPromise==\"function\"?r.lutimesPromise.bind(r):r.utimesPromise.bind(r);await pS(a,l,g,r,s,t,o,{...n,didParentExist:!0});for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function pS(r,e,t,i,n,s,o,a){var h,p;let l=a.didParentExist?await Mge(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:ZE,mtime:ZE}:c,f;switch(!0){case c.isDirectory():f=await Uge(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await Hge(r,e,t,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await Gge(r,e,t,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>t(n,u,g)),f=!0),(l===null||(l.mode&511)!==(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function Mge(r,e){try{return await r.lstatPromise(e)}catch{return null}}async function Uge(r,e,t,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(r.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!==\"EEXIST\")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?{...c,didParentExist:!1}:c;if(c.stableSort)for(let h of g.sort())await pS(r,e,t,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await pS(r,e,t,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var hS=new WeakMap;function dS(r,e,t,i,n){return async()=>{await r.linkPromise(t,e),n===\"readOnly\"&&(i.mode&=-147,await r.chmodPromise(e,i.mode))}}function Kge(r,e,t,i,n){let s=hS.get(r);return typeof s>\"u\"?async()=>{try{await r.copyFilePromise(t,e,XE.default.constants.COPYFILE_FICLONE_FORCE),hS.set(r,!0)}catch(o){if(o.code===\"ENOSYS\"||o.code===\"ENOTSUP\")hS.set(r,!1),await dS(r,e,t,i,n)();else throw o}}:s?async()=>r.copyFilePromise(t,e,XE.default.constants.COPYFILE_FICLONE_FORCE):dS(r,e,t,i,n)}async function Hge(r,e,t,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?Kge(i,n,a,l,u):async()=>i.copyFilePromise(a,n,XE.default.constants.COPYFILE_FICLONE):u!==null?dS(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return r.push(async()=>g()),!0}async function Gge(r,e,t,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;return r.push(async()=>{await i.symlinkPromise(VE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function As(r,e){return Object.assign(new Error(`${r}: ${e}`),{code:r})}function $E(r){return As(\"EBUSY\",r)}function Up(r,e){return As(\"ENOSYS\",`${r}, ${e}`)}function vA(r){return As(\"EINVAL\",`invalid argument, ${r}`)}function Hr(r){return As(\"EBADF\",`bad file descriptor, ${r}`)}function Js(r){return As(\"ENOENT\",`no such file or directory, ${r}`)}function Qo(r){return As(\"ENOTDIR\",`not a directory, ${r}`)}function Kp(r){return As(\"EISDIR\",`illegal operation on a directory, ${r}`)}function eI(r){return As(\"EEXIST\",`file already exists, ${r}`)}function cn(r){return As(\"EROFS\",`read-only filesystem, ${r}`)}function aU(r){return As(\"ENOTEMPTY\",`directory not empty, ${r}`)}function AU(r){return As(\"EOPNOTSUPP\",`operation not supported, ${r}`)}function lU(){return As(\"ERR_DIR_CLOSED\",\"Directory handle was closed\")}var _E=class extends Error{constructor(t,i){super(t);this.name=\"Libzip Error\",this.code=i}};var Hp=class{constructor(e,t,i={}){this.path=e;this.nextDirent=t;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw lU()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let t=this.readSync();return typeof e<\"u\"?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<\"u\"?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),(t=(e=this.opts).onClose)==null||t.call(e),this.closed=!0}};function tI(r,e,t,i){let n=()=>{let s=t.shift();return typeof s>\"u\"?null:Object.assign(r.statSync(r.pathUtils.join(e,s)),{name:s})};return new Hp(e,n,i)}var cU=J(\"os\");var Ia=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(t)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error(\"Not supported\")}else yield n}}async removePromise(e,{recursive:t=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code===\"ENOENT\")return;throw s}if(n.isDirectory()){if(t){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!==\"EBUSY\"&&o.code!==\"ENOTEMPTY\")throw o;s<i&&await new Promise(a=>setTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:t=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code===\"ENOENT\")return;throw n}if(i.isDirectory()){if(t)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{await this.mkdirPromise(a)}catch(l){if(l.code===\"EEXIST\")continue;throw l}if(s!=null||(s=a),t!=null&&await this.chmodPromise(a,t),i!=null)await this.utimesPromise(a,i[0],i[1]);else{let l=await this.statPromise(this.pathUtils.dirname(a));await this.utimesPromise(a,l.atime,l.mtime)}}}return s}mkdirpSync(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{this.mkdirSync(a)}catch(l){if(l.code===\"EEXIST\")continue;throw l}if(s!=null||(s=a),t!=null&&this.chmodSync(a,t),i!=null)this.utimesSync(a,i[0],i[1]);else{let l=this.statSync(this.pathUtils.dirname(a));this.utimesSync(a,l.atime,l.mtime)}}}return s}async copyPromise(e,t,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await oU(this,e,i,t,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,t,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(t),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(t);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(t,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(t);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(t);this.symlinkSync(VE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${t}, mode: 0o${s.mode.toString(8).padStart(6,\"0\")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t,i):this.changeFileTextPromise(e,t,i)}async changeFileBufferPromise(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch{}Buffer.compare(n,t)!==0&&await this.writeFilePromise(e,t,{mode:i})}async changeFileTextPromise(e,t,{automaticNewlines:i,mode:n}={}){let s=\"\";try{s=await this.readFilePromise(e,\"utf8\")}catch{}let o=i?Vl(s,t):t;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t,i):this.changeFileTextSync(e,t,i)}changeFileBufferSync(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch{}Buffer.compare(n,t)!==0&&this.writeFileSync(e,t,{mode:i})}changeFileTextSync(e,t,{automaticNewlines:i=!1,mode:n}={}){let s=\"\";try{s=this.readFileSync(e,\"utf8\")}catch{}let o=i?Vl(s,t):t;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(i){if(i.code===\"EXDEV\")await this.copyPromise(t,e),await this.removePromise(e);else throw i}}moveSync(e,t){try{this.renameSync(e,t)}catch(i){if(i.code===\"EXDEV\")this.copySync(t,e),this.removeSync(e);else throw i}}async lockPromise(e,t){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch{return Date.now()-s<500}try{return process.kill(l,0),!0}catch{return!1}};for(;o===null;)try{o=await this.openPromise(i,\"wx\")}catch(l){if(l.code===\"EEXIST\"){if(!await a())try{await this.unlinkPromise(i);continue}catch{}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch{}}}async readJsonPromise(e){let t=await this.readFilePromise(e,\"utf8\");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let t=this.readFileSync(e,\"utf8\");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,`${JSON.stringify(t,null,2)}\n`)}writeJsonSync(e,t){return this.writeFileSync(e,`${JSON.stringify(t,null,2)}\n`)}async preserveTimePromise(e,t){let i=await this.lstatPromise(e),n=await t();typeof n<\"u\"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,t){let i=this.lstatSync(e),n=t();typeof n<\"u\"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},xA=class extends Ia{constructor(){super(x)}};function Yge(r){let e=r.match(/\\r?\\n/g);if(e===null)return cU.EOL;let t=e.filter(n=>n===`\\r\n`).length,i=e.length-t;return t>i?`\\r\n`:`\n`}function Vl(r,e){return e.replace(/\\r?\\n/g,Yge(r))}var bg=J(\"fs\"),IS=J(\"stream\"),hU=J(\"util\"),yS=Pe(J(\"zlib\"));var uU=Pe(J(\"fs\"));var $t=class extends xA{constructor(t=uU.default){super();this.realFs=t,typeof this.realFs.lutimes<\"u\"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Oe.root}resolve(t){return x.resolve(t)}async openPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.open(U.fromPortablePath(t),i,n,this.makeCallback(s,o))})}openSync(t,i,n){return this.realFs.openSync(U.fromPortablePath(t),i,n)}async opendirPromise(t,i){return await new Promise((n,s)=>{typeof i<\"u\"?this.realFs.opendir(U.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.opendir(U.fromPortablePath(t),this.makeCallback(n,s))}).then(n=>Object.defineProperty(n,\"path\",{value:t,configurable:!0,writable:!0}))}opendirSync(t,i){let n=typeof i<\"u\"?this.realFs.opendirSync(U.fromPortablePath(t),i):this.realFs.opendirSync(U.fromPortablePath(t));return Object.defineProperty(n,\"path\",{value:t,configurable:!0,writable:!0})}async readPromise(t,i,n=0,s=0,o=-1){return await new Promise((a,l)=>{this.realFs.read(t,i,n,s,o,(c,u)=>{c?l(c):a(u)})})}readSync(t,i,n,s,o){return this.realFs.readSync(t,i,n,s,o)}async writePromise(t,i,n,s,o){return await new Promise((a,l)=>typeof i==\"string\"?this.realFs.write(t,i,n,this.makeCallback(a,l)):this.realFs.write(t,i,n,s,o,this.makeCallback(a,l)))}writeSync(t,i,n,s,o){return typeof i==\"string\"?this.realFs.writeSync(t,i,n):this.realFs.writeSync(t,i,n,s,o)}async closePromise(t){await new Promise((i,n)=>{this.realFs.close(t,this.makeCallback(i,n))})}closeSync(t){this.realFs.closeSync(t)}createReadStream(t,i){let n=t!==null?U.fromPortablePath(t):t;return this.realFs.createReadStream(n,i)}createWriteStream(t,i){let n=t!==null?U.fromPortablePath(t):t;return this.realFs.createWriteStream(n,i)}async realpathPromise(t){return await new Promise((i,n)=>{this.realFs.realpath(U.fromPortablePath(t),{},this.makeCallback(i,n))}).then(i=>U.toPortablePath(i))}realpathSync(t){return U.toPortablePath(this.realFs.realpathSync(U.fromPortablePath(t),{}))}async existsPromise(t){return await new Promise(i=>{this.realFs.exists(U.fromPortablePath(t),i)})}accessSync(t,i){return this.realFs.accessSync(U.fromPortablePath(t),i)}async accessPromise(t,i){return await new Promise((n,s)=>{this.realFs.access(U.fromPortablePath(t),i,this.makeCallback(n,s))})}existsSync(t){return this.realFs.existsSync(U.fromPortablePath(t))}async statPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.stat(U.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.stat(U.fromPortablePath(t),this.makeCallback(n,s))})}statSync(t,i){return i?this.realFs.statSync(U.fromPortablePath(t),i):this.realFs.statSync(U.fromPortablePath(t))}async fstatPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.fstat(t,i,this.makeCallback(n,s)):this.realFs.fstat(t,this.makeCallback(n,s))})}fstatSync(t,i){return i?this.realFs.fstatSync(t,i):this.realFs.fstatSync(t)}async lstatPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.lstat(U.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.lstat(U.fromPortablePath(t),this.makeCallback(n,s))})}lstatSync(t,i){return i?this.realFs.lstatSync(U.fromPortablePath(t),i):this.realFs.lstatSync(U.fromPortablePath(t))}async fchmodPromise(t,i){return await new Promise((n,s)=>{this.realFs.fchmod(t,i,this.makeCallback(n,s))})}fchmodSync(t,i){return this.realFs.fchmodSync(t,i)}async chmodPromise(t,i){return await new Promise((n,s)=>{this.realFs.chmod(U.fromPortablePath(t),i,this.makeCallback(n,s))})}chmodSync(t,i){return this.realFs.chmodSync(U.fromPortablePath(t),i)}async fchownPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.fchown(t,i,n,this.makeCallback(s,o))})}fchownSync(t,i,n){return this.realFs.fchownSync(t,i,n)}async chownPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.chown(U.fromPortablePath(t),i,n,this.makeCallback(s,o))})}chownSync(t,i,n){return this.realFs.chownSync(U.fromPortablePath(t),i,n)}async renamePromise(t,i){return await new Promise((n,s)=>{this.realFs.rename(U.fromPortablePath(t),U.fromPortablePath(i),this.makeCallback(n,s))})}renameSync(t,i){return this.realFs.renameSync(U.fromPortablePath(t),U.fromPortablePath(i))}async copyFilePromise(t,i,n=0){return await new Promise((s,o)=>{this.realFs.copyFile(U.fromPortablePath(t),U.fromPortablePath(i),n,this.makeCallback(s,o))})}copyFileSync(t,i,n=0){return this.realFs.copyFileSync(U.fromPortablePath(t),U.fromPortablePath(i),n)}async appendFilePromise(t,i,n){return await new Promise((s,o)=>{let a=typeof t==\"string\"?U.fromPortablePath(t):t;n?this.realFs.appendFile(a,i,n,this.makeCallback(s,o)):this.realFs.appendFile(a,i,this.makeCallback(s,o))})}appendFileSync(t,i,n){let s=typeof t==\"string\"?U.fromPortablePath(t):t;n?this.realFs.appendFileSync(s,i,n):this.realFs.appendFileSync(s,i)}async writeFilePromise(t,i,n){return await new Promise((s,o)=>{let a=typeof t==\"string\"?U.fromPortablePath(t):t;n?this.realFs.writeFile(a,i,n,this.makeCallback(s,o)):this.realFs.writeFile(a,i,this.makeCallback(s,o))})}writeFileSync(t,i,n){let s=typeof t==\"string\"?U.fromPortablePath(t):t;n?this.realFs.writeFileSync(s,i,n):this.realFs.writeFileSync(s,i)}async unlinkPromise(t){return await new Promise((i,n)=>{this.realFs.unlink(U.fromPortablePath(t),this.makeCallback(i,n))})}unlinkSync(t){return this.realFs.unlinkSync(U.fromPortablePath(t))}async utimesPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.utimes(U.fromPortablePath(t),i,n,this.makeCallback(s,o))})}utimesSync(t,i,n){this.realFs.utimesSync(U.fromPortablePath(t),i,n)}async lutimesPromiseImpl(t,i,n){let s=this.realFs.lutimes;if(typeof s>\"u\")throw Up(\"unavailable Node binding\",`lutimes '${t}'`);return await new Promise((o,a)=>{s.call(this.realFs,U.fromPortablePath(t),i,n,this.makeCallback(o,a))})}lutimesSyncImpl(t,i,n){let s=this.realFs.lutimesSync;if(typeof s>\"u\")throw Up(\"unavailable Node binding\",`lutimes '${t}'`);s.call(this.realFs,U.fromPortablePath(t),i,n)}async mkdirPromise(t,i){return await new Promise((n,s)=>{this.realFs.mkdir(U.fromPortablePath(t),i,this.makeCallback(n,s))})}mkdirSync(t,i){return this.realFs.mkdirSync(U.fromPortablePath(t),i)}async rmdirPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.rmdir(U.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.rmdir(U.fromPortablePath(t),this.makeCallback(n,s))})}rmdirSync(t,i){return this.realFs.rmdirSync(U.fromPortablePath(t),i)}async linkPromise(t,i){return await new Promise((n,s)=>{this.realFs.link(U.fromPortablePath(t),U.fromPortablePath(i),this.makeCallback(n,s))})}linkSync(t,i){return this.realFs.linkSync(U.fromPortablePath(t),U.fromPortablePath(i))}async symlinkPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.symlink(U.fromPortablePath(t.replace(/\\/+$/,\"\")),U.fromPortablePath(i),n,this.makeCallback(s,o))})}symlinkSync(t,i,n){return this.realFs.symlinkSync(U.fromPortablePath(t.replace(/\\/+$/,\"\")),U.fromPortablePath(i),n)}async readFilePromise(t,i){return await new Promise((n,s)=>{let o=typeof t==\"string\"?U.fromPortablePath(t):t;this.realFs.readFile(o,i,this.makeCallback(n,s))})}readFileSync(t,i){let n=typeof t==\"string\"?U.fromPortablePath(t):t;return this.realFs.readFileSync(n,i)}async readdirPromise(t,i){return await new Promise((n,s)=>{i!=null&&i.withFileTypes?this.realFs.readdir(U.fromPortablePath(t),{withFileTypes:!0},this.makeCallback(n,s)):this.realFs.readdir(U.fromPortablePath(t),this.makeCallback(o=>n(o),s))})}readdirSync(t,i){return i!=null&&i.withFileTypes?this.realFs.readdirSync(U.fromPortablePath(t),{withFileTypes:!0}):this.realFs.readdirSync(U.fromPortablePath(t))}async readlinkPromise(t){return await new Promise((i,n)=>{this.realFs.readlink(U.fromPortablePath(t),this.makeCallback(i,n))}).then(i=>U.toPortablePath(i))}readlinkSync(t){return U.toPortablePath(this.realFs.readlinkSync(U.fromPortablePath(t)))}async truncatePromise(t,i){return await new Promise((n,s)=>{this.realFs.truncate(U.fromPortablePath(t),i,this.makeCallback(n,s))})}truncateSync(t,i){return this.realFs.truncateSync(U.fromPortablePath(t),i)}async ftruncatePromise(t,i){return await new Promise((n,s)=>{this.realFs.ftruncate(t,i,this.makeCallback(n,s))})}ftruncateSync(t,i){return this.realFs.ftruncateSync(t,i)}watch(t,i,n){return this.realFs.watch(U.fromPortablePath(t),i,n)}watchFile(t,i,n){return this.realFs.watchFile(U.fromPortablePath(t),i,n)}unwatchFile(t,i){return this.realFs.unwatchFile(U.fromPortablePath(t),i)}makeCallback(t,i){return(n,s)=>{n?i(n):t(s)}}};var fU=J(\"events\");function gU(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var Qg=class extends fU.EventEmitter{constructor(t,i,{bigint:n=!1}={}){super();this.status=\"ready\";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=t,this.path=i,this.bigint=n,this.lastStats=this.stat()}static create(t,i,n){let s=new Qg(t,i,n);return s.start(),s}start(){gU(this.status,\"ready\"),this.status=\"running\",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(\"change\",this.lastStats,this.lastStats)},3)}stop(){gU(this.status,\"running\"),this.status=\"stopped\",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(\"stop\")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let i=this.bigint?new Bg:new Ea;return WE(i)}}makeInterval(t){let i=setInterval(()=>{let n=this.stat(),s=this.lastStats;gS(n,s)||(this.lastStats=n,this.emit(\"change\",n,s))},t.interval);return t.persistent?i:i.unref()}registerChangeListener(t,i){this.addListener(\"change\",t),this.changeListeners.set(t,this.makeInterval(i))}unregisterChangeListener(t){this.removeListener(\"change\",t);let i=this.changeListeners.get(t);typeof i<\"u\"&&clearInterval(i),this.changeListeners.delete(t)}unregisterAllChangeListeners(){for(let t of this.changeListeners.keys())this.unregisterChangeListener(t)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let t of this.changeListeners.values())t.ref();return this}unref(){for(let t of this.changeListeners.values())t.unref();return this}};var rI=new WeakMap;function iI(r,e,t,i){let n,s,o,a;switch(typeof t){case\"function\":n=!1,s=!0,o=5007,a=t;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=t),a=i;break}let l=rI.get(r);typeof l>\"u\"&&rI.set(r,l=new Map);let c=l.get(e);return typeof c>\"u\"&&(c=Qg.create(r,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Gp(r,e,t){let i=rI.get(r);if(typeof i>\"u\")return;let n=i.get(e);typeof n>\"u\"||(typeof t>\"u\"?n.unregisterAllChangeListeners():n.unregisterChangeListener(t),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function Yp(r){let e=rI.get(r);if(!(typeof e>\"u\"))for(let t of e.keys())Gp(r,t)}var Xl=\"mixed\";function jge(r){if(typeof r==\"string\"&&String(+r)===r)return+r;if(typeof r==\"number\"&&Number.isFinite(r))return r<0?Date.now()/1e3:r;if(hU.types.isDate(r))return r.getTime()/1e3;throw new Error(\"Invalid time\")}function ES(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var Wr=class extends xA{constructor(t,i){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=i.libzip;let n=i;if(this.level=typeof n.level<\"u\"?n.level:Xl,t!=null||(t=ES()),typeof t==\"string\"){let{baseFs:a=new $t}=n;this.baseFs=a,this.path=t}else this.path=null,this.baseFs=null;if(i.stats)this.stats=i.stats;else if(typeof t==\"string\")try{this.stats=this.baseFs.statSync(t)}catch(a){if(a.code===\"ENOENT\"&&n.create)this.stats=Tp();else throw a}else this.stats=Tp();let s=this.libzip.malloc(4);try{let a=0;if(typeof t==\"string\"&&n.create&&(a|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),i.readOnly&&(a|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof t==\"string\")this.zip=this.libzip.open(U.fromPortablePath(t),a,s);else{let l=this.allocateUnattachedSource(t);try{this.zip=this.libzip.openFromSource(l,a,s),this.lzSource=l}catch(c){throw this.libzip.source.free(l),c}}if(this.zip===0){let l=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(l,this.libzip.getValue(s,\"i32\")),this.makeLibzipError(l)}}finally{this.libzip.free(s)}this.listings.set(Oe.root,new Set);let o=this.libzip.getNumEntries(this.zip,0);for(let a=0;a<o;++a){let l=this.libzip.getName(this.zip,a,0);if(x.isAbsolute(l))continue;let c=x.resolve(Oe.root,l);this.registerEntry(c,a),l.endsWith(\"/\")&&this.registerListing(c)}if(this.symlinkCount=this.libzip.ext.countSymlinks(this.zip),this.symlinkCount===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.ready=!0}makeLibzipError(t){let i=this.libzip.struct.errorCodeZip(t),n=this.libzip.error.strerror(t),s=new _E(n,this.libzip.errors[i]);if(i===this.libzip.errors.ZIP_ER_CHANGED)throw new Error(`Assertion failed: Unexpected libzip error: ${s.message}`);return s}getExtractHint(t){for(let i of this.entries.keys()){let n=this.pathUtils.extname(i);if(t.relevantExtensions.has(n))return!0}return!1}getAllFiles(){return Array.from(this.entries.keys())}getRealPath(){if(!this.path)throw new Error(\"ZipFS don't have real paths when loaded from a buffer\");return this.path}getBufferAndClose(){if(this.prepareClose(),!this.lzSource)throw new Error(\"ZipFS was not created from a Buffer\");if(this.entries.size===0)return this.discardAndClose(),ES();try{if(this.libzip.source.keep(this.lzSource),this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.source.open(this.lzSource)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_END)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let t=this.libzip.source.tell(this.lzSource);if(t===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_SET)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let i=this.libzip.malloc(t);if(!i)throw new Error(\"Couldn't allocate enough memory\");try{let n=this.libzip.source.read(this.lzSource,i,t);if(n===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(n<t)throw new Error(\"Incomplete read\");if(n>t)throw new Error(\"Overread\");let s=this.libzip.HEAPU8.subarray(i,i+t);return Buffer.from(s)}finally{this.libzip.free(i)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw $E(\"archive closed, close\");Yp(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error(\"ZipFS cannot be saved and must be discarded when loaded from a buffer\");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let t=this.baseFs.existsSync(this.path)||this.stats.mode===Lp?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,ES(),{mode:t});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof t<\"u\"&&this.baseFs.chmodSync(this.path,t)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(t){return x.resolve(Oe.root,t)}async openPromise(t,i,n){return this.openSync(t,i,n)}openSync(t,i,n){let s=this.nextFd++;return this.fds.set(s,{cursor:0,p:t}),s}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(t,i){return this.opendirSync(t,i)}opendirSync(t,i={}){let n=this.resolveFilename(`opendir '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`opendir '${t}'`);let s=this.listings.get(n);if(!s)throw Qo(`opendir '${t}'`);let o=[...s],a=this.openSync(n,\"r\");return tI(this,n,o,{onClose:()=>{this.closeSync(a)}})}async readPromise(t,i,n,s,o){return this.readSync(t,i,n,s,o)}readSync(t,i,n=0,s=i.byteLength,o=-1){let a=this.fds.get(t);if(typeof a>\"u\")throw Hr(\"read\");let l=o===-1||o===null?a.cursor:o,c=this.readFileSync(a.p);c.copy(i,n,l,l+s);let u=Math.max(0,Math.min(c.length-l,s));return(o===-1||o===null)&&(a.cursor+=u),u}async writePromise(t,i,n,s,o){return typeof i==\"string\"?this.writeSync(t,i,o):this.writeSync(t,i,n,s,o)}writeSync(t,i,n,s,o){throw typeof this.fds.get(t)>\"u\"?Hr(\"read\"):new Error(\"Unimplemented\")}async closePromise(t){return this.closeSync(t)}closeSync(t){if(typeof this.fds.get(t)>\"u\")throw Hr(\"read\");this.fds.delete(t)}createReadStream(t,{encoding:i}={}){if(t===null)throw new Error(\"Unimplemented\");let n=this.openSync(t,\"r\"),s=Object.assign(new IS.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(a,l)=>{clearImmediate(o),this.closeSync(n),l(a)}}),{close(){s.destroy()},bytesRead:0,path:t}),o=setImmediate(async()=>{try{let a=await this.readFilePromise(t,i);s.bytesRead=a.length,s.end(a)}catch(a){s.destroy(a)}});return s}createWriteStream(t,{encoding:i}={}){if(this.readOnly)throw cn(`open '${t}'`);if(t===null)throw new Error(\"Unimplemented\");let n=[],s=this.openSync(t,\"w\"),o=Object.assign(new IS.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(a,l)=>{try{a?l(a):(this.writeFileSync(t,Buffer.concat(n),i),l(null))}catch(c){l(c)}finally{this.closeSync(s)}}}),{bytesWritten:0,path:t,close(){o.destroy()}});return o.on(\"data\",a=>{let l=Buffer.from(a);o.bytesWritten+=l.length,n.push(l)}),o}async realpathPromise(t){return this.realpathSync(t)}realpathSync(t){let i=this.resolveFilename(`lstat '${t}'`,t);if(!this.entries.has(i)&&!this.listings.has(i))throw Js(`lstat '${t}'`);return i}async existsPromise(t){return this.existsSync(t)}existsSync(t){if(!this.ready)throw $E(`archive closed, existsSync '${t}'`);if(this.symlinkCount===0){let n=x.resolve(Oe.root,t);return this.entries.has(n)||this.listings.has(n)}let i;try{i=this.resolveFilename(`stat '${t}'`,t,void 0,!1)}catch{return!1}return i===void 0?!1:this.entries.has(i)||this.listings.has(i)}async accessPromise(t,i){return this.accessSync(t,i)}accessSync(t,i=bg.constants.F_OK){let n=this.resolveFilename(`access '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`access '${t}'`);if(this.readOnly&&i&bg.constants.W_OK)throw cn(`access '${t}'`)}async statPromise(t,i={bigint:!1}){return i.bigint?this.statSync(t,{bigint:!0}):this.statSync(t)}statSync(t,i={bigint:!1,throwIfNoEntry:!0}){let n=this.resolveFilename(`stat '${t}'`,t,void 0,i.throwIfNoEntry);if(n!==void 0){if(!this.entries.has(n)&&!this.listings.has(n)){if(i.throwIfNoEntry===!1)return;throw Js(`stat '${t}'`)}if(t[t.length-1]===\"/\"&&!this.listings.has(n))throw Qo(`stat '${t}'`);return this.statImpl(`stat '${t}'`,n,i)}}async fstatPromise(t,i){return this.fstatSync(t,i)}fstatSync(t,i){let n=this.fds.get(t);if(typeof n>\"u\")throw Hr(\"fstatSync\");let{p:s}=n,o=this.resolveFilename(`stat '${s}'`,s);if(!this.entries.has(o)&&!this.listings.has(o))throw Js(`stat '${s}'`);if(s[s.length-1]===\"/\"&&!this.listings.has(o))throw Qo(`stat '${s}'`);return this.statImpl(`fstat '${s}'`,o,i)}async lstatPromise(t,i={bigint:!1}){return i.bigint?this.lstatSync(t,{bigint:!0}):this.lstatSync(t)}lstatSync(t,i={bigint:!1,throwIfNoEntry:!0}){let n=this.resolveFilename(`lstat '${t}'`,t,!1,i.throwIfNoEntry);if(n!==void 0){if(!this.entries.has(n)&&!this.listings.has(n)){if(i.throwIfNoEntry===!1)return;throw Js(`lstat '${t}'`)}if(t[t.length-1]===\"/\"&&!this.listings.has(n))throw Qo(`lstat '${t}'`);return this.statImpl(`lstat '${t}'`,n,i)}}statImpl(t,i,n={}){let s=this.entries.get(i);if(typeof s<\"u\"){let o=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,s,0,0,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let l=this.stats.uid,c=this.stats.gid,u=this.libzip.struct.statSize(o)>>>0,g=512,f=Math.ceil(u/g),h=(this.libzip.struct.statMtime(o)>>>0)*1e3,p=h,C=h,y=h,B=new Date(p),v=new Date(C),D=new Date(y),L=new Date(h),H=this.listings.has(i)?16384:this.isSymbolicLink(s)?40960:32768,j=H===16384?493:420,$=H|this.getUnixMode(s,j)&511,V=this.libzip.struct.statCrc(o),W=Object.assign(new Ea,{uid:l,gid:c,size:u,blksize:g,blocks:f,atime:B,birthtime:v,ctime:D,mtime:L,atimeMs:p,birthtimeMs:C,ctimeMs:y,mtimeMs:h,mode:$,crc:V});return n.bigint===!0?zE(W):W}if(this.listings.has(i)){let o=this.stats.uid,a=this.stats.gid,l=0,c=512,u=0,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=this.stats.mtimeMs,C=new Date(g),y=new Date(f),B=new Date(h),v=new Date(p),D=16877,L=0,H=Object.assign(new Ea,{uid:o,gid:a,size:l,blksize:c,blocks:u,atime:C,birthtime:y,ctime:B,mtime:v,atimeMs:g,birthtimeMs:f,ctimeMs:h,mtimeMs:p,mode:D,crc:L});return n.bigint===!0?zE(H):H}throw new Error(\"Unreachable\")}getUnixMode(t,i){if(this.libzip.file.getExternalAttributes(this.zip,t,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0!==this.libzip.ZIP_OPSYS_UNIX?i:this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>16}registerListing(t){let i=this.listings.get(t);if(i)return i;this.registerListing(x.dirname(t)).add(x.basename(t));let s=new Set;return this.listings.set(t,s),s}registerEntry(t,i){this.registerListing(x.dirname(t)).add(x.basename(t)),this.entries.set(t,i)}unregisterListing(t){this.listings.delete(t);let i=this.listings.get(x.dirname(t));i==null||i.delete(x.basename(t))}unregisterEntry(t){this.unregisterListing(t);let i=this.entries.get(t);this.entries.delete(t),!(typeof i>\"u\")&&(this.fileSources.delete(i),this.isSymbolicLink(i)&&this.symlinkCount--)}deleteEntry(t,i){if(this.unregisterEntry(t),this.libzip.delete(this.zip,i)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(t,i,n=!0,s=!0){if(!this.ready)throw $E(`archive closed, ${t}`);let o=x.resolve(Oe.root,i);if(o===\"/\")return Oe.root;let a=this.entries.get(o);if(n&&a!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(a)){let l=this.getFileSource(a).toString();return this.resolveFilename(t,x.resolve(x.dirname(o),l),!0,s)}else return o;for(;;){let l=this.resolveFilename(t,x.dirname(o),!0,s);if(l===void 0)return l;let c=this.listings.has(l),u=this.entries.has(l);if(!c&&!u){if(s===!1)return;throw Js(t)}if(!c)throw Qo(t);if(o=x.resolve(l,x.basename(o)),!n||this.symlinkCount===0)break;let g=this.libzip.name.locate(this.zip,o.slice(1),0);if(g===-1)break;if(this.isSymbolicLink(g)){let f=this.getFileSource(g).toString();o=x.resolve(x.dirname(o),f)}else break}return o}allocateBuffer(t){Buffer.isBuffer(t)||(t=Buffer.from(t));let i=this.libzip.malloc(t.byteLength);if(!i)throw new Error(\"Couldn't allocate enough memory\");return new Uint8Array(this.libzip.HEAPU8.buffer,i,t.byteLength).set(t),{buffer:i,byteLength:t.byteLength}}allocateUnattachedSource(t){let i=this.libzip.struct.errorS(),{buffer:n,byteLength:s}=this.allocateBuffer(t),o=this.libzip.source.fromUnattachedBuffer(n,s,0,1,i);if(o===0)throw this.libzip.free(i),this.makeLibzipError(i);return o}allocateSource(t){let{buffer:i,byteLength:n}=this.allocateBuffer(t),s=this.libzip.source.fromBuffer(this.zip,i,n,0,1);if(s===0)throw this.libzip.free(i),this.makeLibzipError(this.libzip.getError(this.zip));return s}setFileSource(t,i){let n=Buffer.isBuffer(i)?i:Buffer.from(i),s=x.relative(Oe.root,t),o=this.allocateSource(i);try{let a=this.libzip.file.add(this.zip,s,o,this.libzip.ZIP_FL_OVERWRITE);if(a===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!==\"mixed\"){let l=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,a,0,l,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(a,n),a}catch(a){throw this.libzip.source.free(o),a}}isSymbolicLink(t){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,t,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>16&61440)===40960}getFileSource(t,i={asyncDecompress:!1}){let n=this.fileSources.get(t);if(typeof n<\"u\")return n;let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,t,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.libzip.struct.statCompSize(s),l=this.libzip.struct.statCompMethod(s),c=this.libzip.malloc(a);try{let u=this.libzip.fopenIndex(this.zip,t,0,this.libzip.ZIP_FL_COMPRESSED);if(u===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let g=this.libzip.fread(u,c,a,0);if(g===-1)throw this.makeLibzipError(this.libzip.file.getError(u));if(g<a)throw new Error(\"Incomplete read\");if(g>a)throw new Error(\"Overread\");let f=this.libzip.HEAPU8.subarray(c,c+a),h=Buffer.from(f);if(l===0)return this.fileSources.set(t,h),h;if(i.asyncDecompress)return new Promise((p,C)=>{yS.default.inflateRaw(h,(y,B)=>{y?C(y):(this.fileSources.set(t,B),p(B))})});{let p=yS.default.inflateRawSync(h);return this.fileSources.set(t,p),p}}finally{this.libzip.fclose(u)}}finally{this.libzip.free(c)}}async fchmodPromise(t,i){return this.chmodPromise(this.fdToPath(t,\"fchmod\"),i)}fchmodSync(t,i){return this.chmodSync(this.fdToPath(t,\"fchmodSync\"),i)}async chmodPromise(t,i){return this.chmodSync(t,i)}chmodSync(t,i){if(this.readOnly)throw cn(`chmod '${t}'`);i&=493;let n=this.resolveFilename(`chmod '${t}'`,t,!1),s=this.entries.get(n);if(typeof s>\"u\")throw new Error(`Assertion failed: The entry should have been registered (${n})`);let a=this.getUnixMode(s,32768)&-512|i;if(this.libzip.file.setExternalAttributes(this.zip,s,0,0,this.libzip.ZIP_OPSYS_UNIX,a<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(t,i,n){return this.chownPromise(this.fdToPath(t,\"fchown\"),i,n)}fchownSync(t,i,n){return this.chownSync(this.fdToPath(t,\"fchownSync\"),i,n)}async chownPromise(t,i,n){return this.chownSync(t,i,n)}chownSync(t,i,n){throw new Error(\"Unimplemented\")}async renamePromise(t,i){return this.renameSync(t,i)}renameSync(t,i){throw new Error(\"Unimplemented\")}async copyFilePromise(t,i,n){let{indexSource:s,indexDest:o,resolvedDestP:a}=this.prepareCopyFile(t,i,n),l=await this.getFileSource(s,{asyncDecompress:!0}),c=this.setFileSource(a,l);c!==o&&this.registerEntry(a,c)}copyFileSync(t,i,n=0){let{indexSource:s,indexDest:o,resolvedDestP:a}=this.prepareCopyFile(t,i,n),l=this.getFileSource(s),c=this.setFileSource(a,l);c!==o&&this.registerEntry(a,c)}prepareCopyFile(t,i,n=0){if(this.readOnly)throw cn(`copyfile '${t} -> '${i}'`);if((n&bg.constants.COPYFILE_FICLONE_FORCE)!==0)throw Up(\"unsupported clone operation\",`copyfile '${t}' -> ${i}'`);let s=this.resolveFilename(`copyfile '${t} -> ${i}'`,t),o=this.entries.get(s);if(typeof o>\"u\")throw vA(`copyfile '${t}' -> '${i}'`);let a=this.resolveFilename(`copyfile '${t}' -> ${i}'`,i),l=this.entries.get(a);if((n&(bg.constants.COPYFILE_EXCL|bg.constants.COPYFILE_FICLONE_FORCE))!==0&&typeof l<\"u\")throw eI(`copyfile '${t}' -> '${i}'`);return{indexSource:o,resolvedDestP:a,indexDest:l}}async appendFilePromise(t,i,n){if(this.readOnly)throw cn(`open '${t}'`);return typeof n>\"u\"?n={flag:\"a\"}:typeof n==\"string\"?n={flag:\"a\",encoding:n}:typeof n.flag>\"u\"&&(n={flag:\"a\",...n}),this.writeFilePromise(t,i,n)}appendFileSync(t,i,n={}){if(this.readOnly)throw cn(`open '${t}'`);return typeof n>\"u\"?n={flag:\"a\"}:typeof n==\"string\"?n={flag:\"a\",encoding:n}:typeof n.flag>\"u\"&&(n={flag:\"a\",...n}),this.writeFileSync(t,i,n)}fdToPath(t,i){var s;let n=(s=this.fds.get(t))==null?void 0:s.p;if(typeof n>\"u\")throw Hr(i);return n}async writeFilePromise(t,i,n){let{encoding:s,mode:o,index:a,resolvedP:l}=this.prepareWriteFile(t,n);a!==void 0&&typeof n==\"object\"&&n.flag&&n.flag.includes(\"a\")&&(i=Buffer.concat([await this.getFileSource(a,{asyncDecompress:!0}),Buffer.from(i)])),s!==null&&(i=i.toString(s));let c=this.setFileSource(l,i);c!==a&&this.registerEntry(l,c),o!==null&&await this.chmodPromise(l,o)}writeFileSync(t,i,n){let{encoding:s,mode:o,index:a,resolvedP:l}=this.prepareWriteFile(t,n);a!==void 0&&typeof n==\"object\"&&n.flag&&n.flag.includes(\"a\")&&(i=Buffer.concat([this.getFileSource(a),Buffer.from(i)])),s!==null&&(i=i.toString(s));let c=this.setFileSource(l,i);c!==a&&this.registerEntry(l,c),o!==null&&this.chmodSync(l,o)}prepareWriteFile(t,i){if(typeof t==\"number\"&&(t=this.fdToPath(t,\"read\")),this.readOnly)throw cn(`open '${t}'`);let n=this.resolveFilename(`open '${t}'`,t);if(this.listings.has(n))throw Kp(`open '${t}'`);let s=null,o=null;typeof i==\"string\"?s=i:typeof i==\"object\"&&({encoding:s=null,mode:o=null}=i);let a=this.entries.get(n);return{encoding:s,mode:o,resolvedP:n,index:a}}async unlinkPromise(t){return this.unlinkSync(t)}unlinkSync(t){if(this.readOnly)throw cn(`unlink '${t}'`);let i=this.resolveFilename(`unlink '${t}'`,t);if(this.listings.has(i))throw Kp(`unlink '${t}'`);let n=this.entries.get(i);if(typeof n>\"u\")throw vA(`unlink '${t}'`);this.deleteEntry(i,n)}async utimesPromise(t,i,n){return this.utimesSync(t,i,n)}utimesSync(t,i,n){if(this.readOnly)throw cn(`utimes '${t}'`);let s=this.resolveFilename(`utimes '${t}'`,t);this.utimesImpl(s,n)}async lutimesPromise(t,i,n){return this.lutimesSync(t,i,n)}lutimesSync(t,i,n){if(this.readOnly)throw cn(`lutimes '${t}'`);let s=this.resolveFilename(`utimes '${t}'`,t,!1);this.utimesImpl(s,n)}utimesImpl(t,i){this.listings.has(t)&&(this.entries.has(t)||this.hydrateDirectory(t));let n=this.entries.get(t);if(n===void 0)throw new Error(\"Unreachable\");if(this.libzip.file.setMtime(this.zip,n,0,jge(i),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(t,i){return this.mkdirSync(t,i)}mkdirSync(t,{mode:i=493,recursive:n=!1}={}){if(n)return this.mkdirpSync(t,{chmod:i});if(this.readOnly)throw cn(`mkdir '${t}'`);let s=this.resolveFilename(`mkdir '${t}'`,t);if(this.entries.has(s)||this.listings.has(s))throw eI(`mkdir '${t}'`);this.hydrateDirectory(s),this.chmodSync(s,i)}async rmdirPromise(t,i){return this.rmdirSync(t,i)}rmdirSync(t,{recursive:i=!1}={}){if(this.readOnly)throw cn(`rmdir '${t}'`);if(i){this.removeSync(t);return}let n=this.resolveFilename(`rmdir '${t}'`,t),s=this.listings.get(n);if(!s)throw Qo(`rmdir '${t}'`);if(s.size>0)throw aU(`rmdir '${t}'`);let o=this.entries.get(n);if(typeof o>\"u\")throw vA(`rmdir '${t}'`);this.deleteEntry(t,o)}hydrateDirectory(t){let i=this.libzip.dir.add(this.zip,x.relative(Oe.root,t));if(i===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(t),this.registerEntry(t,i),i}async linkPromise(t,i){return this.linkSync(t,i)}linkSync(t,i){throw AU(`link '${t}' -> '${i}'`)}async symlinkPromise(t,i){return this.symlinkSync(t,i)}symlinkSync(t,i){if(this.readOnly)throw cn(`symlink '${t}' -> '${i}'`);let n=this.resolveFilename(`symlink '${t}' -> '${i}'`,i);if(this.listings.has(n))throw Kp(`symlink '${t}' -> '${i}'`);if(this.entries.has(n))throw eI(`symlink '${t}' -> '${i}'`);let s=this.setFileSource(n,t);if(this.registerEntry(n,s),this.libzip.file.setExternalAttributes(this.zip,s,0,0,this.libzip.ZIP_OPSYS_UNIX,41471<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(t,i){typeof i==\"object\"&&(i=i?i.encoding:void 0);let n=await this.readFileBuffer(t,{asyncDecompress:!0});return i?n.toString(i):n}readFileSync(t,i){typeof i==\"object\"&&(i=i?i.encoding:void 0);let n=this.readFileBuffer(t);return i?n.toString(i):n}readFileBuffer(t,i={asyncDecompress:!1}){typeof t==\"number\"&&(t=this.fdToPath(t,\"read\"));let n=this.resolveFilename(`open '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`open '${t}'`);if(t[t.length-1]===\"/\"&&!this.listings.has(n))throw Qo(`open '${t}'`);if(this.listings.has(n))throw Kp(\"read\");let s=this.entries.get(n);if(s===void 0)throw new Error(\"Unreachable\");return this.getFileSource(s,i)}async readdirPromise(t,i){return this.readdirSync(t,i)}readdirSync(t,i){let n=this.resolveFilename(`scandir '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`scandir '${t}'`);let s=this.listings.get(n);if(!s)throw Qo(`scandir '${t}'`);let o=[...s];return i!=null&&i.withFileTypes?o.map(a=>Object.assign(this.statImpl(\"lstat\",x.join(t,a)),{name:a})):o}async readlinkPromise(t){let i=this.prepareReadlink(t);return(await this.getFileSource(i,{asyncDecompress:!0})).toString()}readlinkSync(t){let i=this.prepareReadlink(t);return this.getFileSource(i).toString()}prepareReadlink(t){let i=this.resolveFilename(`readlink '${t}'`,t,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw Js(`readlink '${t}'`);if(t[t.length-1]===\"/\"&&!this.listings.has(i))throw Qo(`open '${t}'`);if(this.listings.has(i))throw vA(`readlink '${t}'`);let n=this.entries.get(i);if(n===void 0)throw new Error(\"Unreachable\");if(!this.isSymbolicLink(n))throw vA(`readlink '${t}'`);return n}async truncatePromise(t,i=0){let n=this.resolveFilename(`open '${t}'`,t),s=this.entries.get(n);if(typeof s>\"u\")throw vA(`open '${t}'`);let o=await this.getFileSource(s,{asyncDecompress:!0}),a=Buffer.alloc(i,0);return o.copy(a),await this.writeFilePromise(t,a)}truncateSync(t,i=0){let n=this.resolveFilename(`open '${t}'`,t),s=this.entries.get(n);if(typeof s>\"u\")throw vA(`open '${t}'`);let o=this.getFileSource(s),a=Buffer.alloc(i,0);return o.copy(a),this.writeFileSync(t,a)}async ftruncatePromise(t,i){return this.truncatePromise(this.fdToPath(t,\"ftruncate\"),i)}ftruncateSync(t,i){return this.truncateSync(this.fdToPath(t,\"ftruncateSync\"),i)}watch(t,i,n){let s;switch(typeof i){case\"function\":case\"string\":case\"undefined\":s=!0;break;default:({persistent:s=!0}=i);break}if(!s)return{on:()=>{},close:()=>{}};let o=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(o)}}}watchFile(t,i,n){let s=x.resolve(Oe.root,t);return iI(this,s,i,n)}unwatchFile(t,i){let n=x.resolve(Oe.root,t);return Gp(this,n,i)}};var pi=class extends Ia{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,i){return this.baseFs.openPromise(this.mapToBase(e),t,i)}openSync(e,t,i){return this.baseFs.openSync(this.mapToBase(e),t,i)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,i,n,s){return await this.baseFs.readPromise(e,t,i,n,s)}readSync(e,t,i,n,s){return this.baseFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return typeof t==\"string\"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s)}writeSync(e,t,i,n,s){return typeof t==\"string\"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e,t){return this.baseFs.statPromise(this.mapToBase(e),t)}statSync(e,t){return this.baseFs.statSync(this.mapToBase(e),t)}async fstatPromise(e,t){return this.baseFs.fstatPromise(e,t)}fstatSync(e,t){return this.baseFs.fstatSync(e,t)}lstatPromise(e,t){return this.baseFs.lstatPromise(this.mapToBase(e),t)}lstatSync(e,t){return this.baseFs.lstatSync(this.mapToBase(e),t)}async fchmodPromise(e,t){return this.baseFs.fchmodPromise(e,t)}fchmodSync(e,t){return this.baseFs.fchmodSync(e,t)}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async fchownPromise(e,t,i){return this.baseFs.fchownPromise(e,t,i)}fchownSync(e,t,i){return this.baseFs.fchownSync(e,t,i)}async chownPromise(e,t,i){return this.baseFs.chownPromise(this.mapToBase(e),t,i)}chownSync(e,t,i){return this.baseFs.chownSync(this.mapToBase(e),t,i)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),i)}copyFileSync(e,t,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),i)}async appendFilePromise(e,t,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,i)}appendFileSync(e,t,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,i)}async writeFilePromise(e,t,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,i)}writeFileSync(e,t,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,i){return this.baseFs.utimesPromise(this.mapToBase(e),t,i)}utimesSync(e,t,i){return this.baseFs.utimesSync(this.mapToBase(e),t,i)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,t){return t===\"utf8\"?this.baseFs.readFilePromise(this.fsMapToBase(e),t):this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return t===\"utf8\"?this.baseFs.readFileSync(this.fsMapToBase(e),t):this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,t){return this.baseFs.readdirPromise(this.mapToBase(e),t)}readdirSync(e,t){return this.baseFs.readdirSync(this.mapToBase(e),t)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}async ftruncatePromise(e,t){return this.baseFs.ftruncatePromise(e,t)}ftruncateSync(e,t){return this.baseFs.ftruncateSync(e,t)}watch(e,t,i){return this.baseFs.watch(this.mapToBase(e),t,i)}watchFile(e,t,i){return this.baseFs.watchFile(this.mapToBase(e),t,i)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return typeof e==\"number\"?e:this.mapToBase(e)}};var bo=class extends pi{constructor(t,{baseFs:i,pathUtils:n}){super(n);this.target=t,this.baseFs=i}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(t){return t}mapToBase(t){return t}};var qt=class extends pi{constructor(t,{baseFs:i=new $t}={}){super(x);this.target=this.pathUtils.normalize(t),this.baseFs=i}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(t){return this.pathUtils.isAbsolute(t)?x.normalize(t):this.baseFs.resolve(x.join(this.target,t))}mapFromBase(t){return t}mapToBase(t){return this.pathUtils.isAbsolute(t)?t:this.pathUtils.join(this.target,t)}};var pU=Oe.root,So=class extends pi{constructor(t,{baseFs:i=new $t}={}){super(x);this.target=this.pathUtils.resolve(Oe.root,t),this.baseFs=i}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Oe.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(t){let i=this.pathUtils.normalize(t);if(this.pathUtils.isAbsolute(t))return this.pathUtils.resolve(this.target,this.pathUtils.relative(pU,t));if(i.match(/^\\.\\.\\/?/))throw new Error(`Resolving this path (${t}) would escape the jail`);return this.pathUtils.resolve(this.target,t)}mapFromBase(t){return this.pathUtils.resolve(pU,this.pathUtils.relative(this.target,t))}};var Sg=class extends pi{constructor(t,i){super(i);this.instance=null;this.factory=t}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(t){this.instance=t}mapFromBase(t){return t}mapToBase(t){return t}};var Ze=()=>Object.assign(new Error(\"ENOSYS: unsupported filesystem access\"),{code:\"ENOSYS\"}),wS=class extends Ia{constructor(){super(x)}getExtractHint(){throw Ze()}getRealPath(){throw Ze()}resolve(){throw Ze()}async openPromise(){throw Ze()}openSync(){throw Ze()}async opendirPromise(){throw Ze()}opendirSync(){throw Ze()}async readPromise(){throw Ze()}readSync(){throw Ze()}async writePromise(){throw Ze()}writeSync(){throw Ze()}async closePromise(){throw Ze()}closeSync(){throw Ze()}createWriteStream(){throw Ze()}createReadStream(){throw Ze()}async realpathPromise(){throw Ze()}realpathSync(){throw Ze()}async readdirPromise(){throw Ze()}readdirSync(){throw Ze()}async existsPromise(e){throw Ze()}existsSync(e){throw Ze()}async accessPromise(){throw Ze()}accessSync(){throw Ze()}async statPromise(){throw Ze()}statSync(){throw Ze()}async fstatPromise(e){throw Ze()}fstatSync(e){throw Ze()}async lstatPromise(e){throw Ze()}lstatSync(e){throw Ze()}async fchmodPromise(){throw Ze()}fchmodSync(){throw Ze()}async chmodPromise(){throw Ze()}chmodSync(){throw Ze()}async fchownPromise(){throw Ze()}fchownSync(){throw Ze()}async chownPromise(){throw Ze()}chownSync(){throw Ze()}async mkdirPromise(){throw Ze()}mkdirSync(){throw Ze()}async rmdirPromise(){throw Ze()}rmdirSync(){throw Ze()}async linkPromise(){throw Ze()}linkSync(){throw Ze()}async symlinkPromise(){throw Ze()}symlinkSync(){throw Ze()}async renamePromise(){throw Ze()}renameSync(){throw Ze()}async copyFilePromise(){throw Ze()}copyFileSync(){throw Ze()}async appendFilePromise(){throw Ze()}appendFileSync(){throw Ze()}async writeFilePromise(){throw Ze()}writeFileSync(){throw Ze()}async unlinkPromise(){throw Ze()}unlinkSync(){throw Ze()}async utimesPromise(){throw Ze()}utimesSync(){throw Ze()}async readFilePromise(){throw Ze()}readFileSync(){throw Ze()}async readlinkPromise(){throw Ze()}readlinkSync(){throw Ze()}async truncatePromise(){throw Ze()}truncateSync(){throw Ze()}async ftruncatePromise(e,t){throw Ze()}ftruncateSync(e,t){throw Ze()}watch(){throw Ze()}watchFile(){throw Ze()}unwatchFile(){throw Ze()}},jp=wS;jp.instance=new wS;var vg=class extends pi{constructor(t){super(U);this.baseFs=t}mapFromBase(t){return U.fromPortablePath(t)}mapToBase(t){return U.toPortablePath(t)}};var qge=/^[0-9]+$/,BS=/^(\\/(?:[^/]+\\/)*?(?:\\$\\$virtual|__virtual__))((?:\\/((?:[^/]+-)?[a-f0-9]+)(?:\\/([^/]+))?)?((?:\\/.*)?))$/,Jge=/^([^/]+-)?[a-f0-9]+$/,Br=class extends pi{constructor({baseFs:t=new $t}={}){super(x);this.baseFs=t}static makeVirtualPath(t,i,n){if(x.basename(t)!==\"__virtual__\")throw new Error('Assertion failed: Virtual folders must be named \"__virtual__\"');if(!x.basename(i).match(Jge))throw new Error(\"Assertion failed: Virtual components must be ended by an hexadecimal hash\");let o=x.relative(x.dirname(t),n).split(\"/\"),a=0;for(;a<o.length&&o[a]===\"..\";)a+=1;let l=o.slice(a);return x.join(t,i,String(a),...l)}static resolveVirtual(t){let i=t.match(BS);if(!i||!i[3]&&i[5])return t;let n=x.dirname(i[1]);if(!i[3]||!i[4])return n;if(!qge.test(i[4]))return t;let o=Number(i[4]),a=\"../\".repeat(o),l=i[5]||\".\";return Br.resolveVirtual(x.join(n,a,l))}getExtractHint(t){return this.baseFs.getExtractHint(t)}getRealPath(){return this.baseFs.getRealPath()}realpathSync(t){let i=t.match(BS);if(!i)return this.baseFs.realpathSync(t);if(!i[5])return t;let n=this.baseFs.realpathSync(this.mapToBase(t));return Br.makeVirtualPath(i[1],i[3],n)}async realpathPromise(t){let i=t.match(BS);if(!i)return await this.baseFs.realpathPromise(t);if(!i[5])return t;let n=await this.baseFs.realpathPromise(this.mapToBase(t));return Br.makeVirtualPath(i[1],i[3],n)}mapToBase(t){if(t===\"\")return t;if(this.pathUtils.isAbsolute(t))return Br.resolveVirtual(t);let i=Br.resolveVirtual(this.baseFs.resolve(Oe.dot)),n=Br.resolveVirtual(this.baseFs.resolve(t));return x.relative(i,n)||Oe.dot}mapFromBase(t){return t}};var qp=J(\"fs\");var un=4278190080,zi=704643072,dU=(r,e)=>{let t=r.indexOf(e);if(t<=0)return null;let i=t;for(;t>=0&&(i=t+e.length,r[i]!==x.sep);){if(r[t-1]===x.sep)return null;t=r.indexOf(e,i)}return r.length>i&&r[i]!==x.sep?null:r.slice(0,i)},Mn=class extends xA{constructor({libzip:t,baseFs:i=new $t,filter:n=null,maxOpenFiles:s=1/0,readOnlyArchives:o=!1,useCache:a=!0,maxAge:l=5e3,fileExtensions:c=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof t!=\"function\"?()=>t:t,this.baseFs=i,this.zipInstances=a?new Map:null,this.filter=n,this.maxOpenFiles=s,this.readOnlyArchives=o,this.maxAge=l,this.fileExtensions=c}static async openPromise(t,i){let n=new Mn(i);try{return await t(n)}finally{n.saveAndClose()}}get libzip(){return typeof this.libzipInstance>\"u\"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(t){return this.baseFs.getExtractHint(t)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(Yp(this),this.zipInstances)for(let[t,{zipFs:i}]of this.zipInstances.entries())i.saveAndClose(),this.zipInstances.delete(t)}discardAndClose(){if(Yp(this),this.zipInstances)for(let[t,{zipFs:i}]of this.zipInstances.entries())i.discardAndClose(),this.zipInstances.delete(t)}resolve(t){return this.baseFs.resolve(t)}remapFd(t,i){let n=this.nextFd++|zi;return this.fdMap.set(n,[t,i]),n}async openPromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.openPromise(t,i,n),async(s,{subPath:o})=>this.remapFd(s,await s.openPromise(o,i,n)))}openSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.openSync(t,i,n),(s,{subPath:o})=>this.remapFd(s,s.openSync(o,i,n)))}async opendirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.opendirPromise(t,i),async(n,{subPath:s})=>await n.opendirPromise(s,i),{requireSubpath:!1})}opendirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.opendirSync(t,i),(n,{subPath:s})=>n.opendirSync(s,i),{requireSubpath:!1})}async readPromise(t,i,n,s,o){if((t&un)!==zi)return await this.baseFs.readPromise(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"read\");let[l,c]=a;return await l.readPromise(c,i,n,s,o)}readSync(t,i,n,s,o){if((t&un)!==zi)return this.baseFs.readSync(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"readSync\");let[l,c]=a;return l.readSync(c,i,n,s,o)}async writePromise(t,i,n,s,o){if((t&un)!==zi)return typeof i==\"string\"?await this.baseFs.writePromise(t,i,n):await this.baseFs.writePromise(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"write\");let[l,c]=a;return typeof i==\"string\"?await l.writePromise(c,i,n):await l.writePromise(c,i,n,s,o)}writeSync(t,i,n,s,o){if((t&un)!==zi)return typeof i==\"string\"?this.baseFs.writeSync(t,i,n):this.baseFs.writeSync(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"writeSync\");let[l,c]=a;return typeof i==\"string\"?l.writeSync(c,i,n):l.writeSync(c,i,n,s,o)}async closePromise(t){if((t&un)!==zi)return await this.baseFs.closePromise(t);let i=this.fdMap.get(t);if(typeof i>\"u\")throw Hr(\"close\");this.fdMap.delete(t);let[n,s]=i;return await n.closePromise(s)}closeSync(t){if((t&un)!==zi)return this.baseFs.closeSync(t);let i=this.fdMap.get(t);if(typeof i>\"u\")throw Hr(\"closeSync\");this.fdMap.delete(t);let[n,s]=i;return n.closeSync(s)}createReadStream(t,i){return t===null?this.baseFs.createReadStream(t,i):this.makeCallSync(t,()=>this.baseFs.createReadStream(t,i),(n,{archivePath:s,subPath:o})=>{let a=n.createReadStream(o,i);return a.path=U.fromPortablePath(this.pathUtils.join(s,o)),a})}createWriteStream(t,i){return t===null?this.baseFs.createWriteStream(t,i):this.makeCallSync(t,()=>this.baseFs.createWriteStream(t,i),(n,{subPath:s})=>n.createWriteStream(s,i))}async realpathPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.realpathPromise(t),async(i,{archivePath:n,subPath:s})=>{let o=this.realPaths.get(n);return typeof o>\"u\"&&(o=await this.baseFs.realpathPromise(n),this.realPaths.set(n,o)),this.pathUtils.join(o,this.pathUtils.relative(Oe.root,await i.realpathPromise(s)))})}realpathSync(t){return this.makeCallSync(t,()=>this.baseFs.realpathSync(t),(i,{archivePath:n,subPath:s})=>{let o=this.realPaths.get(n);return typeof o>\"u\"&&(o=this.baseFs.realpathSync(n),this.realPaths.set(n,o)),this.pathUtils.join(o,this.pathUtils.relative(Oe.root,i.realpathSync(s)))})}async existsPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.existsPromise(t),async(i,{subPath:n})=>await i.existsPromise(n))}existsSync(t){return this.makeCallSync(t,()=>this.baseFs.existsSync(t),(i,{subPath:n})=>i.existsSync(n))}async accessPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.accessPromise(t,i),async(n,{subPath:s})=>await n.accessPromise(s,i))}accessSync(t,i){return this.makeCallSync(t,()=>this.baseFs.accessSync(t,i),(n,{subPath:s})=>n.accessSync(s,i))}async statPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.statPromise(t,i),async(n,{subPath:s})=>await n.statPromise(s,i))}statSync(t,i){return this.makeCallSync(t,()=>this.baseFs.statSync(t,i),(n,{subPath:s})=>n.statSync(s,i))}async fstatPromise(t,i){if((t&un)!==zi)return this.baseFs.fstatPromise(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fstat\");let[s,o]=n;return s.fstatPromise(o,i)}fstatSync(t,i){if((t&un)!==zi)return this.baseFs.fstatSync(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fstatSync\");let[s,o]=n;return s.fstatSync(o,i)}async lstatPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.lstatPromise(t,i),async(n,{subPath:s})=>await n.lstatPromise(s,i))}lstatSync(t,i){return this.makeCallSync(t,()=>this.baseFs.lstatSync(t,i),(n,{subPath:s})=>n.lstatSync(s,i))}async fchmodPromise(t,i){if((t&un)!==zi)return this.baseFs.fchmodPromise(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fchmod\");let[s,o]=n;return s.fchmodPromise(o,i)}fchmodSync(t,i){if((t&un)!==zi)return this.baseFs.fchmodSync(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fchmodSync\");let[s,o]=n;return s.fchmodSync(o,i)}async chmodPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.chmodPromise(t,i),async(n,{subPath:s})=>await n.chmodPromise(s,i))}chmodSync(t,i){return this.makeCallSync(t,()=>this.baseFs.chmodSync(t,i),(n,{subPath:s})=>n.chmodSync(s,i))}async fchownPromise(t,i,n){if((t&un)!==zi)return this.baseFs.fchownPromise(t,i,n);let s=this.fdMap.get(t);if(typeof s>\"u\")throw Hr(\"fchown\");let[o,a]=s;return o.fchownPromise(a,i,n)}fchownSync(t,i,n){if((t&un)!==zi)return this.baseFs.fchownSync(t,i,n);let s=this.fdMap.get(t);if(typeof s>\"u\")throw Hr(\"fchownSync\");let[o,a]=s;return o.fchownSync(a,i,n)}async chownPromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.chownPromise(t,i,n),async(s,{subPath:o})=>await s.chownPromise(o,i,n))}chownSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.chownSync(t,i,n),(s,{subPath:o})=>s.chownSync(o,i,n))}async renamePromise(t,i){return await this.makeCallPromise(t,async()=>await this.makeCallPromise(i,async()=>await this.baseFs.renamePromise(t,i),async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),async(n,{subPath:s})=>await this.makeCallPromise(i,async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},async(o,{subPath:a})=>{if(n!==o)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return await n.renamePromise(s,a)}))}renameSync(t,i){return this.makeCallSync(t,()=>this.makeCallSync(i,()=>this.baseFs.renameSync(t,i),()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),(n,{subPath:s})=>this.makeCallSync(i,()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},(o,{subPath:a})=>{if(n!==o)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return n.renameSync(s,a)}))}async copyFilePromise(t,i,n=0){let s=async(o,a,l,c)=>{if((n&qp.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${a}' -> ${c}'`),{code:\"EXDEV\"});if(n&qp.constants.COPYFILE_EXCL&&await this.existsPromise(a))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${a}' -> '${c}'`),{code:\"EEXIST\"});let u;try{u=await o.readFilePromise(a)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${a}' -> '${c}'`),{code:\"EINVAL\"})}await l.writeFilePromise(c,u)};return await this.makeCallPromise(t,async()=>await this.makeCallPromise(i,async()=>await this.baseFs.copyFilePromise(t,i,n),async(o,{subPath:a})=>await s(this.baseFs,t,o,a)),async(o,{subPath:a})=>await this.makeCallPromise(i,async()=>await s(o,a,this.baseFs,i),async(l,{subPath:c})=>o!==l?await s(o,a,l,c):await o.copyFilePromise(a,c,n)))}copyFileSync(t,i,n=0){let s=(o,a,l,c)=>{if((n&qp.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${a}' -> ${c}'`),{code:\"EXDEV\"});if(n&qp.constants.COPYFILE_EXCL&&this.existsSync(a))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${a}' -> '${c}'`),{code:\"EEXIST\"});let u;try{u=o.readFileSync(a)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${a}' -> '${c}'`),{code:\"EINVAL\"})}l.writeFileSync(c,u)};return this.makeCallSync(t,()=>this.makeCallSync(i,()=>this.baseFs.copyFileSync(t,i,n),(o,{subPath:a})=>s(this.baseFs,t,o,a)),(o,{subPath:a})=>this.makeCallSync(i,()=>s(o,a,this.baseFs,i),(l,{subPath:c})=>o!==l?s(o,a,l,c):o.copyFileSync(a,c,n)))}async appendFilePromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.appendFilePromise(t,i,n),async(s,{subPath:o})=>await s.appendFilePromise(o,i,n))}appendFileSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.appendFileSync(t,i,n),(s,{subPath:o})=>s.appendFileSync(o,i,n))}async writeFilePromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.writeFilePromise(t,i,n),async(s,{subPath:o})=>await s.writeFilePromise(o,i,n))}writeFileSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.writeFileSync(t,i,n),(s,{subPath:o})=>s.writeFileSync(o,i,n))}async unlinkPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.unlinkPromise(t),async(i,{subPath:n})=>await i.unlinkPromise(n))}unlinkSync(t){return this.makeCallSync(t,()=>this.baseFs.unlinkSync(t),(i,{subPath:n})=>i.unlinkSync(n))}async utimesPromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.utimesPromise(t,i,n),async(s,{subPath:o})=>await s.utimesPromise(o,i,n))}utimesSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.utimesSync(t,i,n),(s,{subPath:o})=>s.utimesSync(o,i,n))}async mkdirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.mkdirPromise(t,i),async(n,{subPath:s})=>await n.mkdirPromise(s,i))}mkdirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.mkdirSync(t,i),(n,{subPath:s})=>n.mkdirSync(s,i))}async rmdirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.rmdirPromise(t,i),async(n,{subPath:s})=>await n.rmdirPromise(s,i))}rmdirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.rmdirSync(t,i),(n,{subPath:s})=>n.rmdirSync(s,i))}async linkPromise(t,i){return await this.makeCallPromise(i,async()=>await this.baseFs.linkPromise(t,i),async(n,{subPath:s})=>await n.linkPromise(t,s))}linkSync(t,i){return this.makeCallSync(i,()=>this.baseFs.linkSync(t,i),(n,{subPath:s})=>n.linkSync(t,s))}async symlinkPromise(t,i,n){return await this.makeCallPromise(i,async()=>await this.baseFs.symlinkPromise(t,i,n),async(s,{subPath:o})=>await s.symlinkPromise(t,o))}symlinkSync(t,i,n){return this.makeCallSync(i,()=>this.baseFs.symlinkSync(t,i,n),(s,{subPath:o})=>s.symlinkSync(t,o))}async readFilePromise(t,i){return this.makeCallPromise(t,async()=>{switch(i){case\"utf8\":return await this.baseFs.readFilePromise(t,i);default:return await this.baseFs.readFilePromise(t,i)}},async(n,{subPath:s})=>await n.readFilePromise(s,i))}readFileSync(t,i){return this.makeCallSync(t,()=>{switch(i){case\"utf8\":return this.baseFs.readFileSync(t,i);default:return this.baseFs.readFileSync(t,i)}},(n,{subPath:s})=>n.readFileSync(s,i))}async readdirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.readdirPromise(t,i),async(n,{subPath:s})=>await n.readdirPromise(s,i),{requireSubpath:!1})}readdirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.readdirSync(t,i),(n,{subPath:s})=>n.readdirSync(s,i),{requireSubpath:!1})}async readlinkPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.readlinkPromise(t),async(i,{subPath:n})=>await i.readlinkPromise(n))}readlinkSync(t){return this.makeCallSync(t,()=>this.baseFs.readlinkSync(t),(i,{subPath:n})=>i.readlinkSync(n))}async truncatePromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.truncatePromise(t,i),async(n,{subPath:s})=>await n.truncatePromise(s,i))}truncateSync(t,i){return this.makeCallSync(t,()=>this.baseFs.truncateSync(t,i),(n,{subPath:s})=>n.truncateSync(s,i))}async ftruncatePromise(t,i){if((t&un)!==zi)return this.baseFs.ftruncatePromise(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"ftruncate\");let[s,o]=n;return s.ftruncatePromise(o,i)}ftruncateSync(t,i){if((t&un)!==zi)return this.baseFs.ftruncateSync(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"ftruncateSync\");let[s,o]=n;return s.ftruncateSync(o,i)}watch(t,i,n){return this.makeCallSync(t,()=>this.baseFs.watch(t,i,n),(s,{subPath:o})=>s.watch(o,i,n))}watchFile(t,i,n){return this.makeCallSync(t,()=>this.baseFs.watchFile(t,i,n),()=>iI(this,t,i,n))}unwatchFile(t,i){return this.makeCallSync(t,()=>this.baseFs.unwatchFile(t,i),()=>Gp(this,t,i))}async makeCallPromise(t,i,n,{requireSubpath:s=!0}={}){if(typeof t!=\"string\")return await i();let o=this.resolve(t),a=this.findZip(o);return a?s&&a.subPath===\"/\"?await i():await this.getZipPromise(a.archivePath,async l=>await n(l,a)):await i()}makeCallSync(t,i,n,{requireSubpath:s=!0}={}){if(typeof t!=\"string\")return i();let o=this.resolve(t),a=this.findZip(o);return!a||s&&a.subPath===\"/\"?i():this.getZipSync(a.archivePath,l=>n(l,a))}findZip(t){if(this.filter&&!this.filter.test(t))return null;let i=\"\";for(;;){let n=t.substring(i.length),s;if(!this.fileExtensions)s=dU(n,\".zip\");else for(let o of this.fileExtensions)if(s=dU(n,o),s)break;if(!s)return null;if(i=this.pathUtils.join(i,s),this.isZip.has(i)===!1){if(this.notZip.has(i))continue;try{if(!this.baseFs.lstatSync(i).isFile()){this.notZip.add(i);continue}}catch{return null}this.isZip.add(i)}return{archivePath:i,subPath:this.pathUtils.join(Oe.root,t.substring(i.length))}}}limitOpenFiles(t){if(this.zipInstances===null)return;let i=Date.now(),n=i+this.maxAge,s=t===null?0:this.zipInstances.size-t;for(let[o,{zipFs:a,expiresAt:l,refCount:c}]of this.zipInstances.entries())if(!(c!==0||a.hasOpenFileHandles())){if(i>=l){a.saveAndClose(),this.zipInstances.delete(o),s-=1;continue}else if(t===null||s<=0){n=l;break}a.saveAndClose(),this.zipInstances.delete(o),s-=1}this.limitOpenFilesTimeout===null&&(t===null&&this.zipInstances.size>0||t!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},n-i).unref())}async getZipPromise(t,i){let n=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(t)});if(this.zipInstances){let s=this.zipInstances.get(t);if(!s){let o=await n();s=this.zipInstances.get(t),s||(s={zipFs:new Wr(t,o),expiresAt:0,refCount:0})}this.zipInstances.delete(t),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(t,s),s.expiresAt=Date.now()+this.maxAge,s.refCount+=1;try{return await i(s.zipFs)}finally{s.refCount-=1}}else{let s=new Wr(t,await n());try{return await i(s)}finally{s.saveAndClose()}}}getZipSync(t,i){let n=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(t)});if(this.zipInstances){let s=this.zipInstances.get(t);return s||(s={zipFs:new Wr(t,n()),expiresAt:0,refCount:0}),this.zipInstances.delete(t),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(t,s),s.expiresAt=Date.now()+this.maxAge,i(s.zipFs)}else{let s=new Wr(t,n());try{return i(s)}finally{s.saveAndClose()}}}};var Pg=J(\"util\");var sI=J(\"url\"),CU=J(\"util\");var nI=class extends pi{constructor(t){super(U);this.baseFs=t}mapFromBase(t){return t}mapToBase(t){if(typeof t==\"string\")return t;if(t instanceof sI.URL)return(0,sI.fileURLToPath)(t);if(Buffer.isBuffer(t)){let i=t.toString();if(Buffer.byteLength(i)!==t.byteLength)throw new Error(\"Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942\");return i}throw new Error(`Unsupported path type: ${(0,CU.inspect)(t)}`)}};var mU=J(\"readline\"),Fi=Symbol(\"kBaseFs\"),ya=Symbol(\"kFd\"),PA=Symbol(\"kClosePromise\"),oI=Symbol(\"kCloseResolve\"),aI=Symbol(\"kCloseReject\"),xg=Symbol(\"kRefs\"),Ws=Symbol(\"kRef\"),zs=Symbol(\"kUnref\"),Wge,zge,Vge,Xge,Jp=class{constructor(e,t){this[Wge]=1;this[zge]=void 0;this[Vge]=void 0;this[Xge]=void 0;this[Fi]=t,this[ya]=e}get fd(){return this[ya]}async appendFile(e,t){var i;try{this[Ws](this.appendFile);let n=(i=typeof t==\"string\"?t:t==null?void 0:t.encoding)!=null?i:void 0;return await this[Fi].appendFilePromise(this.fd,e,n?{encoding:n}:void 0)}finally{this[zs]()}}async chown(e,t){try{return this[Ws](this.chown),await this[Fi].fchownPromise(this.fd,e,t)}finally{this[zs]()}}async chmod(e){try{return this[Ws](this.chmod),await this[Fi].fchmodPromise(this.fd,e)}finally{this[zs]()}}createReadStream(e){return this[Fi].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Fi].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error(\"Method not implemented.\")}sync(){throw new Error(\"Method not implemented.\")}async read(e,t,i,n){var s,o,a;try{this[Ws](this.read);let l;return Buffer.isBuffer(e)?l=e:(e!=null||(e={}),l=(s=e.buffer)!=null?s:Buffer.alloc(16384),t=e.offset||0,i=(o=e.length)!=null?o:l.byteLength,n=(a=e.position)!=null?a:null),t!=null||(t=0),i!=null||(i=0),i===0?{bytesRead:i,buffer:l}:{bytesRead:await this[Fi].readPromise(this.fd,l,t,i,n),buffer:l}}finally{this[zs]()}}async readFile(e){var t;try{this[Ws](this.readFile);let i=(t=typeof e==\"string\"?e:e==null?void 0:e.encoding)!=null?t:void 0;return await this[Fi].readFilePromise(this.fd,i)}finally{this[zs]()}}readLines(e){return(0,mU.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Ws](this.stat),await this[Fi].fstatPromise(this.fd,e)}finally{this[zs]()}}async truncate(e){try{return this[Ws](this.truncate),await this[Fi].ftruncatePromise(this.fd,e)}finally{this[zs]()}}utimes(e,t){throw new Error(\"Method not implemented.\")}async writeFile(e,t){var i;try{this[Ws](this.writeFile);let n=(i=typeof t==\"string\"?t:t==null?void 0:t.encoding)!=null?i:void 0;await this[Fi].writeFilePromise(this.fd,e,n)}finally{this[zs]()}}async write(...e){try{if(this[Ws](this.write),ArrayBuffer.isView(e[0])){let[t,i,n,s]=e;return{bytesWritten:await this[Fi].writePromise(this.fd,t,i!=null?i:void 0,n!=null?n:void 0,s!=null?s:void 0),buffer:t}}else{let[t,i,n]=e;return{bytesWritten:await this[Fi].writePromise(this.fd,t,i,n),buffer:t}}}finally{this[zs]()}}async writev(e,t){try{this[Ws](this.writev);let i=0;if(typeof t<\"u\")for(let n of e){let s=await this.write(n,void 0,void 0,t);i+=s.bytesWritten,t+=s.bytesWritten}else for(let n of e){let s=await this.write(n);i+=s.bytesWritten}return{buffers:e,bytesWritten:i}}finally{this[zs]()}}readv(e,t){throw new Error(\"Method not implemented.\")}close(){if(this[ya]===-1)return Promise.resolve();if(this[PA])return this[PA];if(this[xg]--,this[xg]===0){let e=this[ya];this[ya]=-1,this[PA]=this[Fi].closePromise(e).finally(()=>{this[PA]=void 0})}else this[PA]=new Promise((e,t)=>{this[oI]=e,this[aI]=t}).finally(()=>{this[PA]=void 0,this[aI]=void 0,this[oI]=void 0});return this[PA]}[(Fi,ya,Wge=xg,zge=PA,Vge=oI,Xge=aI,Ws)](e){if(this[ya]===-1){let t=new Error(\"file closed\");throw t.code=\"EBADF\",t.syscall=e.name,t}this[xg]++}[zs](){if(this[xg]--,this[xg]===0){let e=this[ya];this[ya]=-1,this[Fi].closePromise(e).then(this[oI],this[aI])}}};var Zge=new Set([\"accessSync\",\"appendFileSync\",\"createReadStream\",\"createWriteStream\",\"chmodSync\",\"fchmodSync\",\"chownSync\",\"fchownSync\",\"closeSync\",\"copyFileSync\",\"linkSync\",\"lstatSync\",\"fstatSync\",\"lutimesSync\",\"mkdirSync\",\"openSync\",\"opendirSync\",\"readlinkSync\",\"readFileSync\",\"readdirSync\",\"readlinkSync\",\"realpathSync\",\"renameSync\",\"rmdirSync\",\"statSync\",\"symlinkSync\",\"truncateSync\",\"ftruncateSync\",\"unlinkSync\",\"unwatchFile\",\"utimesSync\",\"watch\",\"watchFile\",\"writeFileSync\",\"writeSync\"]),EU=new Set([\"accessPromise\",\"appendFilePromise\",\"fchmodPromise\",\"chmodPromise\",\"fchownPromise\",\"chownPromise\",\"closePromise\",\"copyFilePromise\",\"linkPromise\",\"fstatPromise\",\"lstatPromise\",\"lutimesPromise\",\"mkdirPromise\",\"openPromise\",\"opendirPromise\",\"readdirPromise\",\"realpathPromise\",\"readFilePromise\",\"readdirPromise\",\"readlinkPromise\",\"renamePromise\",\"rmdirPromise\",\"statPromise\",\"symlinkPromise\",\"truncatePromise\",\"ftruncatePromise\",\"unlinkPromise\",\"utimesPromise\",\"writeFilePromise\",\"writeSync\"]);function QS(r,e){e=new nI(e);let t=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Pg.promisify.custom])<\"u\"&&(s[Pg.promisify.custom]=o[Pg.promisify.custom])};{t(r,\"exists\",(i,...n)=>{let o=typeof n[n.length-1]==\"function\"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),t(r,\"read\",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of EU){let n=i.replace(/Promise$/,\"\");if(typeof r[n]>\"u\")continue;let s=e[i];if(typeof s>\"u\")continue;t(r,n,(...a)=>{let c=typeof a[a.length-1]==\"function\"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}r.realpath.native=r.realpath}{t(r,\"existsSync\",i=>{try{return e.existsSync(i)}catch{return!1}}),t(r,\"readSync\",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of Zge){let n=i;if(typeof r[n]>\"u\")continue;let s=e[i];typeof s>\"u\"||t(r,n,s.bind(e))}r.realpathSync.native=r.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=r.promises}finally{process.emitWarning=i}if(typeof n<\"u\"){for(let s of EU){let o=s.replace(/Promise$/,\"\");if(typeof n[o]>\"u\")continue;let a=e[s];typeof a>\"u\"||s!==\"open\"&&t(n,o,(l,...c)=>l instanceof Jp?l[o].apply(l,c):a.call(e,l,...c))}t(n,\"open\",async(...s)=>{let o=await e.openPromise(...s);return new Jp(o,e)})}}r.read[Pg.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),r.write[Pg.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function AI(r,e){let t=Object.create(r);return QS(t,e),t}var wU=Pe(J(\"os\"));function IU(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,\"0\");return`${r}${e}`}var Vs=new Set,bS=null;function yU(){if(bS)return bS;let r=U.toPortablePath(wU.default.tmpdir()),e=M.realpathSync(r);return process.once(\"exit\",()=>{M.rmtempSync()}),bS={tmpdir:r,realTmpdir:e}}var M=Object.assign(new $t,{detachTemp(r){Vs.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=yU();for(;;){let i=IU(\"xfs-\");try{this.mkdirSync(x.join(e,i))}catch(s){if(s.code===\"EEXIST\")continue;throw s}let n=x.join(t,i);if(Vs.add(n),typeof r>\"u\")return n;try{return r(n)}finally{if(Vs.has(n)){Vs.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(r){let{tmpdir:e,realTmpdir:t}=yU();for(;;){let i=IU(\"xfs-\");try{await this.mkdirPromise(x.join(e,i))}catch(s){if(s.code===\"EEXIST\")continue;throw s}let n=x.join(t,i);if(Vs.add(n),typeof r>\"u\")return n;try{return await r(n)}finally{if(Vs.has(n)){Vs.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Vs.values()).map(async r=>{try{await M.removePromise(r,{maxRetries:0}),Vs.delete(r)}catch{}}))},rmtempSync(){for(let r of Vs)try{M.removeSync(r),Vs.delete(r)}catch{}}});var fk=Pe(LS());var td={};ut(td,{parseResolution:()=>hI,parseShell:()=>uI,parseSyml:()=>yi,stringifyArgument:()=>US,stringifyArgumentSegment:()=>KS,stringifyArithmeticExpression:()=>fI,stringifyCommand:()=>MS,stringifyCommandChain:()=>Fg,stringifyCommandChainThen:()=>OS,stringifyCommandLine:()=>gI,stringifyCommandLineThen:()=>TS,stringifyEnvSegment:()=>cI,stringifyRedirectArgument:()=>zp,stringifyResolution:()=>pI,stringifyShell:()=>Rg,stringifyShellLine:()=>Rg,stringifySyml:()=>Ba,stringifyValueArgument:()=>_l});var gK=Pe(uK());function uI(r,e={isGlobPattern:()=>!1}){try{return(0,gK.parse)(r,e)}catch(t){throw t.location&&(t.message=t.message.replace(/(\\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function Rg(r,{endSemicolon:e=!1}={}){return r.map(({command:t,type:i},n)=>`${gI(t)}${i===\";\"?n!==r.length-1||e?\";\":\"\":\" &\"}`).join(\" \")}function gI(r){return`${Fg(r.chain)}${r.then?` ${TS(r.then)}`:\"\"}`}function TS(r){return`${r.type} ${gI(r.line)}`}function Fg(r){return`${MS(r)}${r.then?` ${OS(r.then)}`:\"\"}`}function OS(r){return`${r.type} ${Fg(r.chain)}`}function MS(r){switch(r.type){case\"command\":return`${r.envs.length>0?`${r.envs.map(e=>cI(e)).join(\" \")} `:\"\"}${r.args.map(e=>US(e)).join(\" \")}`;case\"subshell\":return`(${Rg(r.subshell)})${r.args.length>0?` ${r.args.map(e=>zp(e)).join(\" \")}`:\"\"}`;case\"group\":return`{ ${Rg(r.group,{endSemicolon:!0})} }${r.args.length>0?` ${r.args.map(e=>zp(e)).join(\" \")}`:\"\"}`;case\"envs\":return r.envs.map(e=>cI(e)).join(\" \");default:throw new Error(`Unsupported command type:  \"${r.type}\"`)}}function cI(r){return`${r.name}=${r.args[0]?_l(r.args[0]):\"\"}`}function US(r){switch(r.type){case\"redirection\":return zp(r);case\"argument\":return _l(r);default:throw new Error(`Unsupported argument type: \"${r.type}\"`)}}function zp(r){return`${r.subtype} ${r.args.map(e=>_l(e)).join(\" \")}`}function _l(r){return r.segments.map(e=>KS(e)).join(\"\")}function KS(r){let e=(i,n)=>n?`\"${i}\"`:i,t=i=>i===\"\"?'\"\"':i.match(/[(){}<>$|&; \\t\"']/)?`$'${i.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\f/g,\"\\\\f\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/\\t/g,\"\\\\t\").replace(/\\v/g,\"\\\\v\").replace(/\\0/g,\"\\\\0\")}'`:i;switch(r.type){case\"text\":return t(r.text);case\"glob\":return r.pattern;case\"shell\":return e(`\\${${Rg(r.shell)}}`,r.quoted);case\"variable\":return e(typeof r.defaultValue>\"u\"?typeof r.alternativeValue>\"u\"?`\\${${r.name}}`:r.alternativeValue.length===0?`\\${${r.name}:+}`:`\\${${r.name}:+${r.alternativeValue.map(i=>_l(i)).join(\" \")}}`:r.defaultValue.length===0?`\\${${r.name}:-}`:`\\${${r.name}:-${r.defaultValue.map(i=>_l(i)).join(\" \")}}`,r.quoted);case\"arithmetic\":return`$(( ${fI(r.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: \"${r.type}\"`)}}function fI(r){let e=n=>{switch(n){case\"addition\":return\"+\";case\"subtraction\":return\"-\";case\"multiplication\":return\"*\";case\"division\":return\"/\";default:throw new Error(`Can't extract operator from arithmetic expression of type \"${n}\"`)}},t=(n,s)=>s?`( ${n} )`:n,i=n=>t(fI(n),![\"number\",\"variable\"].includes(n.type));switch(r.type){case\"number\":return String(r.value);case\"variable\":return r.name;default:return`${i(r.left)} ${e(r.type)} ${i(r.right)}`}}var pK=Pe(hK());function hI(r){let e=r.match(/^\\*{1,2}\\/(.*)/);if(e)throw new Error(`The override for '${r}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,pK.parse)(r)}catch(t){throw t.location&&(t.message=t.message.replace(/(\\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function pI(r){let e=\"\";return r.from&&(e+=r.from.fullName,r.from.description&&(e+=`@${r.from.description}`),e+=\"/\"),e+=r.descriptor.fullName,r.descriptor.description&&(e+=`@${r.descriptor.description}`),e}var vI=Pe(sH()),cH=Pe(aH()),ode=/^(?![-?:,\\][{}#&*!|>'\"%@` \\t\\r\\n]).([ \\t]*(?![,\\][{}:# \\t\\r\\n]).)*$/,AH=[\"__metadata\",\"version\",\"resolution\",\"dependencies\",\"peerDependencies\",\"dependenciesMeta\",\"peerDependenciesMeta\",\"binaries\"],SI=class{constructor(e){this.data=e}};function lH(r){return r.match(ode)?r:JSON.stringify(r)}function uH(r){return typeof r>\"u\"?!0:typeof r==\"object\"&&r!==null?Object.keys(r).every(e=>uH(r[e])):!1}function $S(r,e,t){if(r===null)return`null\n`;if(typeof r==\"number\"||typeof r==\"boolean\")return`${r.toString()}\n`;if(typeof r==\"string\")return`${lH(r)}\n`;if(Array.isArray(r)){if(r.length===0)return`[]\n`;let i=\"  \".repeat(e);return`\n${r.map(s=>`${i}- ${$S(s,e+1,!1)}`).join(\"\")}`}if(typeof r==\"object\"&&r){let i,n;r instanceof SI?(i=r.data,n=!1):(i=r,n=!0);let s=\"  \".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=AH.indexOf(l),g=AH.indexOf(c);return u===-1&&g===-1?l<c?-1:l>c?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!uH(i[l])).map((l,c)=>{let u=i[l],g=lH(l),f=$S(u,e+1,!0),h=c>0||t?s:\"\",p=g.length>1024?`? ${g}\n${h}:`:`${g}:`,C=f.startsWith(`\n`)?f:` ${f}`;return`${h}${p}${C}`}).join(e===0?`\n`:\"\")||`\n`;return t?`\n${a}`:`${a}`}throw new Error(`Unsupported value type (${r})`)}function Ba(r){try{let e=$S(r,0,!1);return e!==`\n`?e:\"\"}catch(e){throw e.location&&(e.message=e.message.replace(/(\\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Ba.PreserveOrdering=SI;function ade(r){return r.endsWith(`\n`)||(r+=`\n`),(0,cH.parse)(r)}var Ade=/^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;function lde(r){if(Ade.test(r))return ade(r);let e=(0,vI.safeLoad)(r,{schema:vI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!=\"object\")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error(\"Expected an indexed object, got an array instead. Does your file follow Yaml's rules?\");return e}function yi(r){return lde(r)}var dz=Pe(fH()),Uw=Pe(Ac());var ud={};ut(ud,{Builtins:()=>hv,Cli:()=>Hn,Command:()=>ve,Option:()=>z,UsageError:()=>be,formatMarkdownish:()=>Li});var tv=\"\u0001\",wi=\"\\0\";var rv=/^(-h|--help)(?:=([0-9]+))?$/,xI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,CH=/^-[a-zA-Z]{2,}$/,iv=/^([^=]+)=([\\s\\S]*)$/,nv=process.env.DEBUG_CLI===\"1\";var be=class extends Error{constructor(e){super(e),this.clipanion={type:\"usage\"},this.name=\"UsageError\"}},Hg=class extends Error{constructor(e,t){if(super(),this.input=e,this.candidates=t,this.clipanion={type:\"none\"},this.name=\"UnknownSyntaxError\",this.candidates.length===0)this.message=\"Command not found, but we're not sure what's the alternative.\";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i}\n\n${this.candidates.map(({usage:n})=>`$ ${n}`).join(`\n`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean:\n\n$ ${i}\n${sv(e)}`}else this.message=`Command not found; did you mean one of:\n\n${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(`\n`)}\n\n${sv(e)}`}},PI=class extends Error{constructor(e,t){super(),this.input=e,this.usages=t,this.clipanion={type:\"none\"},this.name=\"AmbiguousSyntaxError\",this.message=`Cannot find which to pick amongst the following alternatives:\n\n${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(`\n`)}\n\n${sv(e)}`}},sv=r=>`While running ${r.filter(e=>e!==wi).map(e=>{let t=JSON.stringify(e);return e.match(/\\s/)||e.length===0||t!==`\"${e}\"`?t:e}).join(\" \")}`;var rd=Symbol(\"clipanion/isOption\");function Vi(r){return{...r,[rd]:!0}}function Po(r,e){return typeof r>\"u\"?[r,e]:typeof r==\"object\"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function DI(r,e=!1){let t=r.replace(/^\\.: /,\"\");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function id(r,e){return e.length===1?new be(`${r}: ${DI(e[0],!0)}`):new be(`${r}:\n${e.map(t=>`\n- ${DI(t)}`).join(\"\")}`)}function nd(r,e,t){if(typeof t>\"u\")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw id(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}var ve=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(ls(),fn)),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw id(\"Invalid option schema\",l);for(let[,g]of c)g()}else if(t!=null)throw new Error(\"Invalid command schema\");let i=await this.execute();return typeof i<\"u\"?i:0}};ve.isOption=rd;ve.Default=[];var Av=Array(80).fill(\"\\u2501\");for(let r=0;r<=24;++r)Av[Av.length-r]=`\\x1B[38;5;${232+r}m\\u2501`;var lv={header:r=>`\\x1B[1m\\u2501\\u2501\\u2501 ${r}${r.length<80-5?` ${Av.slice(r.length+5).join(\"\")}`:\":\"}\\x1B[0m`,bold:r=>`\\x1B[1m${r}\\x1B[22m`,error:r=>`\\x1B[31m\\x1B[1m${r}\\x1B[22m\\x1B[39m`,code:r=>`\\x1B[36m${r}\\x1B[39m`},vH={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function Jde(r){let e=r.split(`\n`),t=e.filter(n=>n.match(/\\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(`\n`)}function Li(r,{format:e,paragraphs:t}){return r=r.replace(/\\r\\n?/g,`\n`),r=Jde(r),r=r.replace(/^\\n+|\\n+$/g,\"\"),r=r.replace(/^(\\s*)-([^\\n]*?)\\n+/gm,`$1-$2\n\n`),r=r.replace(/\\n(\\n)?\\n*/g,\"$1\"),t&&(r=r.split(/\\n/).map(i=>{let n=i.match(/^\\s*[*-][\\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(`\n`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,\"g\")).map((o,a)=>\" \".repeat(s)+(a===0?\"- \":\"  \")+o).join(`\n`)}).join(`\n\n`)),r=r.replace(/(`+)((?:.|[\\n])*?)\\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\\*\\*)((?:.|[\\n])*?)\\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r}\n`:\"\"}var fv=Pe(J(\"tty\"),1);function hn(r){nv&&console.log(r)}var xH={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:-1};function PH(){return{nodes:[Zi(),Zi(),Zi()]}}function Wde(r){let e=PH(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s<n.nodes.length;++s)RH(s)||e.nodes.push(rCe(n.nodes[s],i));i+=n.nodes.length-2}for(let n of t)Gg(e,0,n);return e}function Xs(r,e){return r.nodes.push(e),r.nodes.length-1}function zde(r){let e=new Set,t=i=>{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(0)}function Vde(r,{prefix:e=\"\"}={}){if(nv){hn(`${e}Nodes are:`);for(let t=0;t<r.nodes.length;++t)hn(`${e}  ${t}: ${JSON.stringify(r.nodes[t])}`)}}function DH(r,e,t=!1){hn(`Running a vm on ${JSON.stringify(e)}`);let i=[{node:0,state:{candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,options:[],path:[],positionals:[],remainder:null,selectedIndex:null}}];Vde(r,{prefix:\"  \"});let n=[tv,...e];for(let s=0;s<n.length;++s){let o=n[s];hn(`  Processing ${JSON.stringify(o)}`);let a=[];for(let{node:l,state:c}of i){hn(`    Current node is ${l}`);let u=r.nodes[l];if(l===2){a.push({node:l,state:c});continue}console.assert(u.shortcuts.length===0,\"Shortcuts should have been eliminated by now\");let g=Object.prototype.hasOwnProperty.call(u.statics,o);if(!t||s<n.length-1||g)if(g){let f=u.statics[o];for(let{to:h,reducer:p}of f)a.push({node:h,state:typeof p<\"u\"?RI(uv,p,c,o):c}),hn(`      Static transition to ${h} found`)}else hn(\"      No static transition found\");else{let f=!1;for(let h of Object.keys(u.statics))if(!!h.startsWith(o)){if(o===h)for(let{to:p,reducer:C}of u.statics[h])a.push({node:p,state:typeof C<\"u\"?RI(uv,C,c,o):c}),hn(`      Static transition to ${p} found`);else for(let{to:p}of u.statics[h])a.push({node:p,state:{...c,remainder:h.slice(o.length)}}),hn(`      Static transition to ${p} found (partial match)`);f=!0}f||hn(\"      No partial static transition found\")}if(o!==wi)for(let[f,{to:h,reducer:p}]of u.dynamics)RI(NI,f,c,o)&&(a.push({node:h,state:typeof p<\"u\"?RI(uv,p,c,o):c}),hn(`      Dynamic transition to ${h} found (via ${f})`))}if(a.length===0&&o===wi&&e.length===1)return[{node:0,state:xH}];if(a.length===0)throw new Hg(e,i.filter(({node:l})=>l!==2).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===2))throw new Hg(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=$de(a)}if(i.length>0){hn(\"  Results:\");for(let s of i)hn(`    - ${s.node} -> ${JSON.stringify(s.state)}`)}else hn(\"  No results\");return i}function Xde(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,wi)){for(let{to:t}of r.statics[wi])if(t===1)return!0}return!1}function Zde(r,e,t){let i=t&&e.length>0?[\"\"]:[],n=DH(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let C=r.nodes[p],y=Object.keys(C.statics);for(let B of Object.keys(C.statics)){let v=y[0];for(let{to:D,reducer:L}of C.statics[v])L===\"pushPath\"&&(u||l.push(v),g.push(D))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=Xde(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==wi||!f.startsWith(\"-\")&&h.some(({reducer:p})=>p===\"pushPath\"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===2)continue;let p=iCe(f,c);if(p!==null)for(let C of p)a([...i,C],l)}}return[...s].sort()}function _de(r,e){let t=DH(r,[...e,wi]);return eCe(e,t.map(({state:i})=>i))}function $de(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function eCe(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Hg(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=tCe(c);if(u.length>1)throw new PI(r,u.map(g=>g.candidateUsage));return u[0]}function tCe(r){let e=[],t=[];for(let i of r)i.selectedIndex===-1?t.push(i):e.push(i);return t.length>0&&e.push({...xH,path:kH(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])}),e}function kH(r,e,...t){return e===void 0?Array.from(r):kH(r.filter((i,n)=>i===e[n]),...t)}function Zi(){return{dynamics:[],shortcuts:[],statics:{}}}function RH(r){return r===1||r===2}function cv(r,e=0){return{to:RH(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function rCe(r,e=0){let t=Zi();for(let[i,n]of r.dynamics)t.dynamics.push([i,cv(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(cv(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>cv(s,e));return t}function Bi(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function Gg(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function Qa(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function RI(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function iCe(r,e){let t=Array.isArray(r)?NI[r[0]]:NI[r];if(typeof t.suggest>\"u\")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var NI={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!==\"-\"&&e.startsWith(\"-\"),isNotOptionLike:(r,e)=>r.ignoreOptions||e===\"-\"||!e.startsWith(\"-\"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&&CH.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(iv);return!r.ignoreOptions&&!!n&&xI.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&&rv.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith(\"-\")&&xI.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith(\"-\")&&!xI.test(e)};NI.isOption.suggest=(r,e,t=!0)=>t?null:[e];var uv={setCandidateState:(r,e,t)=>({...r,...t}),setSelectedIndex:(r,e,t)=>({...r,selectedIndex:t}),pushBatch:(r,e)=>({...r,options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(iv);return{...r,options:r.options.concat({name:t,value:i})}},pushPath:(r,e)=>({...r,path:r.path.concat(e)}),pushPositional:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:Kn})}),pushTrue:(r,e,t=e)=>({...r,options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>({...r,options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>({...r,options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i={...r,options:[...r.options]},n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t={...r,options:[...r.options]},i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>({...r,ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(rv);return typeof i<\"u\"?{...r,options:[{name:\"-c\",value:String(t)},{name:\"-i\",value:i}]}:{...r,options:[{name:\"-c\",value:String(t)}]}},setError:(r,e,t)=>e===wi?{...r,errorMessage:`${t}.`}:{...r,errorMessage:`${t} (\"${e}\").`},setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return{...r,errorMessage:`Not enough arguments to option ${t.name}.`}}},Kn=Symbol(),gv=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e=\"arg\",required:t=!0}={}){if(!t&&this.arity.extra===Kn)throw new Error(\"Optional parameters cannot be declared when using .rest() or .proxy()\");if(!t&&this.arity.trailing.length>0)throw new Error(\"Optional parameters cannot be declared after the required trailing positional arguments\");!t&&this.arity.extra!==Kn?this.arity.extra.push(e):this.arity.extra!==Kn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e=\"arg\",required:t=0}={}){if(this.arity.extra===Kn)throw new Error(\"Infinite lists cannot be declared multiple times in the same command\");if(this.arity.trailing.length>0)throw new Error(\"Infinite lists cannot be declared after the required trailing positional arguments\");for(let i=0;i<t;++i)this.addPositional({name:e});this.arity.extra=Kn}addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}addOption({names:e,description:t,arity:i=0,hidden:n=!1,required:s=!1,allowBinding:o=!0}){if(!o&&i>1)throw new Error(\"The arity cannot be higher than 1 when the option only supports the --arg=value syntax\");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h<a;++h)g.push(` #${h}`);let f=`${o.join(\",\")}${g.join(\"\")}`;!t&&c?n.push({definition:f,description:c,required:u}):i.push(u?`<${f}>`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Kn?i.push(\"...\"):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(\" \"),options:n}}compile(){if(typeof this.context>\"u\")throw new Error(\"Assertion failed: No context attached\");let e=PH(),t=0,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=Xs(e,Zi()),Qa(e,0,tv,t,[\"setCandidateState\",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?\"always\":\"isNotOptionLike\",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=Xs(e,Zi());Gg(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f<a.length;++f){let h=Xs(e,Zi());Qa(e,l,a[f],h,\"pushPath\"),l=h}if(this.arity.leading.length>0||!this.arity.proxy){let f=Xs(e,Zi());Bi(e,l,\"isHelp\",f,[\"useHelp\",this.cliIndex]),Qa(e,f,wi,1,[\"setSelectedIndex\",-1]),this.registerOptions(e,l)}this.arity.leading.length>0&&Qa(e,l,wi,2,[\"setError\",\"Not enough positional arguments\"]);let c=l;for(let f=0;f<this.arity.leading.length;++f){let h=Xs(e,Zi());this.arity.proxy||this.registerOptions(e,h),(this.arity.trailing.length>0||f+1!==this.arity.leading.length)&&Qa(e,h,wi,2,[\"setError\",\"Not enough positional arguments\"]),Bi(e,c,\"isNotOptionLike\",h,\"pushPositional\"),c=h}let u=c;if(this.arity.extra===Kn||this.arity.extra.length>0){let f=Xs(e,Zi());if(Gg(e,c,f),this.arity.extra===Kn){let h=Xs(e,Zi());this.arity.proxy||this.registerOptions(e,h),Bi(e,c,s,h,\"pushExtraNoLimits\"),Bi(e,h,s,h,\"pushExtraNoLimits\"),Gg(e,h,f)}else for(let h=0;h<this.arity.extra.length;++h){let p=Xs(e,Zi());this.arity.proxy||this.registerOptions(e,p),Bi(e,u,s,p,\"pushExtra\"),Gg(e,p,f),u=p}u=f}this.arity.trailing.length>0&&Qa(e,u,wi,2,[\"setError\",\"Not enough positional arguments\"]);let g=u;for(let f=0;f<this.arity.trailing.length;++f){let h=Xs(e,Zi());this.arity.proxy||this.registerOptions(e,h),f+1<this.arity.trailing.length&&Qa(e,h,wi,2,[\"setError\",\"Not enough positional arguments\"]),Bi(e,g,\"isNotOptionLike\",h,\"pushPositional\"),g=h}Bi(e,g,s,2,[\"setError\",\"Extraneous positional argument\"]),Qa(e,g,wi,1,[\"setSelectedIndex\",this.cliIndex])}return{machine:e,context:this.context}}registerOptions(e,t){Bi(e,t,[\"isOption\",\"--\"],t,\"inhibateOptions\"),Bi(e,t,[\"isBatchOption\",this.allOptionNames],t,\"pushBatch\"),Bi(e,t,[\"isBoundOption\",this.allOptionNames,this.options],t,\"pushBound\"),Bi(e,t,[\"isUnsupportedOption\",this.allOptionNames],2,[\"setError\",\"Unsupported option name\"]),Bi(e,t,[\"isInvalidOption\"],2,[\"setError\",\"Invalid option name\"]);for(let i of this.options){let n=i.names.reduce((s,o)=>o.length>s.length?o:s,\"\");if(i.arity===0)for(let s of i.names)Bi(e,t,[\"isOption\",s,i.hidden||s!==n],t,\"pushTrue\"),s.startsWith(\"--\")&&!s.startsWith(\"--no-\")&&Bi(e,t,[\"isNegatedOption\",s],t,[\"pushFalse\",s]);else{let s=Xs(e,Zi());for(let o of i.names)Bi(e,t,[\"isOption\",o,i.hidden||o!==n],s,\"pushUndefined\");for(let o=0;o<i.arity;++o){let a=Xs(e,Zi());Qa(e,s,wi,2,\"setOptionArityError\"),Bi(e,s,\"isOptionLike\",2,\"setOptionArityError\");let l=i.arity===1?\"setStringValue\":\"pushStringValue\";Bi(e,s,\"isNotOptionLike\",a,l),s=a}Gg(e,s,t)}}}},jg=class{constructor({binaryName:e=\"...\"}={}){this.builders=[],this.opts={binaryName:e}}static build(e,t={}){return new jg(t).commands(e).compile()}getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(`Assertion failed: Out-of-bound command index (${e})`);return this.builders[e]}commands(e){for(let t of e)t(this.command());return this}command(){let e=new gv(this.builders.length,this.opts);return this.builders.push(e),e}compile(){let e=[],t=[];for(let n of this.builders){let{machine:s,context:o}=n.compile();e.push(s),t.push(o)}let i=Wde(e);return zde(i),{machine:i,contexts:t,process:n=>_de(i,n),suggest:(n,s)=>Zde(i,n,s)}}};var qg=class extends ve{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,t){let i=new qg(t);i.path=e.path;for(let n of e.options)switch(n.name){case\"-c\":i.commands.push(Number(n.value));break;case\"-i\":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index<\"u\"&&this.index>=0&&this.index<e.length&&(e=[e[this.index]]),e.length===0)this.context.stdout.write(this.cli.usage());else if(e.length===1)this.context.stdout.write(this.cli.usage(this.contexts[e[0]].commandClass,{detailed:!0}));else if(e.length>1){this.context.stdout.write(`Multiple commands match your selection:\n`),this.context.stdout.write(`\n`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(`\n`),this.context.stdout.write(`Run again with -h=<index> to see the longer details of any of those commands.\n`)}}};var FH=Symbol(\"clipanion/errorCommand\");function nCe(){return process.env.FORCE_COLOR===\"0\"?1:process.env.FORCE_COLOR===\"1\"||typeof process.stdout<\"u\"&&process.stdout.isTTY?8:1}var Hn=class{constructor({binaryLabel:e,binaryName:t=\"...\",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new jg({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new Hn(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c==\"object\"&&c!==null&&c[ve.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a<\"u\")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case-1:return qg.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o>\"u\")throw new Error(\"Assertion failed: Expected the command class to have been registered.\");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[FH]=a,l}}break}}async run(e,t){var i;let n,s={...Hn.defaultContext,...t},o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,{...s,...u}),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?sCe(s):LH,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage>\"u\")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category<\"u\"?Li(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description<\"u\"?Li(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details<\"u\"?Li(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples<\"u\"?i.usage.examples.map(([f,h])=>[Li(f,{format:this.format(e),paragraphs:!1}),h.replace(/\\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n=\"$ \"}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage<\"u\";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof ve?e.constructor:e,a=\"\";if(o)if(i){let{description:l=\"\",details:c=\"\",examples:u=[]}=o.usage||{};l!==\"\"&&(a+=Li(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=`\n`),(c!==\"\"||u.length>0)&&(a+=`${this.format(t).header(\"Usage\")}\n`,a+=`\n`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g}\n`,f.length>0){a+=`\n`,a+=`${lv.header(\"Options\")}\n`;let h=f.reduce((p,C)=>Math.max(p,C.definition.length),0);a+=`\n`;for(let{definition:p,description:C}of f)a+=`  ${this.format(t).bold(p.padEnd(h))}    ${Li(C,{format:this.format(t),paragraphs:!1})}`}if(c!==\"\"&&(a+=`\n`,a+=`${this.format(t).header(\"Details\")}\n`,a+=`\n`,a+=Li(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=`\n`,a+=`${this.format(t).header(\"Examples\")}\n`;for(let[h,p]of u)a+=`\n`,a+=Li(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,`  ${this.format(t).bold(n)}`).replace(/\\$0/g,this.binaryName)}\n`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l}\n`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage>\"u\")continue;let p=typeof f.usage.category<\"u\"?Li(f.usage.category,{format:this.format(t),paragraphs:!1}):null,C=l.get(p);typeof C>\"u\"&&l.set(p,C=[]);let{usage:y}=this.getUsageByIndex(h);C.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),u=typeof this.binaryLabel<\"u\",g=typeof this.binaryVersion<\"u\";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)}\n\n`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)}\n`:a+=`${this.format(t).header(`${this.binaryVersion}`)}\n`,a+=`  ${this.format(t).bold(n)}${this.binaryName} <command>\n`):a+=`${this.format(t).bold(n)}${this.binaryName} <command>\n`;for(let f of c){let h=l.get(f).slice().sort((C,y)=>C.usage.localeCompare(y.usage,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),p=f!==null?f.trim():\"General commands\";a+=`\n`,a+=`${this.format(t).header(`${p}`)}\n`;for(let{commandClass:C,usage:y}of h){let B=C.usage.description||\"undocumented\";a+=`\n`,a+=`  ${this.format(t).bold(y)}\n`,a+=`    ${Li(B,{format:this.format(t),paragraphs:!1})}`}}a+=`\n`,a+=Li(\"You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.\",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[FH])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o=\"\",a=e.name.replace(/([a-z])([A-Z])/g,\"$1 $2\");a===\"Error\"&&(a=\"Internal Error\"),o+=`${this.format(n).error(a)}: ${e.message}\n`;let l=e.clipanion;return typeof l<\"u\"?l.type===\"usage\"&&(o+=`\n`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\\n/,\"\")}\n`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:Hn.defaultContext.colorDepth>1)?lv:vH}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i>\"u\")throw new Error(\"Assertion failed: Unregistered command\");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};Hn.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:\"getColorDepth\"in fv.default.WriteStream.prototype?fv.default.WriteStream.prototype.getColorDepth():nCe()};var NH;function sCe(r){let e=NH;if(typeof e>\"u\"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return LH;let{AsyncLocalStorage:t}=J(\"async_hooks\");e=NH=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l>\"u\"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l>\"u\"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function LH(r){return r()}var hv={};ut(hv,{DefinitionsCommand:()=>Ad,HelpCommand:()=>ld,VersionCommand:()=>cd});var Ad=class extends ve{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)}\n`)}};Ad.paths=[[\"--clipanion=definitions\"]];var ld=class extends ve{async execute(){this.context.stdout.write(this.cli.usage())}};ld.paths=[[\"-h\"],[\"--help\"]];var cd=class extends ve{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:\"<unknown>\"}\n`)}};cd.paths=[[\"-v\"],[\"--version\"]];var z={};ut(z,{Array:()=>TH,Boolean:()=>OH,Counter:()=>MH,Proxy:()=>UH,Rest:()=>KH,String:()=>HH,applyValidator:()=>nd,cleanValidationError:()=>DI,formatError:()=>id,isOptionSymbol:()=>rd,makeCommandOption:()=>Vi,rerouteArguments:()=>Po});function TH(r,e,t){let[i,n]=Po(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(\",\"),a=new Set(o);return Vi({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i<\"u\"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function OH(r,e,t){let[i,n]=Po(e,t!=null?t:{}),s=r.split(\",\"),o=new Set(s);return Vi({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function MH(r,e,t){let[i,n]=Po(e,t!=null?t:{}),s=r.split(\",\"),o=new Set(s);return Vi({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function UH(r={}){return Vi({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}function KH(r={}){return Vi({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Kn||a.extra===!1&&o<e.arity.leading.length},s=0;for(;s<i.positionals.length&&n(s);)s+=1;return i.positionals.splice(0,s).map(({value:o})=>o)}})}function oCe(r,e,t){let[i,n]=Po(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(\",\"),a=new Set(o);return Vi({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f==\"string\"?nd(g!=null?g:c,f,n.validator):f}})}function aCe(r={}){let{required:e=!0}=r;return Vi({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;o<n.positionals.length;++o){if(n.positionals[o].extra===Kn||e&&n.positionals[o].extra===!0||!e&&n.positionals[o].extra===!1)continue;let[a]=n.positionals.splice(o,1);return nd((s=r.name)!==null&&s!==void 0?s:i,a.value,r.validator)}}})}function HH(r,...e){return typeof r==\"string\"?oCe(r,...e):aCe(r)}var Cz=Pe(Jg()),nk=J(\"stream\");var Ct=(se=>(se[se.UNNAMED=0]=\"UNNAMED\",se[se.EXCEPTION=1]=\"EXCEPTION\",se[se.MISSING_PEER_DEPENDENCY=2]=\"MISSING_PEER_DEPENDENCY\",se[se.CYCLIC_DEPENDENCIES=3]=\"CYCLIC_DEPENDENCIES\",se[se.DISABLED_BUILD_SCRIPTS=4]=\"DISABLED_BUILD_SCRIPTS\",se[se.BUILD_DISABLED=5]=\"BUILD_DISABLED\",se[se.SOFT_LINK_BUILD=6]=\"SOFT_LINK_BUILD\",se[se.MUST_BUILD=7]=\"MUST_BUILD\",se[se.MUST_REBUILD=8]=\"MUST_REBUILD\",se[se.BUILD_FAILED=9]=\"BUILD_FAILED\",se[se.RESOLVER_NOT_FOUND=10]=\"RESOLVER_NOT_FOUND\",se[se.FETCHER_NOT_FOUND=11]=\"FETCHER_NOT_FOUND\",se[se.LINKER_NOT_FOUND=12]=\"LINKER_NOT_FOUND\",se[se.FETCH_NOT_CACHED=13]=\"FETCH_NOT_CACHED\",se[se.YARN_IMPORT_FAILED=14]=\"YARN_IMPORT_FAILED\",se[se.REMOTE_INVALID=15]=\"REMOTE_INVALID\",se[se.REMOTE_NOT_FOUND=16]=\"REMOTE_NOT_FOUND\",se[se.RESOLUTION_PACK=17]=\"RESOLUTION_PACK\",se[se.CACHE_CHECKSUM_MISMATCH=18]=\"CACHE_CHECKSUM_MISMATCH\",se[se.UNUSED_CACHE_ENTRY=19]=\"UNUSED_CACHE_ENTRY\",se[se.MISSING_LOCKFILE_ENTRY=20]=\"MISSING_LOCKFILE_ENTRY\",se[se.WORKSPACE_NOT_FOUND=21]=\"WORKSPACE_NOT_FOUND\",se[se.TOO_MANY_MATCHING_WORKSPACES=22]=\"TOO_MANY_MATCHING_WORKSPACES\",se[se.CONSTRAINTS_MISSING_DEPENDENCY=23]=\"CONSTRAINTS_MISSING_DEPENDENCY\",se[se.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]=\"CONSTRAINTS_INCOMPATIBLE_DEPENDENCY\",se[se.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]=\"CONSTRAINTS_EXTRANEOUS_DEPENDENCY\",se[se.CONSTRAINTS_INVALID_DEPENDENCY=26]=\"CONSTRAINTS_INVALID_DEPENDENCY\",se[se.CANT_SUGGEST_RESOLUTIONS=27]=\"CANT_SUGGEST_RESOLUTIONS\",se[se.FROZEN_LOCKFILE_EXCEPTION=28]=\"FROZEN_LOCKFILE_EXCEPTION\",se[se.CROSS_DRIVE_VIRTUAL_LOCAL=29]=\"CROSS_DRIVE_VIRTUAL_LOCAL\",se[se.FETCH_FAILED=30]=\"FETCH_FAILED\",se[se.DANGEROUS_NODE_MODULES=31]=\"DANGEROUS_NODE_MODULES\",se[se.NODE_GYP_INJECTED=32]=\"NODE_GYP_INJECTED\",se[se.AUTHENTICATION_NOT_FOUND=33]=\"AUTHENTICATION_NOT_FOUND\",se[se.INVALID_CONFIGURATION_KEY=34]=\"INVALID_CONFIGURATION_KEY\",se[se.NETWORK_ERROR=35]=\"NETWORK_ERROR\",se[se.LIFECYCLE_SCRIPT=36]=\"LIFECYCLE_SCRIPT\",se[se.CONSTRAINTS_MISSING_FIELD=37]=\"CONSTRAINTS_MISSING_FIELD\",se[se.CONSTRAINTS_INCOMPATIBLE_FIELD=38]=\"CONSTRAINTS_INCOMPATIBLE_FIELD\",se[se.CONSTRAINTS_EXTRANEOUS_FIELD=39]=\"CONSTRAINTS_EXTRANEOUS_FIELD\",se[se.CONSTRAINTS_INVALID_FIELD=40]=\"CONSTRAINTS_INVALID_FIELD\",se[se.AUTHENTICATION_INVALID=41]=\"AUTHENTICATION_INVALID\",se[se.PROLOG_UNKNOWN_ERROR=42]=\"PROLOG_UNKNOWN_ERROR\",se[se.PROLOG_SYNTAX_ERROR=43]=\"PROLOG_SYNTAX_ERROR\",se[se.PROLOG_EXISTENCE_ERROR=44]=\"PROLOG_EXISTENCE_ERROR\",se[se.STACK_OVERFLOW_RESOLUTION=45]=\"STACK_OVERFLOW_RESOLUTION\",se[se.AUTOMERGE_FAILED_TO_PARSE=46]=\"AUTOMERGE_FAILED_TO_PARSE\",se[se.AUTOMERGE_IMMUTABLE=47]=\"AUTOMERGE_IMMUTABLE\",se[se.AUTOMERGE_SUCCESS=48]=\"AUTOMERGE_SUCCESS\",se[se.AUTOMERGE_REQUIRED=49]=\"AUTOMERGE_REQUIRED\",se[se.DEPRECATED_CLI_SETTINGS=50]=\"DEPRECATED_CLI_SETTINGS\",se[se.PLUGIN_NAME_NOT_FOUND=51]=\"PLUGIN_NAME_NOT_FOUND\",se[se.INVALID_PLUGIN_REFERENCE=52]=\"INVALID_PLUGIN_REFERENCE\",se[se.CONSTRAINTS_AMBIGUITY=53]=\"CONSTRAINTS_AMBIGUITY\",se[se.CACHE_OUTSIDE_PROJECT=54]=\"CACHE_OUTSIDE_PROJECT\",se[se.IMMUTABLE_INSTALL=55]=\"IMMUTABLE_INSTALL\",se[se.IMMUTABLE_CACHE=56]=\"IMMUTABLE_CACHE\",se[se.INVALID_MANIFEST=57]=\"INVALID_MANIFEST\",se[se.PACKAGE_PREPARATION_FAILED=58]=\"PACKAGE_PREPARATION_FAILED\",se[se.INVALID_RANGE_PEER_DEPENDENCY=59]=\"INVALID_RANGE_PEER_DEPENDENCY\",se[se.INCOMPATIBLE_PEER_DEPENDENCY=60]=\"INCOMPATIBLE_PEER_DEPENDENCY\",se[se.DEPRECATED_PACKAGE=61]=\"DEPRECATED_PACKAGE\",se[se.INCOMPATIBLE_OS=62]=\"INCOMPATIBLE_OS\",se[se.INCOMPATIBLE_CPU=63]=\"INCOMPATIBLE_CPU\",se[se.FROZEN_ARTIFACT_EXCEPTION=64]=\"FROZEN_ARTIFACT_EXCEPTION\",se[se.TELEMETRY_NOTICE=65]=\"TELEMETRY_NOTICE\",se[se.PATCH_HUNK_FAILED=66]=\"PATCH_HUNK_FAILED\",se[se.INVALID_CONFIGURATION_VALUE=67]=\"INVALID_CONFIGURATION_VALUE\",se[se.UNUSED_PACKAGE_EXTENSION=68]=\"UNUSED_PACKAGE_EXTENSION\",se[se.REDUNDANT_PACKAGE_EXTENSION=69]=\"REDUNDANT_PACKAGE_EXTENSION\",se[se.AUTO_NM_SUCCESS=70]=\"AUTO_NM_SUCCESS\",se[se.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]=\"NM_CANT_INSTALL_EXTERNAL_SOFT_LINK\",se[se.NM_PRESERVE_SYMLINKS_REQUIRED=72]=\"NM_PRESERVE_SYMLINKS_REQUIRED\",se[se.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]=\"UPDATE_LOCKFILE_ONLY_SKIP_LINK\",se[se.NM_HARDLINKS_MODE_DOWNGRADED=74]=\"NM_HARDLINKS_MODE_DOWNGRADED\",se[se.PROLOG_INSTANTIATION_ERROR=75]=\"PROLOG_INSTANTIATION_ERROR\",se[se.INCOMPATIBLE_ARCHITECTURE=76]=\"INCOMPATIBLE_ARCHITECTURE\",se[se.GHOST_ARCHITECTURE=77]=\"GHOST_ARCHITECTURE\",se[se.PROLOG_LIMIT_EXCEEDED=79]=\"PROLOG_LIMIT_EXCEEDED\",se))(Ct||{});function FA(r){return`YN${r.toString(10).padStart(4,\"0\")}`}function TI(r){let e=Number(r.slice(2));if(typeof Ct[e]>\"u\")throw new Error(`Unknown message name: \"${r}\"`);return e}var P={};ut(P,{areDescriptorsEqual:()=>QW,areIdentsEqual:()=>sC,areLocatorsEqual:()=>oC,areVirtualPackagesEquivalent:()=>RSe,bindDescriptor:()=>DSe,bindLocator:()=>kSe,convertDescriptorToLocator:()=>Sw,convertLocatorToDescriptor:()=>HD,convertPackageToLocator:()=>PSe,convertToIdent:()=>xSe,convertToManifestRange:()=>LSe,copyPackage:()=>rC,devirtualizeDescriptor:()=>iC,devirtualizeLocator:()=>nC,getIdentVendorPath:()=>qD,isPackageCompatible:()=>kw,isVirtualDescriptor:()=>JA,isVirtualLocator:()=>jo,makeDescriptor:()=>_t,makeIdent:()=>qo,makeLocator:()=>rn,makeRange:()=>xw,parseDescriptor:()=>WA,parseFileStyleRange:()=>FSe,parseIdent:()=>en,parseLocator:()=>Dc,parseRange:()=>vf,prettyDependent:()=>nP,prettyDescriptor:()=>tr,prettyIdent:()=>Ai,prettyLocator:()=>mt,prettyLocatorNoColors:()=>jD,prettyRange:()=>Dw,prettyReference:()=>AC,prettyResolution:()=>iP,prettyWorkspace:()=>lC,renamePackage:()=>tC,slugifyIdent:()=>KD,slugifyLocator:()=>xf,sortDescriptors:()=>Pf,stringifyDescriptor:()=>bn,stringifyIdent:()=>Ot,stringifyLocator:()=>Es,tryParseDescriptor:()=>aC,tryParseIdent:()=>bW,tryParseLocator:()=>vw,virtualizeDescriptor:()=>GD,virtualizePackage:()=>YD});var Sf=Pe(J(\"querystring\")),yW=Pe(Xr()),wW=Pe(dJ());var ee={};ut(ee,{LogLevel:()=>Xy,Style:()=>_x,Type:()=>Ke,addLogFilterSupport:()=>Xd,applyColor:()=>Qn,applyHyperlink:()=>If,applyStyle:()=>Vy,json:()=>Bc,jsonOrPretty:()=>c0e,mark:()=>rP,pretty:()=>$e,prettyField:()=>Ho,prettyList:()=>tP,supportsColor:()=>zy,supportsHyperlinks:()=>eP,tuple:()=>no});var Vd=Pe(wx()),zd=Pe(Ac());var f8=Pe(wn()),h8=Pe(r8());var Ie={};ut(Ie,{AsyncActions:()=>Gx,BufferStream:()=>Hx,CachingStrategy:()=>u8,DefaultStream:()=>Yx,allSettledSafe:()=>io,assertNever:()=>qx,bufferStream:()=>Cf,buildIgnorePattern:()=>o0e,convertMapsToIndexableObjects:()=>Jy,dynamicRequire:()=>mf,escapeRegExp:()=>e0e,getArrayWithDefault:()=>hf,getFactoryWithDefault:()=>Na,getMapWithDefault:()=>pf,getSetWithDefault:()=>wc,isIndexableObject:()=>Kx,isPathLike:()=>a0e,isTaggedYarnVersion:()=>$Be,mapAndFilter:()=>Ko,mapAndFind:()=>Jd,overrideType:()=>t0e,parseBoolean:()=>Wd,parseOptionalBoolean:()=>g8,prettifyAsyncErrors:()=>df,prettifySyncErrors:()=>Jx,releaseAfterUseAsync:()=>i0e,replaceEnvVariables:()=>Wx,sortMap:()=>Bn,tryParseOptionalBoolean:()=>zx,validateEnum:()=>r0e});var n8=Pe(wn()),s8=Pe(Jg()),o8=Pe(Xr()),jx=J(\"stream\");function $Be(r){return!!(o8.default.valid(r)&&r.match(/^[^-]+(-rc\\.[0-9]+)?$/))}function e0e(r){return r.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function t0e(r){}function qx(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function r0e(r,e){let t=Object.values(r);if(!t.includes(e))throw new be(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(\", \")})`);return e}function Ko(r,e){let t=[];for(let i of r){let n=e(i);n!==a8&&t.push(n)}return t}var a8=Symbol();Ko.skip=a8;function Jd(r,e){for(let t of r){let i=e(t);if(i!==A8)return i}}var A8=Symbol();Jd.skip=A8;function Kx(r){return typeof r==\"object\"&&r!==null}async function io(r){let e=await Promise.allSettled(r),t=[];for(let i of e){if(i.status===\"rejected\")throw i.reason;t.push(i.value)}return t}function Jy(r){if(r instanceof Map&&(r=Object.fromEntries(r)),Kx(r))for(let e of Object.keys(r)){let t=r[e];Kx(t)&&(r[e]=Jy(t))}return r}function Na(r,e,t){let i=r.get(e);return typeof i>\"u\"&&r.set(e,i=t()),i}function hf(r,e){let t=r.get(e);return typeof t>\"u\"&&r.set(e,t=[]),t}function wc(r,e){let t=r.get(e);return typeof t>\"u\"&&r.set(e,t=new Set),t}function pf(r,e){let t=r.get(e);return typeof t>\"u\"&&r.set(e,t=new Map),t}async function i0e(r,e){if(e==null)return await r();try{return await r()}finally{await e()}}async function df(r,e){try{return await r()}catch(t){throw t.message=e(t.message),t}}function Jx(r,e){try{return r()}catch(t){throw t.message=e(t.message),t}}async function Cf(r){return await new Promise((e,t)=>{let i=[];r.on(\"error\",n=>{t(n)}),r.on(\"data\",n=>{i.push(n)}),r.on(\"end\",()=>{e(Buffer.concat(i))})})}var Hx=class extends jx.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(t,i,n){if(i!==\"buffer\"||!Buffer.isBuffer(t))throw new Error(\"Assertion failed: BufferStream only accept buffers\");this.chunks.push(t),n(null,null)}_flush(t){t(null,Buffer.concat(this.chunks))}};function n0e(){let r,e;return{promise:new Promise((i,n)=>{r=i,e=n}),resolve:r,reject:e}}var Gx=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,s8.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i>\"u\"&&this.deferred.set(e,i=n0e());let n=this.limit(()=>t());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,t){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>t(i))}async wait(){await Promise.all(this.promises.values())}},Yx=class extends jx.Transform{constructor(t=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=t}_transform(t,i,n){if(i!==\"buffer\"||!Buffer.isBuffer(t))throw new Error(\"Assertion failed: DefaultStream only accept buffers\");this.active=!1,n(null,t)}_flush(t){this.active&&this.ifEmpty.length>0?t(null,this.ifEmpty):t(null)}},qd=eval(\"require\");function l8(r){return qd(U.fromPortablePath(r))}function c8(path){let physicalPath=U.fromPortablePath(path),currentCacheEntry=qd.cache[physicalPath];delete qd.cache[physicalPath];let result;try{result=l8(physicalPath);let freshCacheEntry=qd.cache[physicalPath],dynamicModule=eval(\"module\"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{qd.cache[physicalPath]=currentCacheEntry}return result}var i8=new Map;function s0e(r){let e=i8.get(r),t=M.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=c8(r);return i8.set(r,{mtime:t.mtimeMs,instance:i}),i}var u8=(i=>(i[i.NoCache=0]=\"NoCache\",i[i.FsTime=1]=\"FsTime\",i[i.Node=2]=\"Node\",i))(u8||{});function mf(r,{cachingStrategy:e=2}={}){switch(e){case 0:return c8(r);case 1:return s0e(r);case 2:return l8(r);default:throw new Error(\"Unsupported caching strategy\")}}function Bn(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]<a[o]?-1:a[s]>a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function o0e(r){return r.length===0?null:r.map(e=>`(${n8.default.makeRe(e,{windows:!1,dot:!0}).source})`).join(\"|\")}function Wx(r,{env:e}){let t=/\\${(?<variableName>[\\d\\w_]+)(?<colon>:)?(?:-(?<fallback>[^}]*))?}/g;return r.replace(t,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new be(`Environment variable not found (${n})`)})}function Wd(r){switch(r){case\"true\":case\"1\":case 1:case!0:return!0;case\"false\":case\"0\":case 0:case!1:return!1;default:throw new Error(`Couldn't parse \"${r}\" as a boolean`)}}function g8(r){return typeof r>\"u\"?r:Wd(r)}function zx(r){try{return g8(r)}catch{return null}}function a0e(r){return!!(U.isAbsolute(r)||r.match(/^(\\.{1,2}|~)\\//))}var Ef=(t=>(t.HARD=\"HARD\",t.SOFT=\"SOFT\",t))(Ef||{}),Vx=(i=>(i.Dependency=\"Dependency\",i.PeerDependency=\"PeerDependency\",i.PeerDependencyMeta=\"PeerDependencyMeta\",i))(Vx||{}),Xx=(i=>(i.Inactive=\"inactive\",i.Redundant=\"redundant\",i.Active=\"active\",i))(Xx||{});var Ke={NO_HINT:\"NO_HINT\",NULL:\"NULL\",SCOPE:\"SCOPE\",NAME:\"NAME\",RANGE:\"RANGE\",REFERENCE:\"REFERENCE\",NUMBER:\"NUMBER\",PATH:\"PATH\",URL:\"URL\",ADDED:\"ADDED\",REMOVED:\"REMOVED\",CODE:\"CODE\",DURATION:\"DURATION\",SIZE:\"SIZE\",IDENT:\"IDENT\",DESCRIPTOR:\"DESCRIPTOR\",LOCATOR:\"LOCATOR\",RESOLUTION:\"RESOLUTION\",DEPENDENT:\"DEPENDENT\",PACKAGE_EXTENSION:\"PACKAGE_EXTENSION\",SETTING:\"SETTING\",MARKDOWN:\"MARKDOWN\"},_x=(e=>(e[e.BOLD=2]=\"BOLD\",e))(_x||{}),$x=zd.default.GITHUB_ACTIONS?{level:2}:Vd.default.supportsColor?{level:Vd.default.supportsColor.level}:{level:0},zy=$x.level!==0,eP=zy&&!zd.default.GITHUB_ACTIONS&&!zd.default.CIRCLE&&!zd.default.GITLAB,Zx=new Vd.default.Instance($x),A0e=new Map([[Ke.NO_HINT,null],[Ke.NULL,[\"#a853b5\",129]],[Ke.SCOPE,[\"#d75f00\",166]],[Ke.NAME,[\"#d7875f\",173]],[Ke.RANGE,[\"#00afaf\",37]],[Ke.REFERENCE,[\"#87afff\",111]],[Ke.NUMBER,[\"#ffd700\",220]],[Ke.PATH,[\"#d75fd7\",170]],[Ke.URL,[\"#d75fd7\",170]],[Ke.ADDED,[\"#5faf00\",70]],[Ke.REMOVED,[\"#d70000\",160]],[Ke.CODE,[\"#87afff\",111]],[Ke.SIZE,[\"#ffd700\",220]]]),ms=r=>r,Wy={[Ke.NUMBER]:ms({pretty:(r,e)=>Qn(r,`${e}`,Ke.NUMBER),json:r=>r}),[Ke.IDENT]:ms({pretty:(r,e)=>Ai(r,e),json:r=>Ot(r)}),[Ke.LOCATOR]:ms({pretty:(r,e)=>mt(r,e),json:r=>Es(r)}),[Ke.DESCRIPTOR]:ms({pretty:(r,e)=>tr(r,e),json:r=>bn(r)}),[Ke.RESOLUTION]:ms({pretty:(r,{descriptor:e,locator:t})=>iP(r,e,t),json:({descriptor:r,locator:e})=>({descriptor:bn(r),locator:e!==null?Es(e):null})}),[Ke.DEPENDENT]:ms({pretty:(r,{locator:e,descriptor:t})=>nP(r,e,t),json:({locator:r,descriptor:e})=>({locator:Es(r),descriptor:bn(e)})}),[Ke.PACKAGE_EXTENSION]:ms({pretty:(r,e)=>{switch(e.type){case\"Dependency\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${Qn(r,\"dependencies\",Ke.CODE)} \\u27A4 ${Ai(r,e.descriptor)}`;case\"PeerDependency\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${Qn(r,\"peerDependencies\",Ke.CODE)} \\u27A4 ${Ai(r,e.descriptor)}`;case\"PeerDependencyMeta\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${Qn(r,\"peerDependenciesMeta\",Ke.CODE)} \\u27A4 ${Ai(r,en(e.selector))} \\u27A4 ${Qn(r,e.key,Ke.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:r=>{switch(r.type){case\"Dependency\":return`${Ot(r.parentDescriptor)} > ${Ot(r.descriptor)}`;case\"PeerDependency\":return`${Ot(r.parentDescriptor)} >> ${Ot(r.descriptor)}`;case\"PeerDependencyMeta\":return`${Ot(r.parentDescriptor)} >> ${r.selector} / ${r.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${r.type}`)}}}),[Ke.SETTING]:ms({pretty:(r,e)=>(r.get(e),If(r,Qn(r,e,Ke.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:r=>r}),[Ke.DURATION]:ms({pretty:(r,e)=>{if(e>1e3*60){let t=Math.floor(e/1e3/60),i=Math.ceil((e-t*60*1e3)/1e3);return i===0?`${t}m`:`${t}m ${i}s`}else{let t=Math.floor(e/1e3),i=e-t*1e3;return i===0?`${t}s`:`${t}s ${i}ms`}},json:r=>r}),[Ke.SIZE]:ms({pretty:(r,e)=>{let t=[\"KB\",\"MB\",\"GB\",\"TB\"],i=t.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return Qn(r,`${s} ${t[i-1]}`,Ke.NUMBER)},json:r=>r}),[Ke.PATH]:ms({pretty:(r,e)=>Qn(r,U.fromPortablePath(e),Ke.PATH),json:r=>U.fromPortablePath(r)}),[Ke.MARKDOWN]:ms({pretty:(r,{text:e,format:t,paragraphs:i})=>Li(e,{format:t,paragraphs:i}),json:({text:r})=>r})};function no(r,e){return[e,r]}function Vy(r,e,t){return r.get(\"enableColors\")&&t&2&&(e=Vd.default.bold(e)),e}function Qn(r,e,t){if(!r.get(\"enableColors\"))return e;let i=A0e.get(t);if(i===null)return e;let n=typeof i>\"u\"?t:$x.level>=3?i[0]:i[1],s=typeof n==\"number\"?Zx.ansi256(n):n.startsWith(\"#\")?Zx.hex(n):Zx[n];if(typeof s!=\"function\")throw new Error(`Invalid format type ${n}`);return s(e)}var l0e=!!process.env.KONSOLE_VERSION;function If(r,e,t){return r.get(\"enableHyperlinks\")?l0e?`\\x1B]8;;${t}\\x1B\\\\${e}\\x1B]8;;\\x1B\\\\`:`\\x1B]8;;${t}\\x07${e}\\x1B]8;;\\x07`:e}function $e(r,e,t){if(e===null)return Qn(r,\"null\",Ke.NULL);if(Object.prototype.hasOwnProperty.call(Wy,t))return Wy[t].pretty(r,e);if(typeof e!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return Qn(r,e,t)}function tP(r,e,t,{separator:i=\", \"}={}){return[...e].map(n=>$e(r,n,t)).join(i)}function Bc(r,e){if(r===null)return null;if(Object.prototype.hasOwnProperty.call(Wy,e))return Wy[e].json(r);if(typeof r!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof r}`);return r}function c0e(r,e,[t,i]){return r?Bc(t,i):$e(e,t,i)}function rP(r){return{Check:Qn(r,\"\\u2713\",\"green\"),Cross:Qn(r,\"\\u2718\",\"red\"),Question:Qn(r,\"?\",\"cyan\")}}function Ho(r,{label:e,value:[t,i]}){return`${$e(r,e,Ke.CODE)}: ${$e(r,t,i)}`}var Xy=(n=>(n.Error=\"error\",n.Warning=\"warning\",n.Info=\"info\",n.Discard=\"discard\",n))(Xy||{});function Xd(r,{configuration:e}){let t=e.get(\"logFilters\"),i=new Map,n=new Map,s=[];for(let g of t){let f=g.get(\"level\");if(typeof f>\"u\")continue;let h=g.get(\"code\");typeof h<\"u\"&&i.set(h,f);let p=g.get(\"text\");typeof p<\"u\"&&n.set(p,f);let C=g.get(\"pattern\");typeof C<\"u\"&&s.push([f8.default.matcher(C,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===0)return h;let p=n.size>0||s.length>0?(0,h8.default)(f):f;if(n.size>0){let C=n.get(p);if(typeof C<\"u\")return C!=null?C:h}if(s.length>0){for(let[C,y]of s)if(C(p))return y!=null?y:h}if(i.size>0){let C=i.get(FA(g));if(typeof C<\"u\")return C!=null?C:h}return h},a=r.reportInfo,l=r.reportWarning,c=r.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case\"info\":a.call(g,f,h);break;case\"warning\":l.call(g,f!=null?f:0,h);break;case\"error\":c.call(g,f!=null?f:0,h);break}};r.reportInfo=function(...g){return u(this,...g,\"info\")},r.reportWarning=function(...g){return u(this,...g,\"warning\")},r.reportError=function(...g){return u(this,...g,\"error\")}}var li={};ut(li,{checksumFile:()=>Qw,checksumPattern:()=>bw,makeHash:()=>tn});var Bw=J(\"crypto\"),UD=Pe(MD());function tn(...r){let e=(0,Bw.createHash)(\"sha512\"),t=\"\";for(let i of r)typeof i==\"string\"?t+=i:i&&(t&&(e.update(t),t=\"\"),e.update(i));return t&&e.update(t),e.digest(\"hex\")}async function Qw(r,{baseFs:e,algorithm:t}={baseFs:M,algorithm:\"sha512\"}){let i=await e.openPromise(r,\"r\");try{let s=Buffer.allocUnsafeSlow(65536),o=(0,Bw.createHash)(t),a=0;for(;(a=await e.readPromise(i,s,0,65536))!==0;)o.update(a===65536?s:s.slice(0,a));return o.digest(\"hex\")}finally{await e.closePromise(i)}}async function bw(r,{cwd:e}){let i=(await(0,UD.default)(r,{cwd:U.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,UD.default)([r,...i],{cwd:U.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=U.toPortablePath(a),u=await M.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await M.readlinkPromise(c))):u.isFile()&&l.push(await M.readFilePromise(c)),l.join(\"\\0\")})),o=(0,Bw.createHash)(\"sha512\");for(let a of s)o.update(a);return o.digest(\"hex\")}var eC=\"virtual:\",SSe=5,BW=/(os|cpu|libc)=([a-z0-9_-]+)/,vSe=(0,wW.makeParser)(BW);function qo(r,e){if(r!=null&&r.startsWith(\"@\"))throw new Error(\"Invalid scope: don't prefix it with '@'\");return{identHash:tn(r,e),scope:r,name:e}}function _t(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:tn(r.identHash,e),range:e}}function rn(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:tn(r.identHash,e),reference:e}}function xSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name}}function Sw(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.descriptorHash,reference:r.range}}function HD(r){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:r.locatorHash,range:r.reference}}function PSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.locatorHash,reference:r.reference}}function tC(r,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:r.version,languageName:r.languageName,linkType:r.linkType,conditions:r.conditions,dependencies:new Map(r.dependencies),peerDependencies:new Map(r.peerDependencies),dependenciesMeta:new Map(r.dependenciesMeta),peerDependenciesMeta:new Map(r.peerDependenciesMeta),bin:new Map(r.bin)}}function rC(r){return tC(r,r)}function GD(r,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return _t(r,`virtual:${e}#${r.range}`)}function YD(r,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return tC(r,rn(r,`virtual:${e}#${r.reference}`))}function JA(r){return r.range.startsWith(eC)}function jo(r){return r.reference.startsWith(eC)}function iC(r){if(!JA(r))throw new Error(\"Not a virtual descriptor\");return _t(r,r.range.replace(/^[^#]*#/,\"\"))}function nC(r){if(!jo(r))throw new Error(\"Not a virtual descriptor\");return rn(r,r.reference.replace(/^[^#]*#/,\"\"))}function DSe(r,e){return r.range.includes(\"::\")?r:_t(r,`${r.range}::${Sf.default.stringify(e)}`)}function kSe(r,e){return r.reference.includes(\"::\")?r:rn(r,`${r.reference}::${Sf.default.stringify(e)}`)}function sC(r,e){return r.identHash===e.identHash}function QW(r,e){return r.descriptorHash===e.descriptorHash}function oC(r,e){return r.locatorHash===e.locatorHash}function RSe(r,e){if(!jo(r))throw new Error(\"Invalid package type\");if(!jo(e))throw new Error(\"Invalid package type\");if(!sC(r,e)||r.dependencies.size!==e.dependencies.size)return!1;for(let t of r.dependencies.values()){let i=e.dependencies.get(t.identHash);if(!i||!QW(t,i))return!1}return!0}function en(r){let e=bW(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function bW(r){let e=r.match(/^(?:@([^/]+?)\\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e;return qo(typeof t<\"u\"?t:null,i)}function WA(r,e=!1){let t=aC(r,e);if(!t)throw new Error(`Invalid descriptor (${r})`);return t}function aC(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s===\"unknown\")throw new Error(`Invalid range (${r})`);let o=typeof i<\"u\"?i:null,a=typeof s<\"u\"?s:\"unknown\";return _t(qo(o,n),a)}function Dc(r,e=!1){let t=vw(r,e);if(!t)throw new Error(`Invalid locator (${r})`);return t}function vw(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s===\"unknown\")throw new Error(`Invalid reference (${r})`);let o=typeof i<\"u\"?i:null,a=typeof s<\"u\"?s:\"unknown\";return rn(qo(o,n),a)}function vf(r,e){let t=r.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(t===null)throw new Error(`Invalid range (${r})`);let i=typeof t[1]<\"u\"?t[1]:null;if(typeof(e==null?void 0:e.requireProtocol)==\"string\"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof t[3]<\"u\"?decodeURIComponent(t[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${r})`);let s=typeof t[3]<\"u\"?decodeURIComponent(t[3]):decodeURIComponent(t[2]),o=e!=null&&e.parseSelector?Sf.default.parse(s):s,a=typeof t[4]<\"u\"?Sf.default.parse(t[4]):null;return{protocol:i,source:n,selector:o,params:a}}function FSe(r,{protocol:e}){let{selector:t,params:i}=vf(r,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!=\"string\")throw new Error(`Assertion failed: Invalid bindings for ${r}`);return{parentLocator:Dc(i.locator,!0),path:t}}function IW(r){return r=r.replace(/%/g,\"%25\"),r=r.replace(/:/g,\"%3A\"),r=r.replace(/#/g,\"%23\"),r}function NSe(r){return r===null?!1:Object.entries(r).length>0}function xw({protocol:r,source:e,selector:t,params:i}){let n=\"\";return r!==null&&(n+=`${r}`),e!==null&&(n+=`${IW(e)}#`),n+=IW(t),NSe(i)&&(n+=`::${Sf.default.stringify(i)}`),n}function LSe(r){let{params:e,protocol:t,source:i,selector:n}=vf(r);for(let s in e)s.startsWith(\"__\")&&delete e[s];return xw({protocol:t,source:i,params:e,selector:n})}function Ot(r){return r.scope?`@${r.scope}/${r.name}`:`${r.name}`}function bn(r){return r.scope?`@${r.scope}/${r.name}@${r.range}`:`${r.name}@${r.range}`}function Es(r){return r.scope?`@${r.scope}/${r.name}@${r.reference}`:`${r.name}@${r.reference}`}function KD(r){return r.scope!==null?`@${r.scope}-${r.name}`:r.name}function xf(r){let{protocol:e,selector:t}=vf(r.reference),i=e!==null?e.replace(/:$/,\"\"):\"exotic\",n=yW.default.valid(t),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=r.scope?`${KD(r)}-${s}-${r.locatorHash.slice(0,o)}`:`${KD(r)}-${s}-${r.locatorHash.slice(0,o)}`;return Kr(a)}function Ai(r,e){return e.scope?`${$e(r,`@${e.scope}/`,Ke.SCOPE)}${$e(r,e.name,Ke.NAME)}`:`${$e(r,e.name,Ke.NAME)}`}function Pw(r){if(r.startsWith(eC)){let e=Pw(r.substring(r.indexOf(\"#\")+1)),t=r.substring(eC.length,eC.length+SSe);return`${e} [${t}]`}else return r.replace(/\\?.*/,\"?[...]\")}function Dw(r,e){return`${$e(r,Pw(e),Ke.RANGE)}`}function tr(r,e){return`${Ai(r,e)}${$e(r,\"@\",Ke.RANGE)}${Dw(r,e.range)}`}function AC(r,e){return`${$e(r,Pw(e),Ke.REFERENCE)}`}function mt(r,e){return`${Ai(r,e)}${$e(r,\"@\",Ke.REFERENCE)}${AC(r,e.reference)}`}function jD(r){return`${Ot(r)}@${Pw(r.reference)}`}function Pf(r){return Bn(r,[e=>Ot(e),e=>e.range])}function lC(r,e){return Ai(r,e.locator)}function iP(r,e,t){let i=JA(e)?iC(e):e;return t===null?`${tr(r,i)} \\u2192 ${rP(r).Cross}`:i.identHash===t.identHash?`${tr(r,i)} \\u2192 ${AC(r,t.reference)}`:`${tr(r,i)} \\u2192 ${mt(r,t)}`}function nP(r,e,t){return t===null?`${mt(r,e)}`:`${mt(r,e)} (via ${Dw(r,t.range)})`}function qD(r){return`node_modules/${Ot(r)}`}function kw(r,e){return r.conditions?vSe(r.conditions,t=>{let[,i,n]=t.match(BW),s=e[i];return s?s.includes(n):!0}):!0}var SW={hooks:{reduceDependency:(r,e,t,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(t)||o.from&&o.from.description&&o.from.description!==t.reference||o.descriptor.fullName!==Ot(r)||o.descriptor.description&&o.descriptor.description!==r.range)continue;return n.bindDescriptor(_t(r,a),e.topLevelWorkspace.anchoredLocator,s)}return r},validateProject:async(r,e)=>{for(let t of r.workspaces){let i=lC(r.configuration,t);await r.configuration.triggerHook(n=>n.validateWorkspace,t,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(r,e)=>{let{manifest:t}=r;t.resolutions.length&&r.cwd!==r.project.cwd&&t.errors.push(new Error(\"Resolutions field will be ignored\"));for(let i of t.errors)e.reportWarning(57,i.message)}}};var FW=Pe(Xr());var cC=class{supportsDescriptor(e,t){return!!(e.range.startsWith(cC.protocol)||t.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,t){return!!e.reference.startsWith(cC.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.getWorkspaceByCwd(e.reference.slice(cC.protocol.length));return{...e,version:i.manifest.version||\"0.0.0\",languageName:\"unknown\",linkType:\"SOFT\",conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin}}},jr=cC;jr.protocol=\"workspace:\";var vt={};ut(vt,{SemVer:()=>PW.SemVer,clean:()=>OSe,satisfiesWithPrereleases:()=>kc,validRange:()=>so});var Rw=Pe(Xr()),PW=Pe(Xr()),vW=new Map;function kc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=vW.get(i);if(typeof n>\"u\")try{n=new Rw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{vW.set(i,n||null)}else if(n===null)return!1;let s;try{s=new Rw.default.SemVer(r,n)}catch{return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var xW=new Map;function so(r){if(r.indexOf(\":\")!==-1)return null;let e=xW.get(r);if(typeof e<\"u\")return e;try{e=new Rw.default.Range(r)}catch{e=null}return xW.set(r,e),e}var TSe=/^(?:[\\sv=]*?)((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)(?:\\s*)$/;function OSe(r){let e=TSe.exec(r);return e?e[1]:null}var zA=class{constructor(){this.indent=\"  \";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:t=new $t}={}){let i=x.join(e,\"package.json\");try{return await zA.fromFile(i,{baseFs:t})}catch(n){if(n.code===\"ENOENT\")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await zA.tryFind(e,{baseFs:t});if(i===null)throw new Error(\"Manifest not found\");return i}static async fromFile(e,{baseFs:t=new $t}={}){let i=new zA;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new zA;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]===\"!\"){if(n=!0,t===s.slice(1))return!1}else if(i=!1,s===t)return!0;return n&&i}loadFromText(e){let t;try{t=JSON.parse(kW(e)||\"{}\")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=DW(e)}async loadFile(e,{baseFs:t=new $t}){let i=await t.readFilePromise(e,\"utf8\"),n;try{n=JSON.parse(kW(i)||\"{}\")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=DW(i)}load(e,{yamlCompatibilityMode:t=!1}={}){if(typeof e!=\"object\"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name==\"string\")try{this.name=en(e.name)}catch{i.push(new Error(\"Parsing failed for the 'name' field\"))}if(typeof e.version==\"string\"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!=\"string\"?i.push(new Error(\"Parsing failed for the 'os' field\")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!=\"string\"?i.push(new Error(\"Parsing failed for the 'cpu' field\")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!=\"string\"?i.push(new Error(\"Parsing failed for the 'libc' field\")):s.push(o)}else this.libc=null;if(typeof e.type==\"string\"?this.type=e.type:this.type=null,typeof e.packageManager==\"string\"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private==\"boolean\"?this.private=e.private:this.private=!1,typeof e.license==\"string\"?this.license=e.license:this.license=null,typeof e.languageName==\"string\"?this.languageName=e.languageName:this.languageName=null,typeof e.main==\"string\"?this.main=nn(e.main):this.main=null,typeof e.module==\"string\"?this.module=nn(e.module):this.module=null,e.browser!=null)if(typeof e.browser==\"string\")this.browser=nn(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(nn(s),typeof o==\"string\"?nn(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin==\"string\")this.name!==null?this.bin.set(this.name.name,nn(e.bin)):i.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.bin==\"object\"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!=\"string\"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=en(s);this.bin.set(a.name,nn(o))}if(this.scripts=new Map,typeof e.scripts==\"object\"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!=\"string\"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies==\"object\"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!=\"string\"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=en(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=_t(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies==\"object\"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!=\"string\"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=en(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=_t(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies==\"object\"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=en(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!=\"string\"||!o.startsWith(jr.protocol)&&!so(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o=\"*\");let l=_t(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces==\"object\"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error(\"'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead\"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces==\"object\"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!=\"string\"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta==\"object\"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!=\"object\"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=WA(s),l=this.ensureDependencyMeta(a),c=Fw(o.built,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=Fw(o.optional,{yamlCompatibilityMode:t});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=Fw(o.unplugged,{yamlCompatibilityMode:t});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta==\"object\"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!=\"object\"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=WA(s),l=this.ensurePeerDependencyMeta(a),c=Fw(o.optional,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions==\"object\"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!=\"string\"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:hI(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!=\"string\"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig==\"object\"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access==\"string\"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main==\"string\"&&(this.publishConfig.main=nn(e.publishConfig.main)),typeof e.publishConfig.module==\"string\"&&(this.publishConfig.module=nn(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser==\"string\")this.publishConfig.browser=nn(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(nn(s),typeof o==\"string\"?nn(o):o)}if(typeof e.publishConfig.registry==\"string\"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin==\"string\")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,nn(e.publishConfig.bin)]]):i.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.publishConfig.bin==\"object\"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!=\"string\"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,nn(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!=\"string\"){i.push(new Error(\"Invalid executable file definition\"));continue}this.publishConfig.executableFiles.add(nn(s))}}}else this.publishConfig=null;if(typeof e.installConfig==\"object\"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s===\"hoistingLimits\"?typeof e.installConfig.hoistingLimits==\"string\"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error(\"Invalid hoisting limits definition\")):s==\"selfReferences\"?typeof e.installConfig.selfReferences==\"boolean\"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error(\"Invalid selfReferences definition, must be a boolean value\")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies==\"object\"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!=\"string\"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=en(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=_t(a,o);this.dependencies.set(l.identHash,l);let c=_t(a,\"unknown\"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged==\"boolean\"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case\"dependencies\":return this.dependencies;case\"devDependencies\":return this.devDependencies;case\"peerDependencies\":return this.peerDependencies;default:throw new Error(`Unsupported value (\"${e}\")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(JD(\"os\",this.os)),this.cpu&&this.cpu.length>0&&e.push(JD(\"cpu\",this.cpu)),this.libc&&this.libc.length>0&&e.push(JD(\"libc\",this.libc)),e.length>0?e.join(\" & \"):null}isCompatibleWithOS(e){return zA.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return zA.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!==\"unknown\"&&!FW.default.valid(e.range))throw new Error(`Invalid meta field range for '${bn(e)}'`);let t=Ot(e),i=e.range!==\"unknown\"?e.range:null,n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!==\"unknown\")throw new Error(`Invalid meta field range for '${bn(e)}'`);let t=Ot(e),i=this.peerDependenciesMeta.get(t);return i||this.peerDependenciesMeta.set(t,i={}),i}setRawField(e,t,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=t,a=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o==\"string\"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:o})=>o)}:e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(t&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Pf(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Pf(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Pf(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Pf(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of Bn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of Bn(a.entries(),([u,g])=>u!==null?`0${u}`:\"1\")){let u=l!==null?bn(_t(en(o),l)):o,g={...c};t&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...Bn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[pI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},ot=zA;ot.fileName=\"package.json\",ot.allDependencies=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],ot.hardDependencies=[\"dependencies\",\"devDependencies\"];function DW(r){let e=r.match(/^[ \\t]+/m);return e?e[0]:\"  \"}function kW(r){return r.charCodeAt(0)===65279?r.slice(1):r}function nn(r){return r.replace(/\\\\/g,\"/\")}function Fw(r,{yamlCompatibilityMode:e}){return e?zx(r):typeof r>\"u\"||typeof r==\"boolean\"?r:null}function RW(r,e){let t=e.search(/[^!]/);if(t===-1)return\"invalid\";let i=t%2===0?\"\":\"!\",n=e.slice(t);return`${i}${r}=${n}`}function JD(r,e){return e.length===1?RW(r,e[0]):`(${e.map(t=>RW(r,t)).join(\" | \")})`}var cz=Pe(lz()),uz=J(\"stream\"),gz=J(\"string_decoder\");var Dve=15,at=class extends Error{constructor(t,i,n){super(i);this.reportExtra=n;this.reportCode=t}};function kve(r){return typeof r.reportCode<\"u\"}var vi=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let t=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),t=l,c()},o=(l=0)=>{s(t+1)},a=async function*(){for(;t<e;)await n,yield{progress:t/e}}();return{[Symbol.asyncIterator](){return a},hasProgress:!0,hasTitle:!1,set:s,tick:o}}static progressViaTitle(){let e,t,i=new Promise(o=>{t=o}),n=(0,cz.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/Dve),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,t){let i=this.reportProgress(e);try{return await t(e)}finally{i.stop()}}startProgressSync(e,t){let i=this.reportProgress(e);try{return t(e)}finally{i.stop()}}reportInfoOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){kve(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let t=new uz.PassThrough,i=new gz.StringDecoder,n=\"\";return t.on(\"data\",s=>{let o=i.write(s),a;do if(a=o.indexOf(`\n`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n=\"\",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),t.on(\"end\",()=>{let s=i.end();s!==\"\"&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),t}};var Df=class{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){return await this.getFetcher(e,t).fetch(e,t)}tryFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));return i||null}getFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));if(!i)throw new at(11,`${mt(t.project.configuration,e)} isn't supported by any available fetcher`);return i}};var kf=class{constructor(e){this.resolvers=e.filter(t=>t)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,t,i)}async getSatisfying(e,t,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,t,i)}async resolve(e,t){return await this.getResolverByLocator(e,t).resolve(e,t)}tryResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));return i||null}getResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));if(!i)throw new Error(`${tr(t.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));return i||null}getResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));if(!i)throw new Error(`${mt(t.project.configuration,e)} isn't supported by any available resolver`);return i}};var fz=Pe(Xr());var Rf=/^(?!v)[a-z0-9._-]+$/i,Nw=class{supportsDescriptor(e,t){return!!(so(e.range)||Rf.test(e.range))}supportsLocator(e,t){return!!(fz.default.valid(e.reference)||Rf.test(e.reference))}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),t,i)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),t,i)}async getSatisfying(e,t,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),t,i)}async resolve(e,t){let i=await t.resolver.resolve(this.forwardLocator(e,t),t);return tC(i,e)}forwardDescriptor(e,t){return _t(e,`${t.project.configuration.get(\"defaultProtocol\")}${e.range}`)}forwardLocator(e,t){return rn(e,`${t.project.configuration.get(\"defaultProtocol\")}${e.reference}`)}};var Ff=class{supports(e){return!!e.reference.startsWith(\"virtual:\")}getLocalPath(e,t){let i=e.reference.indexOf(\"#\");if(i===-1)throw new Error(\"Invalid virtual package reference\");let n=e.reference.slice(i+1),s=rn(e,n);return t.fetcher.getLocalPath(s,t)}async fetch(e,t){let i=e.reference.indexOf(\"#\");if(i===-1)throw new Error(\"Invalid virtual package reference\");let n=e.reference.slice(i+1),s=rn(e,n),o=await t.fetcher.fetch(s,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return xf(e)}async ensureVirtualLink(e,t,i){let n=t.packageFs.getRealPath(),s=i.project.configuration.get(\"virtualFolder\"),o=this.getLocatorFilename(e),a=Br.makeVirtualPath(s,o,n),l=new bo(a,{baseFs:t.packageFs,pathUtils:x});return{...t,packageFs:l}}};var Nf=class{static isVirtualDescriptor(e){return!!e.range.startsWith(Nf.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(Nf.protocol)}supportsDescriptor(e,t){return Nf.isVirtualDescriptor(e)}supportsLocator(e,t){return Nf.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){throw new Error('Assertion failed: calling \"bindDescriptor\" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling \"getResolutionDependencies\" on a virtual descriptor is unsupported')}async getCandidates(e,t,i){throw new Error('Assertion failed: calling \"getCandidates\" on a virtual descriptor is unsupported')}async getSatisfying(e,t,i){throw new Error('Assertion failed: calling \"getSatisfying\" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling \"resolve\" on a virtual locator is unsupported')}},fC=Nf;fC.protocol=\"virtual:\";var Lf=class{supports(e){return!!e.reference.startsWith(jr.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){let i=this.getWorkspace(e,t).cwd;return{packageFs:new qt(i),prefixPath:Oe.dot,localPath:i}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(jr.protocol.length))}};var Lw={};ut(Lw,{getDefaultGlobalFolder:()=>XD,getHomeFolder:()=>hC,isFolderInside:()=>ZD});var VD=J(\"os\");function XD(){if(process.platform===\"win32\"){let r=U.toPortablePath(process.env.LOCALAPPDATA||U.join((0,VD.homedir)(),\"AppData\",\"Local\"));return x.resolve(r,\"Yarn/Berry\")}if(process.env.XDG_DATA_HOME){let r=U.toPortablePath(process.env.XDG_DATA_HOME);return x.resolve(r,\"yarn/berry\")}return x.resolve(hC(),\".yarn/berry\")}function hC(){return U.toPortablePath((0,VD.homedir)()||\"/usr/local/share\")}function ZD(r,e){let t=x.relative(e,r);return t&&!t.startsWith(\"..\")&&!x.isAbsolute(t)}var ws={};ut(ws,{availableParallelism:()=>ek,builtinModules:()=>_D,getArchitecture:()=>pC,getArchitectureName:()=>Nve,getArchitectureSet:()=>$D,openUrl:()=>Rve});var pz=Pe(J(\"module\")),Mw=Pe(J(\"os\"));var hz=new Map([[\"darwin\",\"open\"],[\"linux\",\"xdg-open\"],[\"win32\",\"explorer.exe\"]]).get(process.platform),Rve=typeof hz<\"u\"?async r=>{try{return await tk(hz,[r],{cwd:x.cwd()}),!0}catch{return!1}}:void 0;function _D(){return new Set(pz.default.builtinModules||Object.keys(process.binding(\"natives\")))}function Fve(){var i,n,s,o;if(process.platform===\"win32\")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],t=/\\/(?:(ld-linux-|[^/]+-linux-gnu\\/)|(libc.musl-|ld-musl-))/;return(o=Jd(e,a=>{let l=a.match(t);if(!l)return Jd.skip;if(l[1])return\"glibc\";if(l[2])return\"musl\";throw new Error(\"Assertion failed: Expected the libc variant to have been detected\")}))!=null?o:null}var Tw,Ow;function pC(){return Tw=Tw!=null?Tw:{os:process.platform,cpu:process.arch,libc:Fve()}}function Nve(r=pC()){return r.libc?`${r.os}-${r.cpu}-${r.libc}`:`${r.os}-${r.cpu}`}function $D(){let r=pC();return Ow=Ow!=null?Ow:{os:[r.os],cpu:[r.cpu],libc:r.libc?[r.libc]:[]}}function ek(){return\"availableParallelism\"in Mw.default?Mw.default.availableParallelism():Math.max(1,Mw.default.cpus().length)}var Lve=new Set([\"isTestEnv\",\"injectNpmUser\",\"injectNpmPassword\",\"injectNpm2FaToken\",\"binFolder\",\"version\",\"flags\",\"profile\",\"gpg\",\"ignoreNode\",\"wrapOutput\",\"home\",\"confDir\",\"registry\"]),Gw=\"yarn_\",sk=\".yarnrc.yml\",ok=\"yarn.lock\",Tve=\"********\",ak=(u=>(u.ANY=\"ANY\",u.BOOLEAN=\"BOOLEAN\",u.ABSOLUTE_PATH=\"ABSOLUTE_PATH\",u.LOCATOR=\"LOCATOR\",u.LOCATOR_LOOSE=\"LOCATOR_LOOSE\",u.NUMBER=\"NUMBER\",u.STRING=\"STRING\",u.SECRET=\"SECRET\",u.SHAPE=\"SHAPE\",u.MAP=\"MAP\",u))(ak||{}),xi=Ke,rk={lastUpdateCheck:{description:\"Last timestamp we checked whether new Yarn versions were available\",type:\"STRING\",default:null},yarnPath:{description:\"Path to the local executable that must be used over the global one\",type:\"ABSOLUTE_PATH\",default:null},ignorePath:{description:\"If true, the local executable will be ignored when using the global one\",type:\"BOOLEAN\",default:!1},ignoreCwd:{description:\"If true, the `--cwd` flag will be ignored\",type:\"BOOLEAN\",default:!1},cacheKeyOverride:{description:\"A global cache key override; used only for test purposes\",type:\"STRING\",default:null},globalFolder:{description:\"Folder where all system-global files are stored\",type:\"ABSOLUTE_PATH\",default:XD()},cacheFolder:{description:\"Folder where the cache files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/cache\"},compressionLevel:{description:\"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)\",type:\"NUMBER\",values:[\"mixed\",0,1,2,3,4,5,6,7,8,9],default:Xl},virtualFolder:{description:\"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/__virtual__\"},lockfileFilename:{description:\"Name of the files where the Yarn dependency tree entries must be stored\",type:\"STRING\",default:ok},installStatePath:{description:\"Path of the file where the install state will be persisted\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/install-state.gz\"},immutablePatterns:{description:\"Array of glob patterns; files matching them won't be allowed to change during immutable installs\",type:\"STRING\",default:[],isArray:!0},rcFilename:{description:\"Name of the files where the configuration can be found\",type:\"STRING\",default:Hw()},enableGlobalCache:{description:\"If true, the system-wide cache folder will be used regardless of `cache-folder`\",type:\"BOOLEAN\",default:!1},enableColors:{description:\"If true, the CLI is allowed to use colors in its output\",type:\"BOOLEAN\",default:zy,defaultText:\"<dynamic>\"},enableHyperlinks:{description:\"If true, the CLI is allowed to use hyperlinks in its output\",type:\"BOOLEAN\",default:eP,defaultText:\"<dynamic>\"},enableInlineBuilds:{description:\"If true, the CLI will print the build output on the command line\",type:\"BOOLEAN\",default:Uw.isCI,defaultText:\"<dynamic>\"},enableMessageNames:{description:\"If true, the CLI will prefix most messages with codes suitable for search engines\",type:\"BOOLEAN\",default:!0},enableProgressBars:{description:\"If true, the CLI is allowed to show a progress bar for long-running events\",type:\"BOOLEAN\",default:!Uw.isCI,defaultText:\"<dynamic>\"},enableTimers:{description:\"If true, the CLI is allowed to print the time spent executing commands\",type:\"BOOLEAN\",default:!0},preferAggregateCacheInfo:{description:\"If true, the CLI will only print a one-line report of any cache changes\",type:\"BOOLEAN\",default:Uw.isCI},preferInteractive:{description:\"If true, the CLI will automatically use the interactive mode when called from a TTY\",type:\"BOOLEAN\",default:!1},preferTruncatedLines:{description:\"If true, the CLI will truncate lines that would go beyond the size of the terminal\",type:\"BOOLEAN\",default:!1},progressBarStyle:{description:\"Which style of progress bar should be used (only when progress bars are enabled)\",type:\"STRING\",default:void 0,defaultText:\"<dynamic>\"},defaultLanguageName:{description:\"Default language mode that should be used when a package doesn't offer any insight\",type:\"STRING\",default:\"node\"},defaultProtocol:{description:\"Default resolution protocol used when resolving pure semver and tag ranges\",type:\"STRING\",default:\"npm:\"},enableTransparentWorkspaces:{description:\"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol\",type:\"BOOLEAN\",default:!0},supportedArchitectures:{description:\"Architectures that Yarn will fetch and inject into the resolver\",type:\"SHAPE\",properties:{os:{description:\"Array of supported process.platform strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},cpu:{description:\"Array of supported process.arch strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},libc:{description:\"Array of supported libc libraries, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]}}},enableMirror:{description:\"If true, the downloaded packages will be retrieved and stored in both the local and global folders\",type:\"BOOLEAN\",default:!0},enableNetwork:{description:\"If false, the package manager will refuse to use the network if required to\",type:\"BOOLEAN\",default:!0},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},unsafeHttpWhitelist:{description:\"List of the hostnames for which http queries are allowed (glob patterns are supported)\",type:\"STRING\",default:[],isArray:!0},httpTimeout:{description:\"Timeout of each http request in milliseconds\",type:\"NUMBER\",default:6e4},httpRetry:{description:\"Retry times on http failure\",type:\"NUMBER\",default:3},networkConcurrency:{description:\"Maximal number of concurrent requests\",type:\"NUMBER\",default:50},networkSettings:{description:\"Network settings per hostname (glob patterns are supported)\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{caFilePath:{description:\"Path to file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},enableNetwork:{description:\"If false, the package manager will refuse to use the network if required to\",type:\"BOOLEAN\",default:null},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null}}}},caFilePath:{description:\"A path to a file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null},enableStrictSsl:{description:\"If false, SSL certificate errors will be ignored\",type:\"BOOLEAN\",default:!0},logFilters:{description:\"Overrides for log levels\",type:\"SHAPE\",isArray:!0,concatenateValues:!0,properties:{code:{description:\"Code of the messages covered by this override\",type:\"STRING\",default:void 0},text:{description:\"Code of the texts covered by this override\",type:\"STRING\",default:void 0},pattern:{description:\"Code of the patterns covered by this override\",type:\"STRING\",default:void 0},level:{description:\"Log level override, set to null to remove override\",type:\"STRING\",values:Object.values(Xy),isNullable:!0,default:void 0}}},enableTelemetry:{description:\"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry\",type:\"BOOLEAN\",default:!0},telemetryInterval:{description:\"Minimal amount of time between two telemetry uploads, in days\",type:\"NUMBER\",default:7},telemetryUserId:{description:\"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.\",type:\"STRING\",default:null},enableScripts:{description:\"If true, packages are allowed to have install scripts by default\",type:\"BOOLEAN\",default:!0},enableStrictSettings:{description:\"If true, unknown settings will cause Yarn to abort\",type:\"BOOLEAN\",default:!0},enableImmutableCache:{description:\"If true, the cache is reputed immutable and actions that would modify it will throw\",type:\"BOOLEAN\",default:!1},checksumBehavior:{description:\"Enumeration defining what to do when a checksum doesn't match expectations\",type:\"STRING\",default:\"throw\"},packageExtensions:{description:\"Map of package corrections to apply on the dependency tree\",type:\"MAP\",valueDefinition:{description:\"The extension that will be applied to any package whose version matches the specified range\",type:\"SHAPE\",properties:{dependencies:{description:\"The set of dependencies that must be made available to the current package in order for it to work properly\",type:\"MAP\",valueDefinition:{description:\"A range\",type:\"STRING\"}},peerDependencies:{description:\"Inherited dependencies - the consumer of the package will be tasked to provide them\",type:\"MAP\",valueDefinition:{description:\"A semver range\",type:\"STRING\"}},peerDependenciesMeta:{description:\"Extra information related to the dependencies listed in the peerDependencies field\",type:\"MAP\",valueDefinition:{description:\"The peerDependency meta\",type:\"SHAPE\",properties:{optional:{description:\"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error\",type:\"BOOLEAN\",default:!1}}}}}}}};function Ak(r,e,t,i,n){if(i.isArray||i.type===\"ANY\"&&Array.isArray(t))return Array.isArray(t)?t.map((s,o)=>ik(r,`${e}[${o}]`,s,i,n)):String(t).split(/,/).map(s=>ik(r,e,s,i,n));if(Array.isArray(t))throw new Error(`Non-array configuration settings \"${e}\" cannot be an array`);return ik(r,e,t,i,n)}function ik(r,e,t,i,n){var a;switch(i.type){case\"ANY\":return t;case\"SHAPE\":return Ove(r,e,t,i,n);case\"MAP\":return Mve(r,e,t,i,n)}if(t===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings \"${e}\" cannot be set to null`);if((a=i.values)!=null&&a.includes(t))return t;let o=(()=>{if(i.type===\"BOOLEAN\"&&typeof t!=\"string\")return Wd(t);if(typeof t!=\"string\")throw new Error(`Expected value (${t}) to be a string`);let l=Wx(t,{env:process.env});switch(i.type){case\"ABSOLUTE_PATH\":return x.resolve(n,U.toPortablePath(l));case\"LOCATOR_LOOSE\":return Dc(l,!1);case\"NUMBER\":return parseInt(l);case\"LOCATOR\":return Dc(l);case\"BOOLEAN\":return Wd(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(\", \")}`);return o}function Ove(r,e,t,i,n){if(typeof t!=\"object\"||Array.isArray(t))throw new be(`Object configuration settings \"${e}\" must be an object`);let s=lk(r,i,{ignoreArrays:!0});if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=`${e}.${o}`;if(!i.properties[o])throw new be(`Unrecognized configuration settings found: ${e}.${o} - run \"yarn config -v\" to see the list of settings supported in Yarn`);s.set(o,Ak(r,l,a,i.properties[o],n))}return s}function Mve(r,e,t,i,n){let s=new Map;if(typeof t!=\"object\"||Array.isArray(t))throw new be(`Map configuration settings \"${e}\" must be an object`);if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,Ak(r,c,a,u,n))}return s}function lk(r,e,{ignoreArrays:t=!1}={}){switch(e.type){case\"SHAPE\":{if(e.isArray&&!t)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,lk(r,s));return i}break;case\"MAP\":return e.isArray&&!t?[]:new Map;case\"ABSOLUTE_PATH\":return e.default===null?null:r.projectCwd===null?x.isAbsolute(e.default)?x.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>x.resolve(r.projectCwd,i)):x.resolve(r.projectCwd,e.default);default:return e.default}}function Kw(r,e,t){if(e.type===\"SECRET\"&&typeof r==\"string\"&&t.hideSecrets)return Tve;if(e.type===\"ABSOLUTE_PATH\"&&typeof r==\"string\"&&t.getNativePaths)return U.fromPortablePath(r);if(e.isArray&&Array.isArray(r)){let i=[];for(let n of r)i.push(Kw(n,e,t));return i}if(e.type===\"MAP\"&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries())i.set(n,Kw(s,e.valueDefinition,t));return i}if(e.type===\"SHAPE\"&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries()){let o=e.properties[n];i.set(n,Kw(s,o,t))}return i}return r}function Uve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(Gw)&&(e=(0,dz.default)(e.slice(Gw.length)),r[e]=t);return r}function Hw(){let r=`${Gw}rc_filename`;for(let[e,t]of Object.entries(process.env))if(e.toLowerCase()===r&&typeof t==\"string\")return t;return sk}var ck=(i=>(i[i.LOCKFILE=0]=\"LOCKFILE\",i[i.MANIFEST=1]=\"MANIFEST\",i[i.NONE=2]=\"NONE\",i))(ck||{}),Ka=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,t,i){let n=new Ka(e);typeof t<\"u\"&&!(t instanceof Map)&&(n.projectCwd=t),n.importSettings(rk);let s=typeof i<\"u\"?i:t instanceof Map?t:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,t,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=Uve();delete a.rcFilename;let l=await Ka.findRcFiles(e),c=await Ka.findHomeRcFile();if(c){let B=l.find(v=>v.path===c.path);B?B.strict=!1:l.push({...c,strict:!1})}let u=({ignoreCwd:B,yarnPath:v,ignorePath:D,lockfileFilename:L})=>({ignoreCwd:B,yarnPath:v,ignorePath:D,lockfileFilename:L}),g=({ignoreCwd:B,yarnPath:v,ignorePath:D,lockfileFilename:L,...H})=>H,f=new Ka(e);f.importSettings(u(rk)),f.useWithSource(\"<environment>\",u(a),e,{strict:!1});for(let{path:B,cwd:v,data:D}of l)f.useWithSource(B,u(D),v,{strict:!1});if(s){let B=f.get(\"yarnPath\"),v=f.get(\"ignorePath\");if(B!==null&&!v)return f}let h=f.get(\"lockfileFilename\"),p;switch(i){case 0:p=await Ka.findProjectCwd(e,h);break;case 1:p=await Ka.findProjectCwd(e,null);break;case 2:M.existsSync(x.join(e,\"package.json\"))?p=x.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(rk));let C=new Map([[\"@@core\",SW]]),y=B=>\"default\"in B?B.default:B;if(t!==null){for(let L of t.plugins.keys())C.set(L,y(t.modules.get(L)));let B=new Map;for(let L of _D())B.set(L,()=>mf(L));for(let[L,H]of t.modules)B.set(L,()=>H);let v=new Set,D=async(L,H)=>{let{factory:j,name:$}=mf(L);if(v.has($))return;let V=new Map(B),W=A=>{if(V.has(A))return V.get(A)();throw new be(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},_=await df(async()=>y(await j(W)),A=>`${A} (when initializing ${$}, defined in ${H})`);B.set($,()=>_),v.add($),C.set($,_)};if(a.plugins)for(let L of a.plugins.split(\";\")){let H=x.resolve(e,U.toPortablePath(L));await D(H,\"<environment>\")}for(let{path:L,cwd:H,data:j}of l)if(!!o&&!!Array.isArray(j.plugins))for(let $ of j.plugins){let V=typeof $!=\"string\"?$.path:$,W=x.resolve(H,U.toPortablePath(V));await D(W,L)}}for(let[B,v]of C)f.activatePlugin(B,v);f.useWithSource(\"<environment>\",g(a),e,{strict:n});for(let{path:B,cwd:v,data:D,strict:L}of l)f.useWithSource(B,g(D),v,{strict:L!=null?L:n});return f.get(\"enableGlobalCache\")&&(f.values.set(\"cacheFolder\",`${f.get(\"globalFolder\")}/cache`),f.sources.set(\"cacheFolder\",\"<internal>\")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let t=Hw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=x.join(s,t);if(M.existsSync(o)){let a=await M.readFilePromise(o,\"utf8\"),l;try{l=yi(a)}catch{let u=\"\";throw a.match(/^\\s+(?!-)[^:]+\\s+\\S+/m)&&(u=\" (in particular, make sure you list the colons after each key name)\"),new be(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=x.dirname(s)}return i}static async findHomeRcFile(){let e=Hw(),t=hC(),i=x.join(t,e);if(M.existsSync(i)){let n=await M.readFilePromise(i,\"utf8\"),s=yi(n);return{path:i,cwd:t,data:s}}return null}static async findProjectCwd(e,t){let i=null,n=e,s=null;for(;n!==s;){if(s=n,M.existsSync(x.join(s,\"package.json\"))&&(i=s),t!==null){if(M.existsSync(x.join(s,t))){i=s;break}}else if(i!==null)break;n=x.dirname(s)}return i}static async updateConfiguration(e,t){let i=Hw(),n=x.join(e,i),s=M.existsSync(n)?yi(await M.readFilePromise(n,\"utf8\")):{},o=!1,a;if(typeof t==\"function\"){try{a=t(s)}catch{a=t({})}if(a===s)return}else{a=s;for(let l of Object.keys(t)){let c=s[l],u=t[l],g;if(typeof u==\"function\")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await M.changeFilePromise(n,Ba(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let t=hC();return await Ka.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),typeof t.configuration<\"u\"&&this.importSettings(t.configuration)}importSettings(e){for(let[t,i]of Object.entries(e))if(i!=null){if(this.settings.has(t))throw new Error(`Cannot redefine settings \"${t}\"`);this.settings.set(t,i),this.values.set(t,lk(this,i))}}useWithSource(e,t,i,n){try{this.use(e,t,i,n)}catch(s){throw s.message+=` (in ${$e(this,e,Ke.PATH)})`,s}}use(e,t,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get(\"enableStrictSettings\");for(let o of[\"enableStrictSettings\",...Object.keys(t)]){if(typeof t[o]>\"u\"||o===\"plugins\"||e===\"<environment>\"&&Lve.has(o))continue;if(o===\"rcFilename\")throw new be(`The rcFilename settings can only be set via ${`${Gw}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new be(`Unrecognized or legacy configuration settings found: ${o} - run \"yarn config -v\" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===\"MAP\"||l.isArray&&l.concatenateValues))continue;let c;try{c=Ak(this,o,t[o],l,i)}catch(u){throw u.message+=` in ${$e(this,e,Ke.PATH)}`,u}if(o===\"enableStrictSettings\"&&e!==\"<environment>\"){n=c;continue}if(l.type===\"MAP\"){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key \"${e}\"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s>\"u\")throw new be(`Couldn't find a configuration settings named \"${e}\"`);return Kw(n,s,{hideSecrets:t,getNativePaths:i})}getSubprocessStreams(e,{header:t,prefix:i,report:n}){let s,o,a=M.createWriteStream(e);if(this.get(\"enableInlineBuilds\")){let l=n.createStreamReporter(`${i} ${$e(this,\"STDOUT\",\"green\")}`),c=n.createStreamReporter(`${i} ${$e(this,\"STDERR\",\"red\")}`);s=new nk.PassThrough,s.pipe(l),s.pipe(a),o=new nk.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof t<\"u\"&&s.write(`${t}\n`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let t of this.plugins.values())for(let i of t.resolvers||[])e.push(new i);return new kf([new fC,new jr,new Nw,...e])}makeFetcher(){let e=[];for(let t of this.plugins.values())for(let i of t.fetchers||[])e.push(new i);return new Df([new Ff,new Lf,...e])}getLinkers(){let e=[];for(let t of this.plugins.values())for(let i of t.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=pC(),t=this.get(\"supportedArchitectures\"),i=t.get(\"os\");i!==null&&(i=i.map(o=>o===\"current\"?e.os:o));let n=t.get(\"cpu\");n!==null&&(n=n.map(o=>o===\"current\"?e.cpu:o));let s=t.get(\"libc\");return s!==null&&(s=Ko(s,o=>{var a;return o===\"current\"?(a=e.libc)!=null?a:Ko.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,t=(i,n,{userProvided:s=!1}={})=>{if(!so(i.range))throw new Error(\"Only semver ranges are allowed as keys for the packageExtensions setting\");let o=new ot;o.load(n,{yamlCompatibilityMode:!0});let a=hf(e,i.identHash),l=[];a.push([i.range,l]);let c={status:\"inactive\",userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push({...c,type:\"Dependency\",descriptor:u});for(let u of o.peerDependencies.values())l.push({...c,type:\"PeerDependency\",descriptor:u});for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push({...c,type:\"PeerDependencyMeta\",selector:u,key:f,value:h})};await this.triggerHook(i=>i.registerPackageExtensions,this,t);for(let[i,n]of this.get(\"packageExtensions\"))t(WA(i,!0),Jy(n),{userProvided:!0})}normalizePackage(e){let t=rC(e);if(this.packageExtensions==null)throw new Error(\"refreshPackageExtensions has to be called before normalizing packages\");let i=this.packageExtensions.get(e.identHash);if(typeof i<\"u\"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!kc(s,o))for(let l of a)switch(l.status===\"inactive\"&&(l.status=\"redundant\"),l.type){case\"Dependency\":typeof t.dependencies.get(l.descriptor.identHash)>\"u\"&&(l.status=\"active\",t.dependencies.set(l.descriptor.identHash,l.descriptor));break;case\"PeerDependency\":typeof t.peerDependencies.get(l.descriptor.identHash)>\"u\"&&(l.status=\"active\",t.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case\"PeerDependencyMeta\":{let c=t.peerDependenciesMeta.get(l.selector);(typeof c>\"u\"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=\"active\",Na(t.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:qx(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of t.peerDependenciesMeta.keys()){let o=en(s);t.peerDependencies.has(o.identHash)||t.peerDependencies.set(o.identHash,_t(o,\"*\"))}for(let s of t.peerDependencies.values()){if(s.scope===\"types\")continue;let o=n(s),a=qo(\"types\",o),l=Ot(a);t.peerDependencies.has(a.identHash)||t.peerDependenciesMeta.has(l)||(t.peerDependencies.set(a.identHash,_t(a,\"*\")),t.peerDependenciesMeta.set(l,{optional:!0}))}return t.dependencies=new Map(Bn(t.dependencies,([,s])=>bn(s))),t.peerDependencies=new Map(Bn(t.peerDependencies,([,s])=>bn(s))),t}getLimit(e){return Na(this.limits,e,()=>(0,Cz.default)(this.get(e)))}async triggerHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...t)}}async triggerMultipleHooks(e,t){for(let i of t)await this.triggerHook(e,...i)}async reduceHook(e,t,...i){let n=t;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...t);if(typeof o<\"u\")return o}return null}},ye=Ka;ye.telemetry=null;var hk=(i=>(i[i.Never=0]=\"Never\",i[i.ErrorCode=1]=\"ErrorCode\",i[i.Always=2]=\"Always\",i))(hk||{}),dC=class extends at{constructor({fileName:t,code:i,signal:n}){let s=ye.create(x.cwd()),o=$e(s,t,Ke.PATH);super(1,`Child ${o} reported an error`,a=>{Hve(i,n,{configuration:s,report:a})});this.code=pk(i,n)}},Yw=class extends dC{constructor({fileName:t,code:i,signal:n,stdout:s,stderr:o}){super({fileName:t,code:i,signal:n});this.stdout=s,this.stderr=o}};function Nc(r){return r!==null&&typeof r.fd==\"number\"}var Lc=new Set;function uk(){}function gk(){for(let r of Lc)r.kill()}async function Wo(r,e,{cwd:t,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=[\"pipe\",\"pipe\",\"pipe\"];s===null?c[0]=\"ignore\":Nc(s)&&(c[0]=s),Nc(o)&&(c[1]=o),Nc(a)&&(c[2]=a);let u=(0,fk.default)(r,e,{cwd:U.fromPortablePath(t),env:{...i,PWD:U.fromPortablePath(t)},stdio:c});Lc.add(u),Lc.size===1&&(process.on(\"SIGINT\",uk),process.on(\"SIGTERM\",gk)),!Nc(s)&&s!==null&&s.pipe(u.stdin),Nc(o)||u.stdout.pipe(o,{end:!1}),Nc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))Nc(f)||f.end()};return new Promise((f,h)=>{u.on(\"error\",p=>{Lc.delete(u),Lc.size===0&&(process.off(\"SIGINT\",uk),process.off(\"SIGTERM\",gk)),(l===2||l===1)&&g(),h(p)}),u.on(\"close\",(p,C)=>{Lc.delete(u),Lc.size===0&&(process.off(\"SIGINT\",uk),process.off(\"SIGTERM\",gk)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:pk(p,C)}):h(new dC({fileName:r,code:p,signal:C}))})})}async function tk(r,e,{cwd:t,env:i=process.env,encoding:n=\"utf8\",strict:s=!1}){let o=[\"ignore\",\"pipe\",\"pipe\"],a=[],l=[],c=U.fromPortablePath(t);typeof i.PWD<\"u\"&&(i={...i,PWD:c});let u=(0,fk.default)(r,e,{cwd:c,env:i,stdio:o});return u.stdout.on(\"data\",g=>{a.push(g)}),u.stderr.on(\"data\",g=>{l.push(g)}),await new Promise((g,f)=>{u.on(\"error\",h=>{let p=ye.create(t),C=$e(p,r,Ke.PATH);f(new at(1,`Process ${C} failed to spawn`,y=>{y.reportError(1,`  ${Ho(p,{label:\"Thrown Error\",value:no(Ke.NO_HINT,h.message)})}`)}))}),u.on(\"close\",(h,p)=>{let C=n===\"buffer\"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n===\"buffer\"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:pk(h,p),stdout:C,stderr:y}):f(new Yw({fileName:r,code:h,signal:p,stdout:C,stderr:y}))})})}var Kve=new Map([[\"SIGINT\",2],[\"SIGQUIT\",3],[\"SIGKILL\",9],[\"SIGTERM\",15]]);function pk(r,e){let t=Kve.get(e);return typeof t<\"u\"?128+t:r!=null?r:1}function Hve(r,e,{configuration:t,report:i}){i.reportError(1,`  ${Ho(t,r!==null?{label:\"Exit Code\",value:no(Ke.NUMBER,r)}:{label:\"Exit Signal\",value:no(Ke.CODE,e)})}`)}var Xt={};ut(Xt,{Method:()=>_6,RequestError:()=>$6.RequestError,del:()=>eke,get:()=>_De,getNetworkSettings:()=>Z6,post:()=>kR,put:()=>$De,request:()=>vC});var z6=Pe(CB()),V6=J(\"https\"),X6=J(\"http\"),DR=Pe(wn()),PR=Pe(j6()),mB=J(\"url\");var $6=Pe(CB()),q6=new Map,J6=new Map,VDe=new X6.Agent({keepAlive:!0}),XDe=new V6.Agent({keepAlive:!0});function W6(r){let e=new mB.URL(r),t={host:e.hostname,headers:{}};return e.port&&(t.port=Number(e.port)),{proxy:t}}async function xR(r){return Na(J6,r,()=>M.readFilePromise(r).then(e=>(J6.set(r,e),e)))}function ZDe({statusCode:r,statusMessage:e},t){let i=$e(t,r,Ke.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${r}`;return If(t,`${i}${e?` (${e})`:\"\"}`,n)}async function EB(r,{configuration:e,customErrorMessage:t}){var i,n;try{return await r}catch(s){if(s.name!==\"HTTPError\")throw s;let o=(n=t==null?void 0:t(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith(\"Response code\")?o=\"The remote server failed to provide the requested resource\":o=s.message),s instanceof z6.TimeoutError&&s.event===\"socket\"&&(o+=`(can be increased via ${$e(e,\"httpTimeout\",Ke.SETTING)})`);let a=new at(35,o,l=>{s.response&&l.reportError(35,`  ${Ho(e,{label:\"Response Code\",value:no(Ke.NO_HINT,ZDe(s.response,e))})}`),s.request&&(l.reportError(35,`  ${Ho(e,{label:\"Request Method\",value:no(Ke.NO_HINT,s.request.options.method)})}`),l.reportError(35,`  ${Ho(e,{label:\"Request URL\",value:no(Ke.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(35,`  ${Ho(e,{label:\"Request Redirects\",value:no(Ke.NO_HINT,tP(e,s.request.redirects,Ke.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(35,`  ${Ho(e,{label:\"Request Retry Count\",value:no(Ke.NO_HINT,`${$e(e,s.request.retryCount,Ke.NUMBER)} (can be increased via ${$e(e,\"httpRetry\",Ke.SETTING)})`)})}`)});throw a.originalError=s,a}}function Z6(r,e){let t=[...e.configuration.get(\"networkSettings\")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof r==\"string\"?new mB.URL(r):r;for(let[o,a]of t)if(DR.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]>\"u\"&&(i[l]=c)}for(let o of n)typeof i[o]>\"u\"&&(i[o]=e.configuration.get(o));return i}var _6=(n=>(n.GET=\"GET\",n.PUT=\"PUT\",n.POST=\"POST\",n.DELETE=\"DELETE\",n))(_6||{});async function vC(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=\"GET\"}){let a=async()=>await tke(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await t.reduceHook(c=>c.wrapNetworkRequest,a,{target:r,body:e,configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function _De(r,{configuration:e,jsonResponse:t,...i}){let n=Na(q6,r,()=>EB(vC(r,null,{configuration:e,...i}),{configuration:e}).then(s=>(q6.set(r,s.body),s.body)));return Buffer.isBuffer(n)===!1&&(n=await n),t?JSON.parse(n.toString()):n}async function $De(r,e,{customErrorMessage:t,...i}){return(await EB(vC(r,e,{...i,method:\"PUT\"}),i)).body}async function kR(r,e,{customErrorMessage:t,...i}){return(await EB(vC(r,e,{...i,method:\"POST\"}),i)).body}async function eke(r,{customErrorMessage:e,...t}){return(await EB(vC(r,null,{...t,method:\"DELETE\"}),t)).body}async function tke(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=\"GET\"}){let a=typeof r==\"string\"?new mB.URL(r):r,l=Z6(a,{configuration:t});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol===\"http:\"&&!DR.default.isMatch(a.hostname,t.get(\"unsafeHttpWhitelist\")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?PR.default.httpOverHttp(W6(l.httpProxy)):VDe,https:l.httpsProxy?PR.default.httpsOverHttp(W6(l.httpsProxy)):XDe},headers:i,method:o};u.responseType=s?\"json\":\"buffer\",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e==\"string\"?u.body=e:u.json=e);let g=t.get(\"httpTimeout\"),f=t.get(\"httpRetry\"),h=t.get(\"enableStrictSsl\"),p=l.caFilePath,C=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:B}=await Promise.resolve().then(()=>Pe(CB())),v=p?await xR(p):void 0,D=C?await xR(C):void 0,L=y?await xR(y):void 0,H=B.extend({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:v,certificate:D,key:L},...u});return t.getLimit(\"networkConcurrency\")(()=>H(a))}var Wt={};ut(Wt,{PackageManager:()=>u9,detectPackageManager:()=>g9,executePackageAccessibleBinary:()=>C9,executePackageScript:()=>LB,executePackageShellcode:()=>JR,executeWorkspaceAccessibleBinary:()=>IRe,executeWorkspaceLifecycleScript:()=>p9,executeWorkspaceScript:()=>h9,getPackageAccessibleBinaries:()=>TB,getWorkspaceAccessibleBinaries:()=>d9,hasPackageScript:()=>CRe,hasWorkspaceScript:()=>WR,makeScriptEnv:()=>FC,maybeExecuteWorkspaceLifecycleScript:()=>ERe,prepareExternalProject:()=>dRe});var xC={};ut(xC,{getLibzipPromise:()=>on,getLibzipSync:()=>sV});var nV=Pe(tV());var qa=[\"number\",\"number\"],rV=(F=>(F[F.ZIP_ER_OK=0]=\"ZIP_ER_OK\",F[F.ZIP_ER_MULTIDISK=1]=\"ZIP_ER_MULTIDISK\",F[F.ZIP_ER_RENAME=2]=\"ZIP_ER_RENAME\",F[F.ZIP_ER_CLOSE=3]=\"ZIP_ER_CLOSE\",F[F.ZIP_ER_SEEK=4]=\"ZIP_ER_SEEK\",F[F.ZIP_ER_READ=5]=\"ZIP_ER_READ\",F[F.ZIP_ER_WRITE=6]=\"ZIP_ER_WRITE\",F[F.ZIP_ER_CRC=7]=\"ZIP_ER_CRC\",F[F.ZIP_ER_ZIPCLOSED=8]=\"ZIP_ER_ZIPCLOSED\",F[F.ZIP_ER_NOENT=9]=\"ZIP_ER_NOENT\",F[F.ZIP_ER_EXISTS=10]=\"ZIP_ER_EXISTS\",F[F.ZIP_ER_OPEN=11]=\"ZIP_ER_OPEN\",F[F.ZIP_ER_TMPOPEN=12]=\"ZIP_ER_TMPOPEN\",F[F.ZIP_ER_ZLIB=13]=\"ZIP_ER_ZLIB\",F[F.ZIP_ER_MEMORY=14]=\"ZIP_ER_MEMORY\",F[F.ZIP_ER_CHANGED=15]=\"ZIP_ER_CHANGED\",F[F.ZIP_ER_COMPNOTSUPP=16]=\"ZIP_ER_COMPNOTSUPP\",F[F.ZIP_ER_EOF=17]=\"ZIP_ER_EOF\",F[F.ZIP_ER_INVAL=18]=\"ZIP_ER_INVAL\",F[F.ZIP_ER_NOZIP=19]=\"ZIP_ER_NOZIP\",F[F.ZIP_ER_INTERNAL=20]=\"ZIP_ER_INTERNAL\",F[F.ZIP_ER_INCONS=21]=\"ZIP_ER_INCONS\",F[F.ZIP_ER_REMOVE=22]=\"ZIP_ER_REMOVE\",F[F.ZIP_ER_DELETED=23]=\"ZIP_ER_DELETED\",F[F.ZIP_ER_ENCRNOTSUPP=24]=\"ZIP_ER_ENCRNOTSUPP\",F[F.ZIP_ER_RDONLY=25]=\"ZIP_ER_RDONLY\",F[F.ZIP_ER_NOPASSWD=26]=\"ZIP_ER_NOPASSWD\",F[F.ZIP_ER_WRONGPASSWD=27]=\"ZIP_ER_WRONGPASSWD\",F[F.ZIP_ER_OPNOTSUPP=28]=\"ZIP_ER_OPNOTSUPP\",F[F.ZIP_ER_INUSE=29]=\"ZIP_ER_INUSE\",F[F.ZIP_ER_TELL=30]=\"ZIP_ER_TELL\",F[F.ZIP_ER_COMPRESSED_DATA=31]=\"ZIP_ER_COMPRESSED_DATA\",F))(rV||{}),iV=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:rV,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:r._malloc(1),uint16S:r._malloc(2),uint32S:r._malloc(4),uint64S:r._malloc(8),malloc:r._malloc,free:r._free,getValue:r.getValue,open:r.cwrap(\"zip_open\",\"number\",[\"string\",\"number\",\"number\"]),openFromSource:r.cwrap(\"zip_open_from_source\",\"number\",[\"number\",\"number\",\"number\"]),close:r.cwrap(\"zip_close\",\"number\",[\"number\"]),discard:r.cwrap(\"zip_discard\",null,[\"number\"]),getError:r.cwrap(\"zip_get_error\",\"number\",[\"number\"]),getName:r.cwrap(\"zip_get_name\",\"string\",[\"number\",\"number\",\"number\"]),getNumEntries:r.cwrap(\"zip_get_num_entries\",\"number\",[\"number\",\"number\"]),delete:r.cwrap(\"zip_delete\",\"number\",[\"number\",\"number\"]),stat:r.cwrap(\"zip_stat\",\"number\",[\"number\",\"string\",\"number\",\"number\"]),statIndex:r.cwrap(\"zip_stat_index\",\"number\",[\"number\",...qa,\"number\",\"number\"]),fopen:r.cwrap(\"zip_fopen\",\"number\",[\"number\",\"string\",\"number\"]),fopenIndex:r.cwrap(\"zip_fopen_index\",\"number\",[\"number\",...qa,\"number\"]),fread:r.cwrap(\"zip_fread\",\"number\",[\"number\",\"number\",\"number\",\"number\"]),fclose:r.cwrap(\"zip_fclose\",\"number\",[\"number\"]),dir:{add:r.cwrap(\"zip_dir_add\",\"number\",[\"number\",\"string\"])},file:{add:r.cwrap(\"zip_file_add\",\"number\",[\"number\",\"string\",\"number\",\"number\"]),getError:r.cwrap(\"zip_file_get_error\",\"number\",[\"number\"]),getExternalAttributes:r.cwrap(\"zip_file_get_external_attributes\",\"number\",[\"number\",...qa,\"number\",\"number\",\"number\"]),setExternalAttributes:r.cwrap(\"zip_file_set_external_attributes\",\"number\",[\"number\",...qa,\"number\",\"number\",\"number\"]),setMtime:r.cwrap(\"zip_file_set_mtime\",\"number\",[\"number\",...qa,\"number\",\"number\"]),setCompression:r.cwrap(\"zip_set_file_compression\",\"number\",[\"number\",...qa,\"number\",\"number\"])},ext:{countSymlinks:r.cwrap(\"zip_ext_count_symlinks\",\"number\",[\"number\"])},error:{initWithCode:r.cwrap(\"zip_error_init_with_code\",null,[\"number\",\"number\"]),strerror:r.cwrap(\"zip_error_strerror\",\"string\",[\"number\"])},name:{locate:r.cwrap(\"zip_name_locate\",\"number\",[\"number\",\"string\",\"number\"])},source:{fromUnattachedBuffer:r.cwrap(\"zip_source_buffer_create\",\"number\",[\"number\",...qa,\"number\",\"number\"]),fromBuffer:r.cwrap(\"zip_source_buffer\",\"number\",[\"number\",\"number\",...qa,\"number\"]),free:r.cwrap(\"zip_source_free\",null,[\"number\"]),keep:r.cwrap(\"zip_source_keep\",null,[\"number\"]),open:r.cwrap(\"zip_source_open\",\"number\",[\"number\"]),close:r.cwrap(\"zip_source_close\",\"number\",[\"number\"]),seek:r.cwrap(\"zip_source_seek\",\"number\",[\"number\",...qa,\"number\"]),tell:r.cwrap(\"zip_source_tell\",\"number\",[\"number\"]),read:r.cwrap(\"zip_source_read\",\"number\",[\"number\",\"number\",\"number\"]),error:r.cwrap(\"zip_source_error\",\"number\",[\"number\"]),setMtime:r.cwrap(\"zip_source_set_mtime\",\"number\",[\"number\",\"number\"])},struct:{stat:r.cwrap(\"zipstruct_stat\",\"number\",[]),statS:r.cwrap(\"zipstruct_statS\",\"number\",[]),statName:r.cwrap(\"zipstruct_stat_name\",\"string\",[\"number\"]),statIndex:r.cwrap(\"zipstruct_stat_index\",\"number\",[\"number\"]),statSize:r.cwrap(\"zipstruct_stat_size\",\"number\",[\"number\"]),statCompSize:r.cwrap(\"zipstruct_stat_comp_size\",\"number\",[\"number\"]),statCompMethod:r.cwrap(\"zipstruct_stat_comp_method\",\"number\",[\"number\"]),statMtime:r.cwrap(\"zipstruct_stat_mtime\",\"number\",[\"number\"]),statCrc:r.cwrap(\"zipstruct_stat_crc\",\"number\",[\"number\"]),error:r.cwrap(\"zipstruct_error\",\"number\",[]),errorS:r.cwrap(\"zipstruct_errorS\",\"number\",[]),errorCodeZip:r.cwrap(\"zipstruct_error_code_zip\",\"number\",[\"number\"])}});var NR=null;function sV(){return NR===null&&(NR=iV((0,nV.default)())),NR}async function on(){return sV()}var RC={};ut(RC,{ShellError:()=>Wn,execute:()=>xB,globUtils:()=>BB});var EV=Pe(wx()),IV=J(\"os\"),zn=J(\"stream\"),yV=J(\"util\");var Wn=class extends Error{constructor(e){super(e),this.name=\"ShellError\"}};var BB={};ut(BB,{fastGlobOptions:()=>AV,isBraceExpansion:()=>LR,isGlobPattern:()=>rke,match:()=>ike,micromatchOptions:()=>wB});var oV=Pe(dw()),aV=Pe(J(\"fs\")),yB=Pe(wn()),wB={strictBrackets:!0},AV={onlyDirectories:!1,onlyFiles:!1};function rke(r){if(!yB.default.scan(r,wB).isGlob)return!1;try{yB.default.parse(r,wB)}catch{return!1}return!0}function ike(r,{cwd:e,baseFs:t}){return(0,oV.default)(r,{...AV,cwd:U.fromPortablePath(e),fs:AI(aV.default,new vg(t))})}function LR(r){return yB.default.scan(r,wB).isBrace}var cV=Pe(LS()),Vo=J(\"stream\"),uV=J(\"string_decoder\");var Mc=new Set;function TR(){}function OR(){for(let r of Mc)r.kill()}function gV(r,e,t,i){return n=>{let s=n[0]instanceof Vo.Transform?\"pipe\":n[0],o=n[1]instanceof Vo.Transform?\"pipe\":n[1],a=n[2]instanceof Vo.Transform?\"pipe\":n[2],l=(0,cV.default)(r,e,{...i,stdio:[s,o,a]});return Mc.add(l),Mc.size===1&&(process.on(\"SIGINT\",TR),process.on(\"SIGTERM\",OR)),n[0]instanceof Vo.Transform&&n[0].pipe(l.stdin),n[1]instanceof Vo.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof Vo.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on(\"error\",u=>{switch(Mc.delete(l),Mc.size===0&&(process.off(\"SIGINT\",TR),process.off(\"SIGTERM\",OR)),u.code){case\"ENOENT\":n[2].write(`command not found: ${r}\n`),c(127);break;case\"EACCES\":n[2].write(`permission denied: ${r}\n`),c(128);break;default:n[2].write(`uncaught error: ${u.message}\n`),c(1);break}}),l.on(\"close\",u=>{Mc.delete(l),Mc.size===0&&(process.off(\"SIGINT\",TR),process.off(\"SIGTERM\",OR)),c(u!==null?u:129)})})}}}function fV(r){return e=>{let t=e[0]===\"pipe\"?new Vo.PassThrough:e[0];return{stdin:t,promise:Promise.resolve().then(()=>r({stdin:t,stdout:e[1],stderr:e[2]}))}}}var Ss=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},MR=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");return this.stream}},zf=class{constructor(e,t){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:i,stderr:n}){let s=new zf(null,e);return s.stdin=t,s.stdout=i,s.stderr=n,s}pipeTo(e,t=1){let i=new zf(this,e),n=new MR;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(t&1)===1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(t&2)===2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=[\"ignore\",\"ignore\",\"ignore\"];if(this.pipe)e[0]=\"pipe\";else{if(this.stdin===null)throw new Error(\"Assertion failed: No input stream registered\");e[0]=this.stdin.get()}let t;if(this.stdout===null)throw new Error(\"Assertion failed: No output stream registered\");t=this.stdout,e[1]=t.get();let i;if(this.stderr===null)throw new Error(\"Assertion failed: No error stream registered\");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(t.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function QB(r,e){return zf.start(r,e)}function lV(r,e=null){let t=new Vo.PassThrough,i=new uV.StringDecoder,n=\"\";return t.on(\"data\",s=>{let o=i.write(s),a;do if(a=o.indexOf(`\n`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n=\"\",r(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),t.on(\"end\",()=>{let s=i.end();s!==\"\"&&r(e!==null?`${e} ${s}`:s)}),t}function hV(r,{prefix:e}){return{stdout:lV(t=>r.stdout.write(`${t}\n`),r.stdout.isTTY?e:null),stderr:lV(t=>r.stderr.write(`${t}\n`),r.stderr.isTTY?e:null)}}var nke=(0,yV.promisify)(setTimeout);function pV(r,e,t){let i=new zn.PassThrough({autoDestroy:!0});switch(r){case 0:(e&1)===1&&t.stdin.pipe(i,{end:!1}),(e&2)===2&&t.stdin instanceof zn.Writable&&i.pipe(t.stdin,{end:!1});break;case 1:(e&1)===1&&t.stdout.pipe(i,{end:!1}),(e&2)===2&&i.pipe(t.stdout,{end:!1});break;case 2:(e&1)===1&&t.stderr.pipe(i,{end:!1}),(e&2)===2&&i.pipe(t.stderr,{end:!1});break;default:throw new Wn(`Bad file descriptor: \"${r}\"`)}return i}function SB(r,e={}){let t={...r,...e};return t.environment={...r.environment,...e.environment},t.variables={...r.variables,...e.variables},t}var ske=new Map([[\"cd\",async([r=(0,IV.homedir)(),...e],t,i)=>{let n=x.resolve(i.cwd,U.toPortablePath(r));if(!(await t.baseFs.statPromise(n).catch(o=>{throw o.code===\"ENOENT\"?new Wn(`cd: no such file or directory: ${r}`):o})).isDirectory())throw new Wn(`cd: not a directory: ${r}`);return i.cwd=n,0}],[\"pwd\",async(r,e,t)=>(t.stdout.write(`${U.fromPortablePath(t.cwd)}\n`),0)],[\":\",async(r,e,t)=>0],[\"true\",async(r,e,t)=>0],[\"false\",async(r,e,t)=>1],[\"exit\",async([r,...e],t,i)=>i.exitCode=parseInt(r!=null?r:i.variables[\"?\"],10)],[\"echo\",async(r,e,t)=>(t.stdout.write(`${r.join(\" \")}\n`),0)],[\"sleep\",async([r],e,t)=>{if(typeof r>\"u\")throw new Wn(\"sleep: missing operand\");let i=Number(r);if(Number.isNaN(i))throw new Wn(`sleep: invalid time interval '${r}'`);return await nke(1e3*i,0)}],[\"__ysh_run_procedure\",async(r,e,t)=>{let i=t.procedures[r[0]];return await QB(i,{stdin:new Ss(t.stdin),stdout:new Ss(t.stdout),stderr:new Ss(t.stderr)}).run()}],[\"__ysh_set_redirects\",async(r,e,t)=>{let i=t.stdin,n=t.stdout,s=t.stderr,o=[],a=[],l=[],c=0;for(;r[c]!==\"--\";){let g=r[c++],{type:f,fd:h}=JSON.parse(g),p=v=>{switch(h){case null:case 0:o.push(v);break;default:throw new Error(`Unsupported file descriptor: \"${h}\"`)}},C=v=>{switch(h){case null:case 1:a.push(v);break;case 2:l.push(v);break;default:throw new Error(`Unsupported file descriptor: \"${h}\"`)}},y=Number(r[c++]),B=c+y;for(let v=c;v<B;++c,++v)switch(f){case\"<\":p(()=>e.baseFs.createReadStream(x.resolve(t.cwd,U.toPortablePath(r[v]))));break;case\"<<<\":p(()=>{let D=new zn.PassThrough;return process.nextTick(()=>{D.write(`${r[v]}\n`),D.end()}),D});break;case\"<&\":p(()=>pV(Number(r[v]),1,t));break;case\">\":case\">>\":{let D=x.resolve(t.cwd,U.toPortablePath(r[v]));C(D===\"/dev/null\"?new zn.Writable({autoDestroy:!0,emitClose:!0,write(L,H,j){setImmediate(j)}}):e.baseFs.createWriteStream(D,f===\">>\"?{flags:\"a\"}:void 0))}break;case\">&\":C(pV(Number(r[v]),2,t));break;default:throw new Error(`Assertion failed: Unsupported redirection type: \"${f}\"`)}}if(o.length>0){let g=new zn.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on(\"end\",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new zn.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new zn.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await QB(DC(r.slice(c+1),e,t),{stdin:new Ss(i),stdout:new Ss(n),stderr:new Ss(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on(\"error\",p=>{h(p)}),g.on(\"close\",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on(\"error\",p=>{h(p)}),g.on(\"close\",()=>{f()}),g.end()}))),u}]]);async function oke(r,e,t){let i=[],n=new zn.PassThrough;return n.on(\"data\",s=>i.push(s)),await vB(r,e,SB(t,{stdout:n})),Buffer.concat(i).toString().replace(/[\\r\\n]+$/,\"\")}async function dV(r,e,t){let i=r.map(async s=>{let o=await Uc(s.args,e,t);return{name:s.name,value:o.join(\" \")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function bB(r){return r.match(/[^ \\r\\n\\t]+/g)||[]}async function wV(r,e,t,i,n=i){switch(r.name){case\"$\":i(String(process.pid));break;case\"#\":i(String(e.args.length));break;case\"@\":if(r.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=bB(s);for(let a=0;a<o.length-1;++a)n(o[a]);i(o[o.length-1])}break;case\"*\":{let s=e.args.join(\" \");if(r.quoted)i(s);else for(let o of bB(s))n(o)}break;case\"PPID\":i(String(process.ppid));break;case\"RANDOM\":i(String(Math.floor(Math.random()*32768)));break;default:{let s=parseInt(r.name,10),o,a=Number.isFinite(s);if(a?s>=0&&s<e.args.length&&(o=e.args[s]):Object.prototype.hasOwnProperty.call(t.variables,r.name)?o=t.variables[r.name]:Object.prototype.hasOwnProperty.call(t.environment,r.name)&&(o=t.environment[r.name]),typeof o<\"u\"&&r.alternativeValue?o=(await Uc(r.alternativeValue,e,t)).join(\" \"):typeof o>\"u\"&&(r.defaultValue?o=(await Uc(r.defaultValue,e,t)).join(\" \"):r.alternativeValue&&(o=\"\")),typeof o>\"u\")throw a?new Wn(`Unbound argument #${s}`):new Wn(`Unbound variable \"${r.name}\"`);if(r.quoted)i(o);else{let l=bB(o);for(let u=0;u<l.length-1;++u)n(l[u]);let c=l[l.length-1];typeof c<\"u\"&&i(c)}}break}}var ake={addition:(r,e)=>r+e,subtraction:(r,e)=>r-e,multiplication:(r,e)=>r*e,division:(r,e)=>Math.trunc(r/e)};async function PC(r,e,t){if(r.type===\"number\"){if(Number.isInteger(r.value))return r.value;throw new Error(`Invalid number: \"${r.value}\", only integers are allowed`)}else if(r.type===\"variable\"){let i=[];await wV({...r,quoted:!0},e,t,s=>i.push(s));let n=Number(i.join(\" \"));return Number.isNaN(n)?PC({type:\"variable\",name:i.join(\" \")},e,t):PC({type:\"number\",value:n},e,t)}else return ake[r.type](await PC(r.left,e,t),await PC(r.right,e,t))}async function Uc(r,e,t){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join(\"\")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p>\"u\"&&i.set(h,p=[]),p.push(f)};for(let u of r){let g=!1;switch(u.type){case\"redirection\":{let f=await Uc(u.args,e,t);for(let h of f)c(u.subtype,u.fd,h)}break;case\"argument\":for(let f of u.segments)switch(f.type){case\"text\":o(f.text);break;case\"glob\":o(f.pattern),g=!0;break;case\"shell\":{let h=await oke(f.shell,e,t);if(f.quoted)o(h);else{let p=bB(h);for(let C=0;C<p.length-1;++C)l(p[C]);o(p[p.length-1])}}break;case\"variable\":await wV(f,e,t,o,l);break;case\"arithmetic\":o(String(await PC(f.arithmetic,e,t)));break}break}if(a(),g){let f=n.pop();if(typeof f>\"u\")throw new Error(\"Assertion failed: Expected a glob pattern to have been set\");let h=await e.glob.match(f,{cwd:t.cwd,baseFs:e.baseFs});if(h.length===0){let p=LR(f)?\". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22\":\"\";throw new Wn(`No matches found: \"${f}\"${p}`)}for(let p of h.sort())l(p)}}if(i.size>0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,\"__ysh_set_redirects\",...u,\"--\")}return n}function DC(r,e,t){e.builtins.has(r[0])||(r=[\"command\",...r]);let i=U.fromPortablePath(t.cwd),n=t.environment;typeof n.PWD<\"u\"&&(n={...n,PWD:i});let[s,...o]=r;if(s===\"command\")return gV(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a>\"u\")throw new Error(`Assertion failed: A builtin should exist for \"${s}\"`);return fV(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=t;t.stdin=l,t.stdout=c,t.stderr=u;try{return await a(o,e,t)}finally{t.stdin=g,t.stdout=f,t.stderr=h}})}function Ake(r,e,t){return i=>{let n=new zn.PassThrough,s=vB(r,e,SB(t,{stdin:n}));return{stdin:n,promise:s}}}function lke(r,e,t){return i=>{let n=new zn.PassThrough,s=vB(r,e,t);return{stdin:n,promise:s}}}function CV(r,e,t,i){if(e.length===0)return r;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures={...i.procedures},i.procedures[n]=r,DC([...e,\"__ysh_run_procedure\",n],t,i)}}async function mV(r,e,t){let i=r,n=null,s=null;for(;i;){let o=i.then?{...t}:t,a;switch(i.type){case\"command\":{let l=await Uc(i.args,e,t),c=await dV(i.envs,e,t);a=i.envs.length?DC(l,e,SB(o,{environment:c})):DC(l,e,o)}break;case\"subshell\":{let l=await Uc(i.args,e,t),c=Ake(i.subshell,e,o);a=CV(c,l,e,o)}break;case\"group\":{let l=await Uc(i.args,e,t),c=lke(i.group,e,o);a=CV(c,l,e,o)}break;case\"envs\":{let l=await dV(i.envs,e,t);o.environment={...o.environment,...l},a=DC([\"true\"],e,o)}break}if(typeof a>\"u\")throw new Error(\"Assertion failed: An action should have been generated\");if(n===null)s=QB(a,{stdin:new Ss(o.stdin),stdout:new Ss(o.stdout),stderr:new Ss(o.stderr)});else{if(s===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");switch(n){case\"|\":s=s.pipeTo(a,1);break;case\"|&\":s=s.pipeTo(a,3);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");return await s.run()}async function cke(r,e,t,{background:i=!1}={}){function n(s){let o=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],a=o[s%o.length];return EV.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=hV(t,{prefix:l});return t.backgroundJobs.push(mV(r,e,SB(t,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message}\n`)).finally(()=>{t.stdout.isTTY&&t.stdout.write(`Job ${l}, '${o(Fg(r))}' has ended\n`)})),0}return await mV(r,e,t)}async function uke(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables[\"?\"]=String(a)},o=async a=>{try{return await cke(a.chain,e,t,{background:i&&typeof a.then>\"u\"})}catch(l){if(!(l instanceof Wn))throw l;return t.stderr.write(`${l.message}\n`),1}};for(s(await o(r));r.then;){if(t.exitCode!==null)return t.exitCode;switch(r.then.type){case\"&&\":n===0&&s(await o(r.then.line));break;case\"||\":n!==0&&s(await o(r.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: \"${r.then.type}\"`)}r=r.then.line}return n}async function vB(r,e,t){let i=t.backgroundJobs;t.backgroundJobs=[];let n=0;for(let{command:s,type:o}of r){if(n=await uke(s,e,t,{background:o===\"&\"}),t.exitCode!==null)return t.exitCode;t.variables[\"?\"]=String(n)}return await Promise.all(t.backgroundJobs),t.backgroundJobs=i,n}function BV(r){switch(r.type){case\"variable\":return r.name===\"@\"||r.name===\"#\"||r.name===\"*\"||Number.isFinite(parseInt(r.name,10))||\"defaultValue\"in r&&!!r.defaultValue&&r.defaultValue.some(e=>kC(e))||\"alternativeValue\"in r&&!!r.alternativeValue&&r.alternativeValue.some(e=>kC(e));case\"arithmetic\":return UR(r.arithmetic);case\"shell\":return KR(r.shell);default:return!1}}function kC(r){switch(r.type){case\"redirection\":return r.args.some(e=>kC(e));case\"argument\":return r.segments.some(e=>BV(e));default:throw new Error(`Assertion failed: Unsupported argument type: \"${r.type}\"`)}}function UR(r){switch(r.type){case\"variable\":return BV(r);case\"number\":return!1;default:return UR(r.left)||UR(r.right)}}function KR(r){return r.some(({command:e})=>{for(;e;){let t=e.chain;for(;t;){let i;switch(t.type){case\"subshell\":i=KR(t.subshell);break;case\"command\":i=t.envs.some(n=>n.args.some(s=>kC(s)))||t.args.some(n=>kC(n));break}if(i)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function xB(r,e=[],{baseFs:t=new $t,builtins:i={},cwd:n=U.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=BB}={}){let g={};for(let[p,C]of Object.entries(s))typeof C<\"u\"&&(g[p]=C);let f=new Map(ske);for(let[p,C]of Object.entries(i))f.set(p,C);o===null&&(o=new zn.PassThrough,o.end());let h=uI(r,u);if(!KR(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let C=p.chain;for(;C.then;)C=C.then.chain;C.type===\"command\"&&(C.args=C.args.concat(e.map(y=>({type:\"argument\",segments:[{type:\"text\",text:y}]}))))}return await vB(h,{args:e,baseFs:t,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{[\"?\"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var l9=Pe(PB()),c9=Pe(Jg()),el=J(\"stream\");var a9=Pe(i9()),FB=Pe(Ac());var n9=[\"\\u280B\",\"\\u2819\",\"\\u2839\",\"\\u2838\",\"\\u283C\",\"\\u2834\",\"\\u2826\",\"\\u2827\",\"\\u2807\",\"\\u280F\"],s9=80,lRe=new Set([13,19]),cRe=5,RB=FB.default.GITHUB_ACTIONS?{start:r=>`::group::${r}\n`,end:r=>`::endgroup::\n`}:FB.default.TRAVIS?{start:r=>`travis_fold:start:${r}\n`,end:r=>`travis_fold:end:${r}\n`}:FB.default.GITLAB?{start:r=>`section_start:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\\W+/g,\"_\")}[collapsed=true]\\r\\x1B[0K${r}\n`,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\\W+/g,\"_\")}\\r\\x1B[0K`}:null,o9=new Date,uRe=[\"iTerm.app\",\"Apple_Terminal\",\"WarpTerminal\",\"vscode\"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,gRe=r=>r,NB=gRe({patrick:{date:[17,3],chars:[\"\\u{1F340}\",\"\\u{1F331}\"],size:40},simba:{date:[19,7],chars:[\"\\u{1F981}\",\"\\u{1F334}\"],size:40},jack:{date:[31,10],chars:[\"\\u{1F383}\",\"\\u{1F987}\"],size:40},hogsfather:{date:[31,12],chars:[\"\\u{1F389}\",\"\\u{1F384}\"],size:40},default:{chars:[\"=\",\"-\"],size:80}}),fRe=uRe&&Object.keys(NB).find(r=>{let e=NB[r];return!(e.date&&(e.date[0]!==o9.getDate()||e.date[1]!==o9.getMonth()+1))})||\"default\";function A9(r,{configuration:e,json:t}){if(!e.get(\"enableMessageNames\"))return\"\";let n=FA(r===null?0:r);return!t&&r===null?$e(e,n,\"grey\"):n}function qR(r,{configuration:e,json:t}){let i=A9(r,{configuration:e,json:t});if(!i||r===null||r===0)return i;let n=Ct[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return If(e,i,s)}var Ge=class extends vi{constructor({configuration:t,stdout:i,json:n=!1,includePrefix:s=!0,includeFooter:o=!0,includeLogs:a=!n,includeInfos:l=a,includeWarnings:c=a,forgettableBufferSize:u=cRe,forgettableNames:g=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(Xd(this,{configuration:t}),this.configuration=t,this.forgettableBufferSize=u,this.forgettableNames=new Set([...g,...lRe]),this.includePrefix=s,this.includeFooter=o,this.includeInfos=l,this.includeWarnings=c,this.json=n,this.stdout=i,t.get(\"enableProgressBars\")&&!n&&i.isTTY&&i.columns>22){let f=t.get(\"progressBarStyle\")||fRe;if(!Object.prototype.hasOwnProperty.call(NB,f))throw new Error(\"Assertion failed: Invalid progress bar style\");this.progressStyle=NB[f];let h=12,p=Math.max(0,Math.min(i.columns-h,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*p/80)}}static async start(t,i){let n=new this(t),s=process.emitWarning;process.emitWarning=(o,a)=>{if(typeof o!=\"string\"){let c=o;o=c.message,a=a!=null?a:c.name}let l=typeof a<\"u\"?`${a}: ${o}`:o;n.reportWarning(0,l)};try{await i(n)}catch(o){n.reportExceptionOnce(o)}finally{await n.finalize(),process.emitWarning=s}return n}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(t){this.cacheHitCount+=1}reportCacheMiss(t,i){this.lastCacheMiss=t,this.cacheMissCount+=1,typeof i<\"u\"&&!this.configuration.get(\"preferAggregateCacheInfo\")&&this.reportInfo(13,i)}startSectionSync({reportHeader:t,reportFooter:i,skipIfEmpty:n},s){let o={committed:!1,action:()=>{t==null||t()}};n?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(i==null||i(l-a))}}async startSectionPromise({reportHeader:t,reportFooter:i,skipIfEmpty:n},s){let o={committed:!1,action:()=>{t==null||t()}};n?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(i==null||i(l-a))}}startTimerImpl(t,i,n){return{cb:typeof i==\"function\"?i:n,reportHeader:()=>{this.reportInfo(null,`\\u250C ${t}`),this.indent+=1,RB!==null&&!this.json&&this.includeInfos&&this.stdout.write(RB.start(t))},reportFooter:a=>{this.indent-=1,RB!==null&&!this.json&&this.includeInfos&&this.stdout.write(RB.end(t)),this.configuration.get(\"enableTimers\")&&a>200?this.reportInfo(null,`\\u2514 Completed in ${$e(this.configuration,a,Ke.DURATION)}`):this.reportInfo(null,\"\\u2514 Completed\")},skipIfEmpty:(typeof i==\"function\"?{}:i).skipIfEmpty}}startTimerSync(t,i,n){let{cb:s,...o}=this.startTimerImpl(t,i,n);return this.startSectionSync(o,s)}async startTimerPromise(t,i,n){let{cb:s,...o}=this.startTimerImpl(t,i,n);return this.startSectionPromise(o,s)}async startCacheReport(t){let i=this.configuration.get(\"preferAggregateCacheInfo\")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await t()}catch(n){throw this.reportExceptionOnce(n),n}finally{i!==null&&this.reportCacheChanges(i)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(\"\"):this.reportInfo(null,\"\")}reportInfo(t,i){if(!this.includeInfos)return;this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:\"\",o=`${this.formatPrefix(s,\"blueBright\")}${i}`;if(this.json)this.reportJson({type:\"info\",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i});else if(this.forgettableNames.has(t))if(this.forgettableLines.push(o),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(o,{truncate:!0});else this.writeLineWithForgettableReset(o)}reportWarning(t,i){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:\"\";this.json?this.reportJson({type:\"warning\",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i}):this.writeLineWithForgettableReset(`${this.formatPrefix(s,\"yellowBright\")}${i}`)}reportError(t,i){this.errorCount+=1,this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:\"\";this.json?this.reportJson({type:\"error\",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i}):this.writeLineWithForgettableReset(`${this.formatPrefix(s,\"redBright\")}${i}`,{truncate:!1})}reportProgress(t){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(t.hasProgress&&t.hasTitle)throw new Error(\"Unimplemented: Progress bars can't have both progress and titles.\");let i=!1,n=Promise.resolve().then(async()=>{let o={progress:t.hasProgress?0:void 0,title:t.hasTitle?\"\":void 0};this.progress.set(t,{definition:o,lastScaledSize:t.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:a,title:l}of t)i||o.progress===a&&o.title===l||(o.progress=a,o.title=l,this.refreshProgress());s()}),s=()=>{i||(i=!0,this.progress.delete(t),this.refreshProgress({delta:1}))};return{...n,stop:s}}reportJson(t){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(t)}`)}async finalize(){if(!this.includeFooter)return;let t=\"\";this.errorCount>0?t=\"Failed with errors\":this.warningCount>0?t=\"Done with warnings\":t=\"Done\";let i=$e(this.configuration,Date.now()-this.startTime,Ke.DURATION),n=this.configuration.get(\"enableTimers\")?`${t} in ${i}`:t;this.errorCount>0?this.reportError(0,n):this.warningCount>0?this.reportWarning(0,n):this.reportInfo(0,n)}writeLine(t,{truncate:i}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(t,{truncate:i})}\n`),this.writeProgress()}writeLineWithForgettableReset(t,{truncate:i}={}){this.forgettableLines=[],this.writeLine(t,{truncate:i})}writeLines(t,{truncate:i}={}){this.clearProgress({delta:t.length});for(let n of t)this.stdout.write(`${this.truncate(n,{truncate:i})}\n`);this.writeProgress()}reportCacheChanges({cacheHitCount:t,cacheMissCount:i}){let n=this.cacheHitCount-t,s=this.cacheMissCount-i;if(n===0&&s===0)return;let o=\"\";this.cacheHitCount>1?o+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?o+=\" - one package was already cached\":o+=\"No packages were cached\",this.cacheHitCount>0?this.cacheMissCount>1?o+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(o+=`, one had to be fetched (${mt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?o+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(o+=` - one package had to be fetched (${mt(this.configuration,this.lastCacheMiss)})`),this.reportInfo(13,o)}commit(){let t=this.uncommitted;this.uncommitted=new Set;for(let i of t)i.committed=!0,i.action()}clearProgress({delta:t=0,clear:i=!1}){this.progressStyle!==null&&this.progress.size+t>0&&(this.stdout.write(`\\x1B[${this.progress.size+t}A`),(t>0||i)&&this.stdout.write(\"\\x1B[0J\"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let t=Date.now();t-this.progressTime>s9&&(this.progressFrame=(this.progressFrame+1)%n9.length,this.progressTime=t);let i=n9[this.progressFrame];for(let n of this.progress.values()){let s=\"\";if(typeof n.lastScaledSize<\"u\"){let c=this.progressStyle.chars[0].repeat(n.lastScaledSize),u=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-n.lastScaledSize);s=` ${c}${u}`}let o=this.formatName(null),a=o?`${o}: `:\"\",l=n.definition.title?` ${n.definition.title}`:\"\";this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"blueBright\")} ${a}${i}${s}${l}\n`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},s9)}refreshProgress({delta:t=0,force:i=!1}={}){let n=!1,s=!1;if(i||this.progress.size===0)n=!0;else for(let o of this.progress.values()){let a=typeof o.definition.progress<\"u\"?Math.trunc(this.progressMaxScaledSize*o.definition.progress):void 0,l=o.lastScaledSize;o.lastScaledSize=a;let c=o.lastTitle;if(o.lastTitle=o.definition.title,a!==l||(s=c!==o.definition.title)){n=!0;break}}n&&(this.clearProgress({delta:t,clear:s}),this.writeProgress())}truncate(t,{truncate:i}={}){return this.progressStyle===null&&(i=!1),typeof i>\"u\"&&(i=this.configuration.get(\"preferTruncatedLines\")),i&&(t=(0,a9.default)(t,0,this.stdout.columns-1)),t}formatName(t){return A9(t,{configuration:this.configuration,json:this.json})}formatPrefix(t,i){return this.includePrefix?`${$e(this.configuration,\"\\u27A4\",i)} ${t}${this.formatIndent()}`:\"\"}formatNameWithHyperlink(t){return qR(t,{configuration:this.configuration,json:this.json})}formatIndent(){return\"\\u2502 \".repeat(this.indent)}};var Lr=\"3.5.1\";var u9=(n=>(n.Yarn1=\"Yarn Classic\",n.Yarn2=\"Yarn\",n.Npm=\"npm\",n.Pnpm=\"pnpm\",n))(u9||{});async function Ja(r,e,t,i=[]){if(process.platform===\"win32\"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @\"${t}\" ${i.map(s=>`\"${s.replace('\"','\"\"')}\"`).join(\" \")} %*`;await M.writeFilePromise(x.format({dir:r,name:e,ext:\".cmd\"}),n)}await M.writeFilePromise(x.join(r,e),`#!/bin/sh\nexec \"${t}\" ${i.map(n=>`'${n.replace(/'/g,`'\"'\"'`)}'`).join(\" \")} \"$@\"\n`,{mode:493})}async function g9(r){let e=await ot.tryFind(r);if(e!=null&&e.packageManager){let i=vw(e.packageManager);if(i!=null&&i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(\".\");switch(i.name){case\"yarn\":return{packageManagerField:!0,packageManager:Number(s)===1?\"Yarn Classic\":\"Yarn\",reason:n};case\"npm\":return{packageManagerField:!0,packageManager:\"npm\",reason:n};case\"pnpm\":return{packageManagerField:!0,packageManager:\"pnpm\",reason:n}}}}let t;try{t=await M.readFilePromise(x.join(r,xt.lockfile),\"utf8\")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:\"Yarn\",reason:'\"__metadata\" key found in yarn.lock'}:{packageManager:\"Yarn Classic\",reason:'\"__metadata\" key not found in yarn.lock, must be a Yarn classic lockfile'}:M.existsSync(x.join(r,\"package-lock.json\"))?{packageManager:\"npm\",reason:`found npm's \"package-lock.json\" lockfile`}:M.existsSync(x.join(r,\"pnpm-lock.yaml\"))?{packageManager:\"pnpm\",reason:`found pnpm's \"pnpm-lock.yaml\" lockfile`}:null}async function FC({project:r,locator:e,binFolder:t,ignoreCorepack:i,lifecycleScript:n}){var c,u;let s={};for(let[g,f]of Object.entries(process.env))typeof f<\"u\"&&(s[g.toLowerCase()!==\"path\"?g:\"PATH\"]=f);let o=U.fromPortablePath(t);s.BERRY_BIN_FOLDER=U.fromPortablePath(o);let a=process.env.COREPACK_ROOT&&!i?U.join(process.env.COREPACK_ROOT,\"dist/yarn.js\"):process.argv[1];if(await Promise.all([Ja(t,\"node\",process.execPath),...Lr!==null?[Ja(t,\"run\",process.execPath,[a,\"run\"]),Ja(t,\"yarn\",process.execPath,[a]),Ja(t,\"yarnpkg\",process.execPath,[a]),Ja(t,\"node-gyp\",process.execPath,[a,\"run\",\"--top-level\",\"node-gyp\"])]:[]]),r&&(s.INIT_CWD=U.fromPortablePath(r.configuration.startingCwd),s.PROJECT_CWD=U.fromPortablePath(r.cwd)),s.PATH=s.PATH?`${o}${U.delimiter}${s.PATH}`:`${o}`,s.npm_execpath=`${o}${U.sep}yarn`,s.npm_node_execpath=`${o}${U.sep}node`,e){if(!r)throw new Error(\"Assertion failed: Missing project\");let g=r.tryWorkspaceByLocator(e),f=g?(c=g.manifest.version)!=null?c:\"\":(u=r.storedPackages.get(e.locatorHash).version)!=null?u:\"\";s.npm_package_name=Ot(e),s.npm_package_version=f;let h;if(g)h=g.cwd;else{let p=r.storedPackages.get(e.locatorHash);if(!p)throw new Error(`Package for ${mt(r.configuration,e)} not found in the project`);let C=r.configuration.getLinkers(),y={project:r,report:new Ge({stdout:new el.PassThrough,configuration:r.configuration})},B=C.find(v=>v.supportsPackage(p,y));if(!B)throw new Error(`The package ${mt(r.configuration,p)} isn't supported by any of the available linkers`);h=await B.findPackageLocation(p,y)}s.npm_package_json=U.fromPortablePath(x.join(h,xt.manifest))}let l=Lr!==null?`yarn/${Lr}`:`yarn/${mf(\"@yarnpkg/core\").version}-core`;return s.npm_config_user_agent=`${l} npm/? node/${process.version} ${process.platform} ${process.arch}`,n&&(s.npm_lifecycle_event=n),r&&await r.configuration.triggerHook(g=>g.setupScriptEnvironment,r,s,async(g,f,h)=>await Ja(t,Kr(g),f,h)),s}var hRe=2,pRe=(0,c9.default)(hRe);async function dRe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await pRe(async()=>{await M.mktempPromise(async o=>{let a=x.join(o,\"pack.log\"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:U.fromPortablePath(r),report:i}),g=s&&jo(s)?nC(s):s,f=g?Es(g):\"an external project\";c.write(`Packing ${f} from sources\n`);let h=await g9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason}\n\n`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn\n\n`),p=\"Yarn\");let C=p===\"Yarn\"&&!(h!=null&&h.packageManagerField);await M.mktempPromise(async y=>{let B=await FC({binFolder:y,ignoreCorepack:C}),D=new Map([[\"Yarn Classic\",async()=>{let H=n!==null?[\"workspace\",n]:[],j=x.join(r,xt.manifest),$=await M.readFilePromise(j),V=await Wo(process.execPath,[process.argv[1],\"set\",\"version\",\"classic\",\"--only-if-needed\"],{cwd:r,env:B,stdin:l,stdout:c,stderr:u,end:1});if(V.code!==0)return V.code;await M.writeFilePromise(j,$),await M.appendFilePromise(x.join(r,\".npmignore\"),`/.yarn\n`),c.write(`\n`),delete B.NODE_ENV;let W=await Wo(\"yarn\",[\"install\"],{cwd:r,env:B,stdin:l,stdout:c,stderr:u,end:1});if(W.code!==0)return W.code;c.write(`\n`);let _=await Wo(\"yarn\",[...H,\"pack\",\"--filename\",U.fromPortablePath(e)],{cwd:r,env:B,stdin:l,stdout:c,stderr:u});return _.code!==0?_.code:0}],[\"Yarn\",async()=>{let H=n!==null?[\"workspace\",n]:[];B.YARN_ENABLE_INLINE_BUILDS=\"1\";let j=x.join(r,xt.lockfile);await M.existsPromise(j)||await M.writeFilePromise(j,\"\");let $=await Wo(\"yarn\",[...H,\"pack\",\"--install-if-needed\",\"--filename\",U.fromPortablePath(e)],{cwd:r,env:B,stdin:l,stdout:c,stderr:u});return $.code!==0?$.code:0}],[\"npm\",async()=>{if(n!==null){let Ae=new el.PassThrough,ge=Cf(Ae);Ae.pipe(c,{end:!1});let re=await Wo(\"npm\",[\"--version\"],{cwd:r,env:B,stdin:l,stdout:Ae,stderr:u,end:0});if(Ae.end(),re.code!==0)return c.end(),u.end(),re.code;let O=(await ge).toString().trim();if(!kc(O,\">=7.x\")){let F=qo(null,\"npm\"),ue=_t(F,O),pe=_t(F,\">=7.x\");throw new Error(`Workspaces aren't supported by ${tr(t,ue)}; please upgrade to ${tr(t,pe)} (npm has been detected as the primary package manager for ${$e(t,r,Ke.PATH)})`)}}let H=n!==null?[\"--workspace\",n]:[];delete B.npm_config_user_agent,delete B.npm_config_production,delete B.NPM_CONFIG_PRODUCTION,delete B.NODE_ENV;let j=await Wo(\"npm\",[\"install\"],{cwd:r,env:B,stdin:l,stdout:c,stderr:u,end:1});if(j.code!==0)return j.code;let $=new el.PassThrough,V=Cf($);$.pipe(c);let W=await Wo(\"npm\",[\"pack\",\"--silent\",...H],{cwd:r,env:B,stdin:l,stdout:$,stderr:u});if(W.code!==0)return W.code;let _=(await V).toString().trim().replace(/^.*\\n/s,\"\"),A=x.resolve(r,U.toPortablePath(_));return await M.renamePromise(A,e),0}]]).get(p);if(typeof D>\"u\")throw new Error(\"Assertion failed: Unsupported workflow\");let L=await D();if(!(L===0||typeof L>\"u\"))throw M.detachTemp(o),new at(58,`Packing the package failed (exit code ${L}, logs can be found here: ${$e(t,a,Ke.PATH)})`)})})})}async function CRe(r,e,{project:t}){let i=t.tryWorkspaceByLocator(r);if(i!==null)return WR(i,e);let n=t.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${mt(t.configuration,r)} not found in the project`);return await Mn.openPromise(async s=>{let o=t.configuration,a=t.configuration.getLinkers(),l={project:t,report:new Ge({stdout:new el.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${mt(t.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new qt(u,{baseFs:s});return(await ot.find(Oe.dot,{baseFs:g})).scripts.has(e)},{libzip:await on()})}async function LB(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await M.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await f9(r,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f>\"u\")return 1;let h=async()=>await xB(f,t,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(C=>C.wrapScriptExecution,h,n,r,e,{script:f,args:t,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function JR(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await M.mktempPromise(async l=>{let{env:c,cwd:u}=await f9(r,{project:n,binFolder:l,cwd:i});return await xB(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function mRe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await FC({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await d9(r),([s,[,o]])=>Ja(e,Kr(s),process.execPath,[o]))),typeof t>\"u\"&&(t=x.dirname(await M.realpathPromise(x.join(r.cwd,\"package.json\")))),{manifest:r.manifest,binFolder:e,env:n,cwd:t}}async function f9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return mRe(s,{binFolder:t,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(r.locatorHash);if(!o)throw new Error(`Package for ${mt(e.configuration,r)} not found in the project`);return await Mn.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Ge({stdout:new el.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${mt(e.configuration,o)} isn't supported by any of the available linkers`);let f=await FC({project:e,locator:r,binFolder:t,lifecycleScript:n});await Promise.all(Array.from(await TB(r,{project:e}),([y,[,B]])=>Ja(t,Kr(y),process.execPath,[B])));let h=await g.findPackageLocation(o,u),p=new qt(h,{baseFs:a}),C=await ot.find(Oe.dot,{baseFs:p});return typeof i>\"u\"&&(i=h),{manifest:C,binFolder:t,env:f,cwd:i}},{libzip:await on()})}async function h9(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o}){return await LB(r.anchoredLocator,e,t,{cwd:i,project:r.project,stdin:n,stdout:s,stderr:o})}function WR(r,e){return r.manifest.scripts.has(e)}async function p9(r,e,{cwd:t,report:i}){let{configuration:n}=r.project,s=null;await M.mktempPromise(async o=>{let a=x.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the \"${e}\" lifecycle script inside a workspace (\"${U.fromPortablePath(r.cwd)}\")\n`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:mt(n,r.anchoredLocator),header:l});i.reportInfo(36,`Calling the \"${e}\" lifecycle script`);let g=await h9(r,e,[],{cwd:t,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw M.detachTemp(o),new at(36,`${(0,l9.default)(e)} script failed (exit code ${$e(n,g,Ke.NUMBER)}, logs can be found here: ${$e(n,a,Ke.PATH)}); run ${$e(n,`yarn ${e}`,Ke.CODE)} to investigate`)})}async function ERe(r,e,t){WR(r,e)&&await p9(r,e,t)}async function TB(r,{project:e}){let t=e.configuration,i=new Map,n=e.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${mt(t,r)} not found in the project`);let s=new el.Writable,o=t.getLinkers(),a={project:e,report:new Ge({configuration:t,stdout:s})},l=new Set([r.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${tr(t,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return Ko.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return Ko.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code===\"LOCATOR_NOT_INSTALLED\")return Ko.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===Ko.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,U.fromPortablePath(x.resolve(f,p))])}return i}async function d9(r){return await TB(r.anchoredLocator,{project:r.project})}async function C9(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await TB(r,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${mt(n.configuration,r)}`);return await M.mktempPromise(async g=>{let[,f]=u,h=await FC({project:n,locator:r,binFolder:g});await Promise.all(Array.from(c,([C,[,y]])=>Ja(h.BERRY_BIN_FOLDER,Kr(C),process.execPath,[y])));let p;try{p=await Wo(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await M.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function IRe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await C9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var mi={};ut(mi,{convertToZip:()=>WNe,extractArchiveTo:()=>VNe,makeArchiveFromDirectory:()=>JNe});var aZ=J(\"stream\"),AZ=Pe(tZ());var rZ=Pe(Jg()),iZ=J(\"worker_threads\");var fl=Symbol(\"kTaskInfo\"),T0=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,rZ.default)(ek());this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let t=this.workers.pop();t?t.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new iZ.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,\"--unhandled-rejections=strict\"]});return e.on(\"message\",t=>{if(!e[fl])throw new Error(\"Assertion failed: Worker sent a result without having a task assigned\");e[fl].resolve(t),e[fl]=null,e.unref(),this.workers.push(e)}),e.on(\"error\",t=>{var i;(i=e[fl])==null||i.reject(t),e[fl]=null}),e.on(\"exit\",t=>{var i;t!==0&&((i=e[fl])==null||i.reject(new Error(`Worker exited with code ${t}`))),e[fl]=null}),e}run(e){return this.limit(()=>{var i;let t=(i=this.workers.pop())!=null?i:this.createWorker();return t.ref(),new Promise((n,s)=>{t[fl]={resolve:n,reject:s},t.postMessage(e)})})}};var lZ=Pe(sZ());async function JNe(r,{baseFs:e=new $t,prefixPath:t=Oe.root,compressionLevel:i,inMemory:n=!1}={}){let s=await on(),o;if(n)o=new Wr(null,{libzip:s,level:i});else{let l=await M.mktempPromise(),c=x.join(l,\"archive.zip\");o=new Wr(c,{create:!0,libzip:s,level:i})}let a=x.resolve(Oe.root,t);return await o.copyPromise(a,r,{baseFs:e,stableTime:!0,stableSort:!0}),o}var oZ;async function WNe(r,e){let t=await M.mktempPromise(),i=x.join(t,\"archive.zip\");return oZ||(oZ=new T0((0,lZ.getContent)())),await oZ.run({tmpFile:i,tgz:r,opts:e}),new Wr(i,{libzip:await on(),level:e.compressionLevel})}async function*zNe(r){let e=new AZ.default.Parse,t=new aZ.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on(\"entry\",i=>{t.write(i)}),e.on(\"error\",i=>{t.destroy(i)}),e.on(\"close\",()=>{t.destroyed||t.end()}),e.end(r);for await(let i of t){let n=i;yield n,n.resume()}}async function VNe(r,e,{stripComponents:t=0,prefixPath:i=Oe.dot}={}){var s,o;function n(a){if(a.path[0]===\"/\")return!0;let l=a.path.split(/\\//g);return!!(l.some(c=>c===\"..\")||l.length<=t)}for await(let a of zNe(r)){if(n(a))continue;let l=x.normalize(U.toPortablePath(a.path)).replace(/\\/$/,\"\").split(/\\//g);if(l.length<=t)continue;let c=l.slice(t).join(\"/\"),u=x.join(i,c),g=420;switch((a.type===\"Directory\"||(((s=a.mode)!=null?s:0)&73)!==0)&&(g|=73),a.type){case\"Directory\":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,xr.SAFE_TIME,xr.SAFE_TIME);break;case\"OldFile\":case\"File\":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),e.writeFileSync(u,await Cf(a),{mode:g}),e.utimesSync(u,xr.SAFE_TIME,xr.SAFE_TIME);break;case\"SymbolicLink\":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,xr.SAFE_TIME,xr.SAFE_TIME);break}}return e}var $n={};ut($n,{emitList:()=>XNe,emitTree:()=>pZ,treeNodeToJson:()=>hZ,treeNodeToTreeify:()=>fZ});var gZ=Pe(uZ());function fZ(r,{configuration:e}){let t={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l<\"u\"&&g.push(Vy(e,l,2)),typeof c<\"u\"&&g.push($e(e,c[0],c[1])),g.length===0&&g.push(Vy(e,`${a}`,2));let f=g.join(\": \"),h=s[f]={};typeof u<\"u\"&&i(u,h)}};if(typeof r.children>\"u\")throw new Error(\"The root node must only contain children\");return i(r.children,t),t}function hZ(r){let e=t=>{var s;if(typeof t.children>\"u\"){if(typeof t.value>\"u\")throw new Error(\"Assertion failed: Expected a value to be set if the children are missing\");return Bc(t.value[0],t.value[1])}let i=Array.isArray(t.children)?t.children.entries():Object.entries((s=t.children)!=null?s:{}),n=Array.isArray(t.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof t.value>\"u\"?n:{value:Bc(t.value[0],t.value[1]),children:n}};return e(r)}function XNe(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));pZ({children:n},{configuration:e,stdout:t,json:i})}function pZ(r,{configuration:e,stdout:t,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(r.children)?r.children.values():Object.values((o=r.children)!=null?o:{});for(let l of a)t.write(`${JSON.stringify(hZ(l))}\n`);return}let s=(0,gZ.asTree)(fZ(r,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\\u2502\n$1`).replace(/^│\\n/,\"\")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\\n]+\\n)(([│ ]).{2}[├└].{2}[^\\n]*\\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3  \\u2502\n$2`).replace(/^│\\n/,\"\");if(n>=3)throw new Error(\"Only the first two levels are accepted by treeUtils.emitTree\");t.write(s)}var dZ=J(\"crypto\"),PN=Pe(J(\"fs\"));var ZNe=8,Rt=class{constructor(e,{configuration:t,immutable:i=t.get(\"enableImmutableCache\"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,dZ.randomBytes)(8).toString(\"hex\")}.tmp`;this.configuration=t,this.cwd=e,this.immutable=i,this.check=n;let s=t.get(\"cacheKeyOverride\");if(s!==null)this.cacheKey=`${s}`;else{let o=t.get(\"compressionLevel\"),a=o!==Xl?`c${o}`:\"\";this.cacheKey=[ZNe,a].join(\"\")}}static async find(e,{immutable:t,check:i}={}){let n=new Rt(e.get(\"cacheFolder\"),{configuration:e,immutable:t,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get(\"enableMirror\"))return null;let e=`${this.configuration.get(\"globalFolder\")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${xf(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){let n=_Ne(t).slice(0,10);return`${xf(e)}-${n}.zip`}getLocatorPath(e,t,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?x.resolve(this.cwd,this.getVersionFilename(e)):t===null||xN(t)!==this.cacheKey?null:x.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){let t=this.mirrorCwd;return t!==null?x.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get(\"enableGlobalCache\"))if(this.immutable){if(!await M.existsPromise(this.cwd))throw new at(56,\"Cache path does not exist.\")}else{await M.mkdirPromise(this.cwd,{recursive:!0});let e=x.resolve(this.cwd,\".gitignore\");await M.changeFilePromise(e,`/.gitignore\n*.flock\n*.tmp\n`)}(this.mirrorCwd||!this.immutable)&&await M.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,t,{onHit:i,onMiss:n,loader:s,...o}){var W;let a=this.getLocatorMirrorPath(e),l=new $t,c=()=>{let _=new Wr(null,{libzip:D}),A=x.join(Oe.root,qD(e));return _.mkdirSync(A,{recursive:!0}),_.writeJsonSync(x.join(A,xt.manifest),{name:Ot(e),mocked:!0}),_},u=async(_,A=null)=>{var ge;if(A===null&&((ge=o.unstablePackages)==null?void 0:ge.has(e.locatorHash)))return{isValid:!0,hash:null};let Ae=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await Qw(_)}`:t;if(A!==null){let re=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await Qw(A)}`:t;if(Ae!==re)throw new at(18,\"The remote archive doesn't match the local checksum - has the local cache been corrupted?\")}if(t!==null&&Ae!==t){let re;switch(this.check?re=\"throw\":xN(t)!==xN(Ae)?re=\"update\":re=this.configuration.get(\"checksumBehavior\"),re){case\"ignore\":return{isValid:!0,hash:t};case\"update\":return{isValid:!0,hash:Ae};case\"reset\":return{isValid:!1,hash:t};default:case\"throw\":throw new at(18,\"The remote archive doesn't match the expected checksum\")}}return{isValid:!0,hash:Ae}},g=async _=>{if(!s)throw new Error(`Cache check required but no loader configured for ${mt(this.configuration,e)}`);let A=await s(),Ae=A.getRealPath();A.saveAndClose(),await M.chmodPromise(Ae,420);let ge=await u(_,Ae);if(!ge.isValid)throw new Error(\"Assertion failed: Expected a valid checksum\");return ge.hash},f=async()=>{if(a===null||!await M.existsPromise(a)){let _=await s(),A=_.getRealPath();return _.saveAndClose(),{source:\"loader\",path:A}}return{source:\"mirror\",path:a}},h=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${mt(this.configuration,e)}`);if(this.immutable)throw new at(56,`Cache entry required but missing for ${mt(this.configuration,e)}`);let{path:_,source:A}=await f(),Ae=(await u(_)).hash,ge=this.getLocatorPath(e,Ae,o);if(!ge)throw new Error(\"Assertion failed: Expected the cache path to be available\");let re=[];A!==\"mirror\"&&a!==null&&re.push(async()=>{let F=`${a}${this.cacheId}`;await M.copyFilePromise(_,F,PN.default.constants.COPYFILE_FICLONE),await M.chmodPromise(F,420),await M.renamePromise(F,a)}),(!o.mirrorWriteOnly||a===null)&&re.push(async()=>{let F=`${ge}${this.cacheId}`;await M.copyFilePromise(_,F,PN.default.constants.COPYFILE_FICLONE),await M.chmodPromise(F,420),await M.renamePromise(F,ge)});let O=o.mirrorWriteOnly&&a!=null?a:ge;return await Promise.all(re.map(F=>F())),[!1,O,Ae]},p=async()=>{let A=(async()=>{var ue;let Ae=this.getLocatorPath(e,t,o),ge=Ae!==null?await l.existsPromise(Ae):!1,re=!!((ue=o.mockedPackages)!=null&&ue.has(e.locatorHash))&&(!this.check||!ge),O=re||ge,F=O?i:n;if(F&&F(),O){let pe=null,ke=Ae;if(!re)if(this.check)pe=await g(ke);else{let Fe=await u(ke);if(Fe.isValid)pe=Fe.hash;else return h()}return[re,ke,pe]}else return h()})();this.mutexes.set(e.locatorHash,A);try{return await A}finally{this.mutexes.delete(e.locatorHash)}};for(let _;_=this.mutexes.get(e.locatorHash);)await _;let[C,y,B]=await p();this.markedFiles.add(y);let v,D=await on(),L=C?()=>c():()=>new Wr(y,{baseFs:l,libzip:D,readOnly:!0}),H=new Sg(()=>Jx(()=>v=L(),_=>`Failed to open the cache entry for ${mt(this.configuration,e)}: ${_}`),x),j=new bo(y,{baseFs:H,pathUtils:x}),$=()=>{v==null||v.discardAndClose()},V=(W=o.unstablePackages)!=null&&W.has(e.locatorHash)?null:B;return[j,$,V]}};function xN(r){let e=r.indexOf(\"/\");return e!==-1?r.slice(0,e):null}function _Ne(r){let e=r.indexOf(\"/\");return e!==-1?r.slice(e+1):r}var O0=(t=>(t[t.SCRIPT=0]=\"SCRIPT\",t[t.SHELLCODE=1]=\"SHELLCODE\",t))(O0||{});var ra=class extends vi{constructor({configuration:t,stdout:i,suggestInstall:n=!0}){super();this.errorCount=0;Xd(this,{configuration:t}),this.configuration=t,this.stdout=i,this.suggestInstall=n}static async start(t,i){let n=new this(t);try{await i(n)}catch(s){n.reportExceptionOnce(s)}finally{await n.finalize()}return n}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(t){}reportCacheMiss(t){}startSectionSync(t,i){return i()}async startSectionPromise(t,i){return await i()}startTimerSync(t,i,n){return(typeof i==\"function\"?i:n)()}async startTimerPromise(t,i,n){return await(typeof i==\"function\"?i:n)()}async startCacheReport(t){return await t()}reportSeparator(){}reportInfo(t,i){}reportWarning(t,i){}reportError(t,i){this.errorCount+=1,this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"redBright\")} ${this.formatNameWithHyperlink(t)}: ${i}\n`)}reportProgress(t){return{...Promise.resolve().then(async()=>{for await(let{}of t);}),stop:()=>{}}}reportJson(t){}async finalize(){this.errorCount>0&&(this.stdout.write(`\n`),this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"redBright\")} Errors happened when preparing the environment required to run this command.\n`),this.suggestInstall&&this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"redBright\")} This might be caused by packages being missing from the lockfile, in which case running \"yarn install\" might help.\n`))}formatNameWithHyperlink(t){return qR(t,{configuration:this.configuration,json:!1})}};var X0=J(\"crypto\");function rA(){}rA.prototype={diff:function(e,t){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i==\"function\"&&(n=i,i={}),this.options=i;var s=this;function o(C){return n?(setTimeout(function(){n(void 0,C)},0),!0):C}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var a=t.length,l=e.length,c=1,u=a+l;i.maxEditLength&&(u=Math.min(u,i.maxEditLength));var g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],t,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(t),count:t.length}]);function h(){for(var C=-1*c;C<=c;C+=2){var y=void 0,B=g[C-1],v=g[C+1],D=(v?v.newPos:0)-C;B&&(g[C-1]=void 0);var L=B&&B.newPos+1<a,H=v&&0<=D&&D<l;if(!L&&!H){g[C]=void 0;continue}if(!L||H&&B.newPos<v.newPos?(y=eLe(v),s.pushComponent(y.components,void 0,!0)):(y=B,y.newPos++,s.pushComponent(y.components,!0,void 0)),D=s.extractCommon(y,t,e,C),y.newPos+1>=a&&D+1>=l)return o($Ne(s,y.components,t,e,s.useLongestToken));g[C]=y}c++}if(n)(function C(){setTimeout(function(){if(c>u)return n();h()||C()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,t,i){var n=e[e.length-1];n&&n.added===t&&n.removed===i?e[e.length-1]={count:n.count+1,added:t,removed:i}:e.push({count:1,added:t,removed:i})},extractCommon:function(e,t,i,n){for(var s=t.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1<s&&l+1<o&&this.equals(t[a+1],i[l+1]);)a++,l++,c++;return c&&e.components.push({count:c}),e.newPos=a,l},equals:function(e,t){return this.options.comparator?this.options.comparator(e,t):e===t||this.options.ignoreCase&&e.toLowerCase()===t.toLowerCase()},removeEmpty:function(e){for(var t=[],i=0;i<e.length;i++)e[i]&&t.push(e[i]);return t},castInput:function(e){return e},tokenize:function(e){return e.split(\"\")},join:function(e){return e.join(\"\")}};function $Ne(r,e,t,i,n){for(var s=0,o=e.length,a=0,l=0;s<o;s++){var c=e[s];if(c.removed){if(c.value=r.join(i.slice(l,l+c.count)),l+=c.count,s&&e[s-1].added){var g=e[s-1];e[s-1]=e[s],e[s]=g}}else{if(!c.added&&n){var u=t.slice(a,a+c.count);u=u.map(function(h,p){var C=i[l+p];return C.length>h.length?C:h}),c.value=r.join(u)}else c.value=r.join(t.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value==\"string\"&&(f.added||f.removed)&&r.equals(\"\",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function eLe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var Nat=new rA;var CZ=/^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/,mZ=/\\S/,EZ=new rA;EZ.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!mZ.test(r)&&!mZ.test(e)};EZ.tokenize=function(r){for(var e=r.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/),t=0;t<e.length-1;t++)!e[t+1]&&e[t+2]&&CZ.test(e[t])&&CZ.test(e[t+2])&&(e[t]+=e[t+2],e.splice(t+1,2),t--);return e};var NN=new rA;NN.tokenize=function(r){var e=[],t=r.split(/(\\n|\\r\\n)/);t[t.length-1]||t.pop();for(var i=0;i<t.length;i++){var n=t[i];i%2&&!this.options.newlineIsToken?e[e.length-1]+=n:(this.options.ignoreWhitespace&&(n=n.trim()),e.push(n))}return e};function tLe(r,e,t){return NN.diff(r,e,t)}var rLe=new rA;rLe.tokenize=function(r){return r.split(/(\\S.+?[.!?])(?=\\s+|$)/)};var iLe=new rA;iLe.tokenize=function(r){return r.split(/([{}:;,]|\\s+)/)};function M0(r){return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?M0=function(e){return typeof e}:M0=function(e){return e&&typeof Symbol==\"function\"&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},M0(r)}function DN(r){return nLe(r)||sLe(r)||oLe(r)||aLe()}function nLe(r){if(Array.isArray(r))return kN(r)}function sLe(r){if(typeof Symbol<\"u\"&&Symbol.iterator in Object(r))return Array.from(r)}function oLe(r,e){if(!!r){if(typeof r==\"string\")return kN(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);if(t===\"Object\"&&r.constructor&&(t=r.constructor.name),t===\"Map\"||t===\"Set\")return Array.from(r);if(t===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return kN(r,e)}}function kN(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,i=new Array(e);t<e;t++)i[t]=r[t];return i}function aLe(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ALe=Object.prototype.toString,ZC=new rA;ZC.useLongestToken=!0;ZC.tokenize=NN.tokenize;ZC.castInput=function(r){var e=this.options,t=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o>\"u\"?t:o}:i;return typeof r==\"string\"?r:JSON.stringify(RN(r,null,null,n),n,\"  \")};ZC.equals=function(r,e){return rA.prototype.equals.call(ZC,r.replace(/,([\\r\\n])/g,\"$1\"),e.replace(/,([\\r\\n])/g,\"$1\"))};function RN(r,e,t,i,n){e=e||[],t=t||[],i&&(r=i(n,r));var s;for(s=0;s<e.length;s+=1)if(e[s]===r)return t[s];var o;if(ALe.call(r)===\"[object Array]\"){for(e.push(r),o=new Array(r.length),t.push(o),s=0;s<r.length;s+=1)o[s]=RN(r[s],e,t,i,n);return e.pop(),t.pop(),o}if(r&&r.toJSON&&(r=r.toJSON()),M0(r)===\"object\"&&r!==null){e.push(r),o={},t.push(o);var a=[],l;for(l in r)r.hasOwnProperty(l)&&a.push(l);for(a.sort(),s=0;s<a.length;s+=1)l=a[s],o[l]=RN(r[l],e,t,i,l);e.pop(),t.pop()}else o=r;return o}var FN=new rA;FN.tokenize=function(r){return r.slice()};FN.join=FN.removeEmpty=function(r){return r};function IZ(r,e,t,i,n,s,o){o||(o={}),typeof o.context>\"u\"&&(o.context=4);var a=tLe(t,i,o);if(!a)return;a.push({value:\"\",lines:[]});function l(B){return B.map(function(v){return\" \"+v})}for(var c=[],u=0,g=0,f=[],h=1,p=1,C=function(v){var D=a[v],L=D.lines||D.value.replace(/\\n$/,\"\").split(`\n`);if(D.lines=L,D.added||D.removed){var H;if(!u){var j=a[v-1];u=h,g=p,j&&(f=o.context>0?l(j.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(H=f).push.apply(H,DN(L.map(function(re){return(D.added?\"+\":\"-\")+re}))),D.added?p+=L.length:h+=L.length}else{if(u)if(L.length<=o.context*2&&v<a.length-2){var $;($=f).push.apply($,DN(l(L)))}else{var V,W=Math.min(L.length,o.context);(V=f).push.apply(V,DN(l(L.slice(0,W))));var _={oldStart:u,oldLines:h-u+W,newStart:g,newLines:p-g+W,lines:f};if(v>=a.length-2&&L.length<=o.context){var A=/\\n$/.test(t),Ae=/\\n$/.test(i),ge=L.length==0&&f.length>_.oldLines;!A&&ge&&t.length>0&&f.splice(_.oldLines,0,\"\\\\ No newline at end of file\"),(!A&&!ge||!Ae)&&f.push(\"\\\\ No newline at end of file\")}c.push(_),u=0,g=0,f=[]}h+=L.length,p+=L.length}},y=0;y<a.length;y++)C(y);return{oldFileName:r,newFileName:e,oldHeader:n,newHeader:s,hunks:c}}var Z0=Pe(S$()),_0=Pe(Jg()),k$=Pe(Xr()),JN=J(\"util\"),qN=Pe(J(\"v8\")),WN=Pe(J(\"zlib\"));var TMe=[[/^(git(?:\\+(?:https|ssh))?:\\/\\/.*(?:\\.git)?)#(.*)$/,(r,e,t,i)=>`${t}#commit=${i}`],[/^https:\\/\\/((?:[^/]+?)@)?codeload\\.github\\.com\\/([^/]+\\/[^/]+)\\/tar\\.gz\\/([0-9a-f]+)$/,(r,e,t=\"\",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https:\\/\\/((?:[^/]+?)@)?github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?#([0-9a-f]+)$/,(r,e,t=\"\",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https?:\\/\\/[^/]+\\/(?:[^/]+\\/)*(?:@.+(?:\\/|(?:%2f)))?([^/]+)\\/(?:-|download)\\/\\1-[^/]+\\.tgz(?:#|$)/,r=>`npm:${r}`],[/^https:\\/\\/npm\\.pkg\\.github\\.com\\/download\\/(?:@[^/]+)\\/(?:[^/]+)\\/(?:[^/]+)\\/(?:[0-9a-f]+)(?:#|$)/,r=>`npm:${r}`],[/^https:\\/\\/npm\\.fontawesome\\.com\\/(?:@[^/]+)\\/([^/]+)\\/-\\/([^/]+)\\/\\1-\\2.tgz(?:#|$)/,r=>`npm:${r}`],[/^https?:\\/\\/[^/]+\\/.*\\/(@[^/]+)\\/([^/]+)\\/-\\/\\1\\/\\2-(?:[.\\d\\w-]+)\\.tgz(?:#|$)/,(r,e)=>xw({protocol:\"npm:\",source:null,selector:r,params:{__archiveUrl:e}})],[/^[^/]+\\.tgz#[0-9a-f]+$/,r=>`npm:${r}`]],W0=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:t}){let i=x.join(e.cwd,e.configuration.get(\"lockfileFilename\"));if(!M.existsSync(i))return;let n=await M.readFilePromise(i,\"utf8\"),s=yi(n);if(Object.prototype.hasOwnProperty.call(s,\"__metadata\"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=aC(a);if(!l){t.reportWarning(14,`Failed to parse the string \"${a}\" into a proper descriptor`);continue}let c=so(l.range)?_t(l,`npm:${l.range}`):l,{version:u,resolved:g}=s[a];if(!g)continue;let f;for(let[p,C]of TMe){let y=g.match(p);if(y){f=C(u,...y);break}}if(!f){t.reportWarning(14,`${tr(e.configuration,c)}: Only some patterns can be imported from legacy lockfiles (not \"${g}\")`);continue}let h=c;try{let p=vf(c.range),C=aC(p.selector,!0);C&&(h=C)}catch{}o.set(c.descriptorHash,rn(h,f))}}supportsDescriptor(e,t){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!this.resolutions)throw new Error(\"Assertion failed: The resolution store should have been setup\");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error(\"Assertion failed: The resolution should have been registered\");return await this.resolver.getCandidates(HD(n),t,i)}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}};var z0=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return!!(t.project.storedResolutions.get(e.descriptorHash)||t.project.originalPackages.has(Sw(e).locatorHash))}supportsLocator(e,t){return!!(t.project.originalPackages.has(e.locatorHash)&&!t.project.lockfileNeedsRefresh)}shouldPersistResolution(e,t){throw new Error(\"The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){let n=i.project.originalPackages.get(Sw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error(\"Expected the resolution to have been successful - resolution not found\");if(n=i.project.originalPackages.get(s),!n)throw new Error(\"Expected the resolution to have been successful - package not found\");return[n]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.originalPackages.get(e.locatorHash);if(!i)throw new Error(\"The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache\");return i}};var V0=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.resolver.bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){throw new at(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async getSatisfying(e,t,i){throw new at(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async resolve(e,t){throw new at(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}};var ti=class extends vi{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t==\"function\"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t==\"function\"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){}};var v$=Pe(MD());var bh=class{constructor(e,{project:t}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=t,this.cwd=e}async setup(){var s;this.manifest=(s=await ot.tryFind(this.cwd))!=null?s:new ot,this.relativeCwd=x.relative(this.project.cwd,this.cwd)||Oe.dot;let e=this.manifest.name?this.manifest.name:qo(null,`${this.computeCandidateName()}-${tn(this.relativeCwd).substring(0,6)}`),t=this.manifest.version?this.manifest.version:\"0.0.0\";this.locator=rn(e,t),this.anchoredDescriptor=_t(this.locator,`${jr.protocol}${this.relativeCwd}`),this.anchoredLocator=rn(this.locator,`${jr.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o);if(i.length===0)return;let n=await(0,v$.default)(i,{cwd:U.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:[\"**/node_modules\",\"**/.git\",\"**/.yarn\"]});n.sort(),await n.reduce(async(o,a)=>{let l=x.resolve(this.cwd,U.toPortablePath(a)),c=await M.existsPromise(x.join(l,\"package.json\"));await o,c&&this.workspacesCwds.add(l)},Promise.resolve())}accepts(e){var o;let t=e.indexOf(\":\"),i=t!==-1?e.slice(0,t+1):null,n=t!==-1?e.slice(t+1):e;if(i===jr.protocol&&x.normalize(n)===this.relativeCwd||i===jr.protocol&&(n===\"*\"||n===\"^\"||n===\"~\"))return!0;let s=so(n);return s?i===jr.protocol?s.test((o=this.manifest.version)!=null?o:\"0.0.0\"):this.project.configuration.get(\"enableTransparentWorkspaces\")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?\"root-workspace\":`${x.basename(this.cwd)}`||\"unnamed-workspace\"}getRecursiveWorkspaceDependencies({dependencies:e=ot.hardDependencies}={}){let t=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||t.has(a)||(t.add(a),i(a))}};return i(this),t}getRecursiveWorkspaceDependents({dependencies:e=ot.hardDependencies}={}){let t=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&oC(c.anchoredLocator,n.anchoredLocator)}))&&!t.has(s)&&(t.add(s),i(s))};return i(this),t}getRecursiveWorkspaceChildren(){let e=[];for(let t of this.workspacesCwds){let i=this.project.workspacesByCwd.get(t);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let t=x.join(this.cwd,ot.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)}\n`;await M.changeFilePromise(t,i,{automaticNewlines:!0}),this.manifest.raw=e}};var x$=6,OMe=1,MMe=/ *, */g,P$=/\\/$/,UMe=32,KMe=(0,JN.promisify)(WN.default.gzip),HMe=(0,JN.promisify)(WN.default.gunzip),es=(t=>(t.UpdateLockfile=\"update-lockfile\",t.SkipBuild=\"skip-build\",t))(es||{}),jN={restoreInstallersCustomData:[\"installersCustomData\"],restoreResolutions:[\"accessibleLocators\",\"conditionalLocators\",\"disabledLocators\",\"optionalBuilds\",\"storedDescriptors\",\"storedResolutions\",\"storedPackages\",\"lockFileChecksum\"],restoreBuildState:[\"storedBuildState\"]},D$=r=>tn(`${OMe}`,r),je=class{constructor(e,{configuration:t}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=t,this.cwd=e}static async find(e,t){var p,C,y;if(!e.projectCwd)throw new be(`No project found in ${t}`);let i=e.projectCwd,n=t,s=null;for(;s!==e.projectCwd;){if(s=n,M.existsSync(x.join(s,xt.manifest))){i=s;break}n=x.dirname(s)}let o=new je(e.projectCwd,{configuration:e});(p=ye.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(C=ye.telemetry)==null||C.reportWorkspaceCount(o.workspaces.length),(y=ye.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((B,v)=>B+v.manifest.dependencies.size+v.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=$e(e,o.cwd,Ke.PATH),u=$e(e,x.relative(o.cwd,i),Ke.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new be(`The nearest package directory (${$e(e,i,Ke.PATH)}) doesn't seem to be part of the project declared in ${$e(e,o.cwd,Ke.PATH)}.\n\n${[g,f,h].join(`\n`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=x.join(this.cwd,this.configuration.get(\"lockfileFilename\")),t=this.configuration.get(\"defaultLanguageName\");if(M.existsSync(e)){let n=await M.readFilePromise(e,\"utf8\");this.lockFileChecksum=D$(n);let s=yi(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o<x$;for(let l of Object.keys(s)){if(l===\"__metadata\")continue;let c=s[l];if(typeof c.resolution>\"u\")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${l})`);let u=Dc(c.resolution,!0),g=new ot;g.load(c,{yamlCompatibilityMode:!0});let f=g.version,h=g.languageName||t,p=c.linkType.toUpperCase(),C=(i=c.conditions)!=null?i:null,y=g.dependencies,B=g.peerDependencies,v=g.dependenciesMeta,D=g.peerDependenciesMeta,L=g.bin;if(c.checksum!=null){let j=typeof a<\"u\"&&!c.checksum.includes(\"/\")?`${a}/${c.checksum}`:c.checksum;this.storedChecksums.set(u.locatorHash,j)}let H={...u,version:f,languageName:h,linkType:p,conditions:C,dependencies:y,peerDependencies:B,dependenciesMeta:v,peerDependenciesMeta:D,bin:L};this.originalPackages.set(H.locatorHash,H);for(let j of l.split(MMe)){let $=WA(j);this.storedDescriptors.set($.descriptorHash,$),this.storedResolutions.set($.descriptorHash,u.locatorHash)}}}}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,t=(0,_0.default)(4),i=async(n,s)=>{if(e.has(s))return n;e.add(s);let o=new bh(s,{project:this});await t(()=>o.setup());let a=n.then(()=>{this.addWorkspace(o);let l=this.storedPackages.get(o.anchoredLocator.locatorHash);l&&(o.dependencies=l.dependencies)});return Array.from(o.workspacesCwds).reduce(i,a)};await i(Promise.resolve(),this.cwd)}addWorkspace(e){let t=this.workspacesByIdent.get(e.locator.identHash);if(typeof t<\"u\")throw new Error(`Duplicate workspace name ${Ai(this.configuration,e.locator)}: ${U.fromPortablePath(e.cwd)} conflicts with ${U.fromPortablePath(t.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.locator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){x.isAbsolute(e)||(e=x.resolve(this.cwd,e)),e=x.normalize(e).replace(/\\/+$/,\"\");let t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){let t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(let i of this.workspaces)x.relative(i.cwd,e).startsWith(\"../\")||t&&t.cwd.length>=i.cwd.length||(t=i);return t||null}getWorkspaceByFilePath(e){let t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){let t=this.workspacesByIdent.get(e.identHash);return typeof t>\"u\"?null:t}getWorkspaceByIdent(e){let t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${Ai(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){let t=this.tryWorkspaceByIdent(e);return t===null||(JA(e)&&(e=iC(e)),!t.accepts(e.range))?null:t}getWorkspaceByDescriptor(e){let t=this.tryWorkspaceByDescriptor(e);if(t===null)throw new Error(`Workspace not found (${tr(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){let t=this.tryWorkspaceByIdent(e);return t===null||(jo(e)&&(e=nC(e)),t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash)?null:t}getWorkspaceByLocator(e){let t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${mt(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(let e of this.workspaces){let t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${lC(this.configuration,e)} (${$e(this.configuration,x.join(e.cwd,xt.manifest),Ke.PATH)}) to have been resolved. Run \"yarn install\" to update the lockfile`);e.dependencies=new Map(t.dependencies)}}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if(\"descriptorHash\"in e){let t=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let i=new Set(this.storedResolutions.values());typeof t<\"u\"&&!i.has(t)&&this.deleteLocator(t)}if(\"locatorHash\"in e){this.deleteLocator(e.locatorHash);for(let[t,i]of this.storedResolutions)i===e.locatorHash&&this.deleteDescriptor(t)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),t=new Map;for(let[i,n]of this.storedResolutions.entries()){let s=t.get(n);s||t.set(n,s=new Set),s.add(i)}for(let i of this.originalPackages.values()){let n;try{n=e.shouldPersistResolution(i,{project:this,resolver:e})}catch{n=!1}if(!n){this.deleteLocator(i.locatorHash);let s=t.get(i.locatorHash);if(s){t.delete(i.locatorHash);for(let o of s)this.deleteDescriptor(o)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[t,i]of e.dependencies)JA(i)&&e.dependencies.set(t,iC(i))}getDependencyMeta(e,t){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),t===null||!k$.default.valid(t))return i;for(let[a,l]of s)a!==null&&a===t&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:t=!1}={}){let i=new ti,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(t&&(await o.findPackageLocation(a,s)).replace(P$,\"\")!==e.replace(P$,\"\"))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error(\"Workspaces must have been setup before calling this function\");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let t=e.resolver||this.configuration.makeResolver(),i=new W0(t);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new V0(t)]:[i,t],s=new kf([new z0(t),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,C=new Set,y=[],B=$D(),v=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(vi.progressViaTitle(),async W=>{let _=async O=>{let F=await df(async()=>await s.resolve(O,a),ke=>`${mt(this.configuration,O)}: ${ke}`);if(!oC(O,F))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${mt(this.configuration,O)} to ${mt(this.configuration,F)})`);g.set(F.locatorHash,F);let ue=this.configuration.normalizePackage(F);for(let[ke,Fe]of ue.dependencies){let Ne=await this.configuration.reduceHook(le=>le.reduceDependency,Fe,this,ue,Fe,{resolver:s,resolveOptions:a});if(!sC(Fe,Ne))throw new Error(\"Assertion failed: The descriptor ident cannot be changed through aliases\");let oe=s.bindDescriptor(Ne,O,a);ue.dependencies.set(ke,oe)}let pe=io([...ue.dependencies.values()].map(ke=>re(ke)));return y.push(pe),pe.catch(()=>{}),c.set(ue.locatorHash,ue),ue},A=async O=>{let F=f.get(O.locatorHash);if(typeof F<\"u\")return F;let ue=Promise.resolve().then(()=>_(O));return f.set(O.locatorHash,ue),ue},Ae=async(O,F)=>{let ue=await re(F);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,ue.locatorHash),ue},ge=async O=>{W.setTitle(tr(this.configuration,O));let F=this.resolutionAliases.get(O.descriptorHash);if(typeof F<\"u\")return Ae(O,this.storedDescriptors.get(F));let ue=s.getResolutionDependencies(O,a),pe=new Map(await io(ue.map(async Ne=>{let oe=s.bindDescriptor(Ne,p,a),le=await re(oe);return C.add(le.locatorHash),[Ne.descriptorHash,le]}))),Fe=(await df(async()=>await s.getCandidates(O,pe,a),Ne=>`${tr(this.configuration,O)}: ${Ne}`))[0];if(typeof Fe>\"u\")throw new Error(`${tr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,Fe.locatorHash),A(Fe)},re=O=>{let F=h.get(O.descriptorHash);if(typeof F<\"u\")return F;l.set(O.descriptorHash,O);let ue=Promise.resolve().then(()=>ge(O));return h.set(O.descriptorHash,ue),ue};for(let O of this.workspaces){let F=O.anchoredDescriptor;y.push(re(F))}for(;y.length>0;){let O=[...y];y.length=0,await io(O)}});let D=new Set(this.resolutionAliases.values()),L=new Set(c.keys()),H=new Set,j=new Map;GMe({project:this,report:e.report,accessibleLocators:H,volatileDescriptors:D,optionalBuilds:L,peerRequirements:j,allDescriptors:l,allResolutions:u,allPackages:c});for(let W of C)L.delete(W);for(let W of D)l.delete(W),u.delete(W);let $=new Set,V=new Set;for(let W of c.values())W.conditions!=null&&(!L.has(W.locatorHash)||(kw(W,v)||(kw(W,B)&&e.report.reportWarningOnce(77,`${mt(this.configuration,W)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${$e(this.configuration,\"supportedArchitectures\",xi.SETTING)} setting`),V.add(W.locatorHash)),$.add(W.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=H,this.conditionalLocators=$,this.disabledLocators=V,this.originalPackages=g,this.optionalBuilds=L,this.peerRequirements=j,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,cacheOptions:s},l=Array.from(new Set(Bn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error(\"Assertion failed: The locator should have been registered\");return Es(h)}])));n===\"update-lockfile\"&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=vi.progressViaCounter(l.length);await t.reportProgress(u);let g=(0,_0.default)(UMe);if(await t.startCacheReport(async()=>{await io(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error(\"Assertion failed: The locator should have been registered\");if(jo(h))return;let p;try{p=await o.fetch(h,a)}catch(C){C.message=`${mt(this.configuration,h)}: ${C.message}`,t.reportExceptionOnce(C),c=C;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:t,fetcher:i,mode:n}){var Ae,ge,re;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:t},u=new Map(l.map(O=>{let F=O.makeInstaller(c),ue=F.getCustomDataKey(),pe=this.installersCustomData.get(ue);return typeof pe<\"u\"&&F.attachCustomData(pe),[O,F]})),g=new Map,f=new Map,h=new Map,p=new Map(await io([...this.accessibleLocators].map(async O=>{let F=this.storedPackages.get(O);if(!F)throw new Error(\"Assertion failed: The locator should have been registered\");return[O,await o.fetch(F,a)]}))),C=[];for(let O of this.accessibleLocators){let F=this.storedPackages.get(O);if(typeof F>\"u\")throw new Error(\"Assertion failed: The locator should have been registered\");let ue=p.get(F.locatorHash);if(typeof ue>\"u\")throw new Error(\"Assertion failed: The fetch result should have been registered\");let pe=[],ke=Ne=>{pe.push(Ne)},Fe=this.tryWorkspaceByLocator(F);if(Fe!==null){let Ne=[],{scripts:oe}=Fe.manifest;for(let Be of[\"preinstall\",\"install\",\"postinstall\"])oe.has(Be)&&Ne.push([0,Be]);try{for(let[Be,fe]of u)if(Be.supportsPackage(F,c)&&(await fe.installPackage(F,ue,{holdFetchResult:ke})).buildDirective!==null)throw new Error(\"Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core\")}finally{pe.length===0?(Ae=ue.releaseFs)==null||Ae.call(ue):C.push(io(pe).catch(()=>{}).then(()=>{var Be;(Be=ue.releaseFs)==null||Be.call(ue)}))}let le=x.join(ue.packageFs.getRealPath(),ue.prefixPath);f.set(F.locatorHash,le),!jo(F)&&Ne.length>0&&h.set(F.locatorHash,{directives:Ne,buildLocations:[le]})}else{let Ne=l.find(Be=>Be.supportsPackage(F,c));if(!Ne)throw new at(12,`${mt(this.configuration,F)} isn't supported by any available linker`);let oe=u.get(Ne);if(!oe)throw new Error(\"Assertion failed: The installer should have been registered\");let le;try{le=await oe.installPackage(F,ue,{holdFetchResult:ke})}finally{pe.length===0?(ge=ue.releaseFs)==null||ge.call(ue):C.push(io(pe).then(()=>{}).then(()=>{var Be;(Be=ue.releaseFs)==null||Be.call(ue)}))}g.set(F.locatorHash,Ne),f.set(F.locatorHash,le.packageLocation),le.buildDirective&&le.buildDirective.length>0&&le.packageLocation&&h.set(F.locatorHash,{directives:le.buildDirective,buildLocations:[le.packageLocation]})}}let y=new Map;for(let O of this.accessibleLocators){let F=this.storedPackages.get(O);if(!F)throw new Error(\"Assertion failed: The locator should have been registered\");let ue=this.tryWorkspaceByLocator(F)!==null,pe=async(ke,Fe)=>{let Ne=f.get(F.locatorHash);if(typeof Ne>\"u\")throw new Error(`Assertion failed: The package (${mt(this.configuration,F)}) should have been registered`);let oe=[];for(let le of F.dependencies.values()){let Be=this.storedResolutions.get(le.descriptorHash);if(typeof Be>\"u\")throw new Error(`Assertion failed: The resolution (${tr(this.configuration,le)}, from ${mt(this.configuration,F)})should have been registered`);let fe=this.storedPackages.get(Be);if(typeof fe>\"u\")throw new Error(`Assertion failed: The package (${Be}, resolved from ${tr(this.configuration,le)}) should have been registered`);let ae=this.tryWorkspaceByLocator(fe)===null?g.get(Be):null;if(typeof ae>\"u\")throw new Error(`Assertion failed: The package (${Be}, resolved from ${tr(this.configuration,le)}) should have been registered`);ae===ke||ae===null?f.get(fe.locatorHash)!==null&&oe.push([le,fe]):!ue&&Ne!==null&&hf(y,Be).push(Ne)}Ne!==null&&await Fe.attachInternalDependencies(F,oe)};if(ue)for(let[ke,Fe]of u)ke.supportsPackage(F,c)&&await pe(ke,Fe);else{let ke=g.get(F.locatorHash);if(!ke)throw new Error(\"Assertion failed: The linker should have been found\");let Fe=u.get(ke);if(!Fe)throw new Error(\"Assertion failed: The installer should have been registered\");await pe(ke,Fe)}}for(let[O,F]of y){let ue=this.storedPackages.get(O);if(!ue)throw new Error(\"Assertion failed: The package should have been registered\");let pe=g.get(ue.locatorHash);if(!pe)throw new Error(\"Assertion failed: The linker should have been found\");let ke=u.get(pe);if(!ke)throw new Error(\"Assertion failed: The installer should have been registered\");await ke.attachExternalDependents(ue,F)}let B=new Map;for(let O of u.values()){let F=await O.finalizeInstall();for(let ue of(re=F==null?void 0:F.records)!=null?re:[])h.set(ue.locatorHash,{directives:ue.buildDirective,buildLocations:ue.buildLocations});typeof(F==null?void 0:F.customData)<\"u\"&&B.set(O.getCustomDataKey(),F.customData)}if(this.installersCustomData=B,await io(C),n===\"skip-build\")return;let v=new Set(this.storedPackages.keys()),D=new Set(h.keys());for(let O of D)v.delete(O);let L=(0,X0.createHash)(\"sha512\");L.update(process.versions.node),await this.configuration.triggerHook(O=>O.globalHashGeneration,this,O=>{L.update(\"\\0\"),L.update(O)});let H=L.digest(\"hex\"),j=new Map,$=O=>{let F=j.get(O.locatorHash);if(typeof F<\"u\")return F;let ue=this.storedPackages.get(O.locatorHash);if(typeof ue>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");let pe=(0,X0.createHash)(\"sha512\");pe.update(O.locatorHash),j.set(O.locatorHash,\"<recursive>\");for(let ke of ue.dependencies.values()){let Fe=this.storedResolutions.get(ke.descriptorHash);if(typeof Fe>\"u\")throw new Error(`Assertion failed: The resolution (${tr(this.configuration,ke)}) should have been registered`);let Ne=this.storedPackages.get(Fe);if(typeof Ne>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");pe.update($(Ne))}return F=pe.digest(\"hex\"),j.set(O.locatorHash,F),F},V=(O,F)=>{let ue=(0,X0.createHash)(\"sha512\");ue.update(H),ue.update($(O));for(let pe of F)ue.update(pe);return ue.digest(\"hex\")},W=new Map,_=!1,A=O=>{let F=new Set([O.locatorHash]);for(let ue of F){let pe=this.storedPackages.get(ue);if(!pe)throw new Error(\"Assertion failed: The package should have been registered\");for(let ke of pe.dependencies.values()){let Fe=this.storedResolutions.get(ke.descriptorHash);if(!Fe)throw new Error(`Assertion failed: The resolution (${tr(this.configuration,ke)}) should have been registered`);if(Fe!==O.locatorHash&&D.has(Fe))return!1;let Ne=this.storedPackages.get(Fe);if(!Ne)throw new Error(\"Assertion failed: The package should have been registered\");let oe=this.tryWorkspaceByLocator(Ne);if(oe){if(oe.anchoredLocator.locatorHash!==O.locatorHash&&D.has(oe.anchoredLocator.locatorHash))return!1;F.add(oe.anchoredLocator.locatorHash)}F.add(Fe)}}return!0};for(;D.size>0;){let O=D.size,F=[];for(let ue of D){let pe=this.storedPackages.get(ue);if(!pe)throw new Error(\"Assertion failed: The package should have been registered\");if(!A(pe))continue;let ke=h.get(pe.locatorHash);if(!ke)throw new Error(\"Assertion failed: The build directive should have been registered\");let Fe=V(pe,ke.buildLocations);if(this.storedBuildState.get(pe.locatorHash)===Fe){W.set(pe.locatorHash,Fe),D.delete(ue);continue}_||(await this.persistInstallStateFile(),_=!0),this.storedBuildState.has(pe.locatorHash)?t.reportInfo(8,`${mt(this.configuration,pe)} must be rebuilt because its dependency tree changed`):t.reportInfo(7,`${mt(this.configuration,pe)} must be built because it never has been before or the last one failed`);let Ne=ke.buildLocations.map(async oe=>{if(!x.isAbsolute(oe))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${oe})`);for(let[le,Be]of ke.directives){let fe=`# This file contains the result of Yarn building a package (${Es(pe)})\n`;switch(le){case 0:fe+=`# Script name: ${Be}\n`;break;case 1:fe+=`# Script code: ${Be}\n`;break}let ae=null;if(!await M.mktempPromise(async ne=>{let Y=x.join(ne,\"build.log\"),{stdout:he,stderr:ie}=this.configuration.getSubprocessStreams(Y,{header:fe,prefix:mt(this.configuration,pe),report:t}),de;try{switch(le){case 0:de=await LB(pe,Be,[],{cwd:oe,project:this,stdin:ae,stdout:he,stderr:ie});break;case 1:de=await JR(pe,Be,[],{cwd:oe,project:this,stdin:ae,stdout:he,stderr:ie});break}}catch(Pt){ie.write(Pt.stack),de=1}if(he.end(),ie.end(),de===0)return!0;M.detachTemp(ne);let _e=`${mt(this.configuration,pe)} couldn't be built successfully (exit code ${$e(this.configuration,de,Ke.NUMBER)}, logs can be found here: ${$e(this.configuration,Y,Ke.PATH)})`;return this.optionalBuilds.has(pe.locatorHash)?(t.reportInfo(9,_e),!0):(t.reportError(9,_e),!1)}))return!1}return!0});F.push(...Ne,Promise.allSettled(Ne).then(oe=>{D.delete(ue),oe.every(le=>le.status===\"fulfilled\"&&le.value===!0)&&W.set(pe.locatorHash,Fe)}))}if(await io(F),O===D.size){let ue=Array.from(D).map(pe=>{let ke=this.storedPackages.get(pe);if(!ke)throw new Error(\"Assertion failed: The package should have been registered\");return mt(this.configuration,ke)}).join(\", \");t.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ue})`);break}}this.storedBuildState=W}async install(e){var a,l;let t=this.configuration.get(\"nodeLinker\");(a=ye.telemetry)==null||a.reportInstall(t),await e.report.startTimerPromise(\"Project validation\",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=\"inactive\";let i=x.join(this.cwd,this.configuration.get(\"lockfileFilename\")),n=null;if(e.immutable)try{n=await M.readFilePromise(i,\"utf8\")}catch(c){throw c.code===\"ENOENT\"?new at(28,\"The lockfile would have been created by this install, which is explicitly forbidden.\"):c}await e.report.startTimerPromise(\"Resolution step\",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise(\"Post-resolution validation\",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=$e(this.configuration,g,Ke.PACKAGE_EXTENSION);switch(g.status){case\"inactive\":e.report.reportWarning(68,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case\"redundant\":e.report.reportWarning(69,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=Vl(n,this.generateLockfile());if(c!==n){let u=IZ(i,i,n,c,void 0,void 0,{maxEditLength:100});if(u){e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith(\"+\")?e.report.reportError(28,$e(this.configuration,f,Ke.ADDED)):f.startsWith(\"-\")?e.report.reportError(28,$e(this.configuration,f,Ke.REMOVED)):e.report.reportInfo(null,$e(this.configuration,f,\"grey\"))}e.report.reportSeparator()}throw new at(28,\"The lockfile would have been modified by this install, which is explicitly forbidden.\")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===\"active\"&&((l=ye.telemetry)==null||l.reportPackageExtension(Bc(g,Ke.PACKAGE_EXTENSION)));await e.report.startTimerPromise(\"Fetch step\",async()=>{await this.fetchEverything(e),(typeof e.persistProject>\"u\"||e.persistProject)&&e.mode!==\"update-lockfile\"&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get(\"immutablePatterns\"))].sort():[],o=await Promise.all(s.map(async c=>bw(c,{cwd:this.cwd})));(typeof e.persistProject>\"u\"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise(\"Link step\",async()=>{if(e.mode===\"update-lockfile\"){e.report.reportWarning(73,`Skipped due to ${$e(this.configuration,\"mode=update-lockfile\",Ke.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>bw(u,{cwd:this.cwd})));for(let u=0;u<s.length;++u)o[u]!==c[u]&&e.report.reportError(64,`The checksum for ${s[u]} has been modified by this install, which is explicitly forbidden.`)}),await this.persistInstallStateFile(),await this.configuration.triggerHook(c=>c.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let t={};t.__metadata={version:x$,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error(\"Assertion failed: The descriptor should have been registered\");a.push(h)}let l=a.map(f=>bn(f)).sort().join(\", \"),c=new ot;c.version=o.linkType===\"HARD\"?o.version:\"0.0.0-use.local\",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g<\"u\"){let f=g.indexOf(\"/\");if(f===-1)throw new Error(\"Assertion failed: Expected the checksum to reference its cache key\");let h=g.slice(0,f),p=g.slice(f+1);typeof t.__metadata.cacheKey>\"u\"&&(t.__metadata.cacheKey=h),h===t.__metadata.cacheKey?u=p:u=g}t[l]={...c.exportTo({},{compatibilityMode:!1}),linkType:o.linkType.toLowerCase(),resolution:Es(o),checksum:u,conditions:o.conditions||void 0}}return`${[`# This file is generated by running \"yarn install\" inside your project.\n`,`# Manual changes might be lost - proceed with caution!\n`].join(\"\")}\n`+Ba(t)}async persistLockfile(){let e=x.join(this.cwd,this.configuration.get(\"lockfileFilename\")),t=\"\";try{t=await M.readFilePromise(e,\"utf8\")}catch{}let i=this.generateLockfile(),n=Vl(t,i);n!==t&&(await M.writeFilePromise(e,n),this.lockFileChecksum=D$(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(jN))e.push(...o);let t=(0,Z0.default)(this,e),i=qN.default.serialize(t),n=tn(i);if(this.installStateChecksum===n)return;let s=this.configuration.get(\"installStatePath\");await M.mkdirPromise(x.dirname(s),{recursive:!0}),await M.writeFilePromise(s,await KMe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get(\"installStatePath\"),s;try{let o=await HMe(await M.readFilePromise(n));s=qN.default.deserialize(o),this.installStateChecksum=tn(o)}catch{t&&await this.applyLightResolution();return}e&&typeof s.installersCustomData<\"u\"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,Z0.default)(s,jN.restoreBuildState)),t&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,Z0.default)(s,jN.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ti}),await this.persistInstallStateFile()}async persist(){let e=(0,_0.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(t=>e(()=>t.persistManifest()))])}async cacheCleanup({cache:e,report:t}){if(this.configuration.get(\"enableGlobalCache\"))return;let i=new Set([\".gitignore\"]);if(!ZD(e.cwd,this.cwd)||!await M.existsPromise(e.cwd))return;let n=this.configuration.get(\"preferAggregateCacheInfo\"),s=0,o=null;for(let a of await M.readdirPromise(e.cwd)){if(i.has(a))continue;let l=x.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?t.reportError(56,`${$e(this.configuration,x.basename(l),\"magenta\")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:t.reportInfo(19,`${$e(this.configuration,x.basename(l),\"magenta\")} appears to be unused - removing`),await M.removePromise(l)))}n&&s!==0&&t.reportInfo(19,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function GMe({project:r,allDescriptors:e,allResolutions:t,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l}){var V;let c=new Map,u=[],g=new Map,f=new Map,h=new Map,p=new Map,C=new Map,y=new Map(r.workspaces.map(W=>{let _=W.anchoredLocator.locatorHash,A=i.get(_);if(typeof A>\"u\")throw new Error(\"Assertion failed: The workspace should have an associated package\");return[_,rC(A)]})),B=()=>{let W=M.mktempSync(),_=x.join(W,\"stacktrace.log\"),A=String(u.length+1).length,Ae=u.map((ge,re)=>`${`${re+1}.`.padStart(A,\" \")} ${Es(ge)}\n`).join(\"\");throw M.writeFileSync(_,Ae),M.detachTemp(W),new at(45,`Encountered a stack overflow when resolving peer dependencies; cf ${U.fromPortablePath(_)}`)},v=W=>{let _=t.get(W.descriptorHash);if(typeof _>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let A=i.get(_);if(!A)throw new Error(\"Assertion failed: The package could not be found\");return A},D=(W,_,A,{top:Ae,optional:ge})=>{u.length>1e3&&B(),u.push(_);let re=L(W,_,A,{top:Ae,optional:ge});return u.pop(),re},L=(W,_,A,{top:Ae,optional:ge})=>{if(n.has(_.locatorHash))return;n.add(_.locatorHash),ge||s.delete(_.locatorHash);let re=i.get(_.locatorHash);if(!re)throw new Error(`Assertion failed: The package (${mt(r.configuration,_)}) should have been registered`);let O=[],F=[],ue=[],pe=[],ke=[];for(let Ne of Array.from(re.dependencies.values())){if(re.peerDependencies.has(Ne.identHash)&&re.locatorHash!==Ae)continue;if(JA(Ne))throw new Error(\"Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch\");a.delete(Ne.descriptorHash);let oe=ge;if(!oe){let Y=re.dependenciesMeta.get(Ot(Ne));if(typeof Y<\"u\"){let he=Y.get(null);typeof he<\"u\"&&he.optional&&(oe=!0)}}let le=t.get(Ne.descriptorHash);if(!le)throw new Error(`Assertion failed: The resolution (${tr(r.configuration,Ne)}) should have been registered`);let Be=y.get(le)||i.get(le);if(!Be)throw new Error(`Assertion failed: The package (${le}, resolved from ${tr(r.configuration,Ne)}) should have been registered`);if(Be.peerDependencies.size===0){D(Ne,Be,new Map,{top:Ae,optional:oe});continue}let fe,ae,qe=new Set,ne;F.push(()=>{fe=GD(Ne,_.locatorHash),ae=YD(Be,_.locatorHash),re.dependencies.delete(Ne.identHash),re.dependencies.set(fe.identHash,fe),t.set(fe.descriptorHash,ae.locatorHash),e.set(fe.descriptorHash,fe),i.set(ae.locatorHash,ae),O.push([Be,fe,ae])}),ue.push(()=>{var Y;ne=new Map;for(let he of ae.peerDependencies.values()){let ie=re.dependencies.get(he.identHash);if(!ie&&sC(_,he)&&(W.identHash===_.identHash?ie=W:(ie=_t(_,W.range),e.set(ie.descriptorHash,ie),t.set(ie.descriptorHash,_.locatorHash),a.delete(ie.descriptorHash))),(!ie||ie.range===\"missing:\")&&ae.dependencies.has(he.identHash)){ae.peerDependencies.delete(he.identHash);continue}ie||(ie=_t(he,\"missing:\")),ae.dependencies.set(ie.identHash,ie),JA(ie)&&wc(h,ie.descriptorHash).add(ae.locatorHash),g.set(ie.identHash,ie),ie.range===\"missing:\"&&qe.add(ie.identHash),ne.set(he.identHash,(Y=A.get(he.identHash))!=null?Y:ae.locatorHash)}ae.dependencies=new Map(Bn(ae.dependencies,([he,ie])=>Ot(ie)))}),pe.push(()=>{if(!i.has(ae.locatorHash))return;let Y=c.get(Be.locatorHash);typeof Y==\"number\"&&Y>=2&&B();let he=c.get(Be.locatorHash),ie=typeof he<\"u\"?he+1:1;c.set(Be.locatorHash,ie),D(fe,ae,ne,{top:Ae,optional:oe}),c.set(Be.locatorHash,ie-1)}),ke.push(()=>{let Y=re.dependencies.get(Ne.identHash);if(typeof Y>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency to have been turned into a dependency\");let he=t.get(Y.descriptorHash);if(typeof he>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");if(wc(C,he).add(_.locatorHash),!!i.has(ae.locatorHash)){for(let ie of ae.peerDependencies.values()){let de=ne.get(ie.identHash);if(typeof de>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency ident to be registered\");hf(pf(p,de),Ot(ie)).push(ae.locatorHash)}for(let ie of qe)ae.dependencies.delete(ie)}})}for(let Ne of[...F,...ue])Ne();let Fe;do{Fe=!0;for(let[Ne,oe,le]of O){let Be=pf(f,Ne.locatorHash),fe=tn(...[...le.dependencies.values()].map(Y=>{let he=Y.range!==\"missing:\"?t.get(Y.descriptorHash):\"missing:\";if(typeof he>\"u\")throw new Error(`Assertion failed: Expected the resolution for ${tr(r.configuration,Y)} to have been registered`);return he===Ae?`${he} (top)`:he}),oe.identHash),ae=Be.get(fe);if(typeof ae>\"u\"){Be.set(fe,oe);continue}if(ae===oe)continue;i.delete(le.locatorHash),e.delete(oe.descriptorHash),t.delete(oe.descriptorHash),n.delete(le.locatorHash);let qe=h.get(oe.descriptorHash)||[],ne=[re.locatorHash,...qe];h.delete(oe.descriptorHash);for(let Y of ne){let he=i.get(Y);typeof he>\"u\"||(he.dependencies.get(oe.identHash).descriptorHash!==ae.descriptorHash&&(Fe=!1),he.dependencies.set(oe.identHash,ae))}}}while(!Fe);for(let Ne of[...pe,...ke])Ne()};for(let W of r.workspaces){let _=W.anchoredLocator;a.delete(W.anchoredDescriptor.descriptorHash),D(W.anchoredDescriptor,_,new Map,{top:_.locatorHash,optional:!1})}let H;(A=>(A[A.NotProvided=0]=\"NotProvided\",A[A.NotCompatible=1]=\"NotCompatible\"))(H||(H={}));let j=[];for(let[W,_]of C){let A=i.get(W);if(typeof A>\"u\")throw new Error(\"Assertion failed: Expected the root to be registered\");let Ae=p.get(W);if(!(typeof Ae>\"u\"))for(let ge of _){let re=i.get(ge);if(!(typeof re>\"u\"))for(let[O,F]of Ae){let ue=en(O);if(re.peerDependencies.has(ue.identHash))continue;let pe=`p${tn(ge,O,W).slice(0,5)}`;o.set(pe,{subject:ge,requested:ue,rootRequester:W,allRequesters:F});let ke=A.dependencies.get(ue.identHash);if(typeof ke<\"u\"){let Fe=v(ke),Ne=(V=Fe.version)!=null?V:\"0.0.0\",oe=new Set;for(let Be of F){let fe=i.get(Be);if(typeof fe>\"u\")throw new Error(\"Assertion failed: Expected the link to be registered\");let ae=fe.peerDependencies.get(ue.identHash);if(typeof ae>\"u\")throw new Error(\"Assertion failed: Expected the ident to be registered\");oe.add(ae.range)}[...oe].every(Be=>{if(Be.startsWith(jr.protocol)){if(!r.tryWorkspaceByLocator(Fe))return!1;Be=Be.slice(jr.protocol.length),(Be===\"^\"||Be===\"~\")&&(Be=\"*\")}return kc(Ne,Be)})||j.push({type:1,subject:re,requested:ue,requester:A,version:Ne,hash:pe,requirementCount:F.length})}else{let Fe=A.peerDependenciesMeta.get(O);Fe!=null&&Fe.optional||j.push({type:0,subject:re,requested:ue,requester:A,hash:pe})}}}}let $=[W=>jD(W.subject),W=>Ot(W.requested),W=>`${W.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning(0,`Some peer dependencies are incorrectly met; run ${$e(r.configuration,\"yarn explain peer-requirements <hash>\",Ke.CODE)} for details, where ${$e(r.configuration,\"<hash>\",Ke.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let W of Bn(j,$))switch(W.type){case 0:l.reportWarning(2,`${mt(r.configuration,W.subject)} doesn't provide ${Ai(r.configuration,W.requested)} (${$e(r.configuration,W.hash,Ke.CODE)}), requested by ${Ai(r.configuration,W.requester)}`);break;case 1:{let _=W.requirementCount>1?\"and some of its descendants request\":\"requests\";l.reportWarning(60,`${mt(r.configuration,W.subject)} provides ${Ai(r.configuration,W.requested)} (${$e(r.configuration,W.hash,Ke.CODE)}) with version ${AC(r.configuration,W.version)}, which doesn't satisfy what ${Ai(r.configuration,W.requester)} ${_}`)}break}})}var Sh=class{constructor(e,t){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!M.existsSync(i),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(\"version\",e.replace(/-git\\..*/,\"-git\"))}reportCommandName(e){this.reportValue(\"commandName\",e||\"<none>\")}reportPluginName(e){this.reportValue(\"pluginName\",e)}reportProject(e){this.reportEnumerator(\"projectCount\",e)}reportInstall(e){this.reportHit(\"installCount\",e)}reportPackageExtension(e){this.reportValue(\"packageExtension\",e)}reportWorkspaceCount(e){this.reportValue(\"workspaceCount\",String(e))}reportDependencyCount(e){this.reportValue(\"dependencyCount\",String(e))}reportValue(e,t){wc(this.values,e).add(t)}reportEnumerator(e,t){wc(this.enumerators,e).add(tn(t))}reportHit(e,t=\"*\"){let i=pf(this.hits,e),n=Na(i,t,()=>0);i.set(t,n+1)}getRegistryPath(){let e=this.configuration.get(\"globalFolder\");return x.join(e,\"telemetry.json\")}sendReport(e){var u,g,f;let t=this.getRegistryPath(),i;try{i=M.readJsonSync(t)}catch{i={}}let n=Date.now(),s=this.configuration.get(\"telemetryInterval\")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{M.mkdirSync(x.dirname(t),{recursive:!0}),M.writeJsonSync(t,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>kR(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let C=p;C.userId=h,C.reportType=\"primary\";for(let v of Object.keys((f=C.enumerators)!=null?f:{}))C.enumerators[v]=C.enumerators[v].length;c(C);let y=new Map,B=20;for(let[v,D]of Object.entries(C.values))D.length>0&&y.set(v,D.slice(0,B));for(;y.size>0;){let v={};v.userId=h,v.reportType=\"secondary\",v.metrics={};for(let[D,L]of y)v.metrics[D]=L.shift(),L.length===0&&y.delete(D);c(v)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),t;try{t=M.readJsonSync(e)}catch{t={}}let i=(o=this.configuration.get(\"telemetryUserId\"))!=null?o:\"*\",n=t.blocks=(a=t.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let C of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},B=y[C]=(u=y[C])!=null?u:{};for(let[v,D]of this.hits.get(C))B[v]=((g=B[v])!=null?g:0)+D}for(let C of[\"values\",\"enumerators\"])for(let y of this[C].keys()){let B=s[C]=(f=s[C])!=null?f:{};B[y]=[...new Set([...(h=B[y])!=null?h:[],...(p=this[C].get(y))!=null?p:[]])]}M.mkdirSync(x.dirname(e),{recursive:!0}),M.writeJsonSync(e,t)}startBuffer(){process.on(\"exit\",()=>{try{this.applyChanges()}catch{}})}};var zN=J(\"child_process\"),R$=Pe(Ac());var VN=J(\"fs\");var vh=new Map([[\"constraints\",[[\"constraints\",\"query\"],[\"constraints\",\"source\"],[\"constraints\"]]],[\"exec\",[]],[\"interactive-tools\",[[\"search\"],[\"upgrade-interactive\"]]],[\"stage\",[[\"stage\"]]],[\"typescript\",[]],[\"version\",[[\"version\",\"apply\"],[\"version\",\"check\"],[\"version\"]]],[\"workspace-tools\",[[\"workspaces\",\"focus\"],[\"workspaces\",\"foreach\"]]]]);function YMe(r){let e=U.fromPortablePath(r);process.on(\"SIGINT\",()=>{}),e?(0,zN.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\",YARN_IGNORE_CWD:\"1\"}}):(0,zN.execFileSync)(e,process.argv.slice(2),{stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\",YARN_IGNORE_CWD:\"1\"}})}async function $0({binaryVersion:r,pluginConfiguration:e}){async function t(){let n=new Hn({binaryLabel:\"Yarn Package Manager\",binaryName:\"yarn\",binaryVersion:r});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var C,y,B,v,D;let s=process.versions.node,o=\">=12 <14 || 14.2 - 14.9 || >14.10.0\";if(!Ie.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!vt.satisfiesWithPrereleases(s,o))throw new be(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \\`YARN_IGNORE_NODE=1\\` in your environment.`);let l=await ye.find(U.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get(\"yarnPath\"),u=l.get(\"ignorePath\"),g=l.get(\"ignoreCwd\"),f=U.toPortablePath(U.resolve(process.argv[1])),h=L=>M.readFilePromise(L).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH=\"1\",process.env.YARN_IGNORE_CWD=\"1\",await i(n);return}else if(c!==null&&!u)if(!M.existsSync(c))process.stdout.write(n.error(new Error(`The \"yarn-path\" option has been set (in ${l.sources.get(\"yarnPath\")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{YMe(c)}catch(L){process.exitCode=L.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get(\"enableTelemetry\")&&!R$.isCI&&process.stdout.isTTY&&(ye.telemetry=new Sh(l,\"puba9cdc10ec5790a2cf4969dd413a47270\")),(C=ye.telemetry)==null||C.reportVersion(r);for(let[$,V]of l.plugins.entries()){vh.has((B=(y=$.match(/^@yarnpkg\\/plugin-(.*)$/))==null?void 0:y[1])!=null?B:\"\")&&((v=ye.telemetry)==null||v.reportPluginName($));for(let W of V.commands||[])n.register(W)}let H=n.process(process.argv.slice(2));H.help||(D=ye.telemetry)==null||D.reportCommandName(H.path.join(\" \"));let j=H.cwd;if(typeof j<\"u\"&&!g){let $=(0,VN.realpathSync)(process.cwd()),V=(0,VN.realpathSync)(j);if($!==V){process.chdir(j),await t();return}}await n.runExit(H,{cwd:U.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return t().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>M.rmtempPromise())}function F$(r){r.Command.Path=(...e)=>t=>{t.paths=t.paths||[],t.paths.push(e)};for(let e of[\"Array\",\"Boolean\",\"String\",\"Proxy\",\"Rest\",\"Counter\"])r.Command[e]=(...t)=>(i,n)=>{let s=r.Option[e](...t);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return r}var Nm={};ut(Nm,{BaseCommand:()=>De,WorkspaceRequiredError:()=>ct,getDynamicLibs:()=>Jie,getPluginConfiguration:()=>BQ,main:()=>$0,openWorkspace:()=>Hh,pluginCommands:()=>vh});var De=class extends ve{constructor(){super(...arguments);this.cwd=z.String(\"--cwd\",{hidden:!0})}};var ct=class extends be{constructor(e,t){let i=x.relative(e,t),n=x.join(e,ot.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var VYe=Pe(Xr());ls();var XYe=Pe(WL()),Jie=()=>new Map([[\"@yarnpkg/cli\",Nm],[\"@yarnpkg/core\",sm],[\"@yarnpkg/fslib\",Wp],[\"@yarnpkg/libzip\",xC],[\"@yarnpkg/parsers\",td],[\"@yarnpkg/shell\",RC],[\"clipanion\",ud],[\"semver\",VYe],[\"typanion\",fn],[\"yup\",XYe]]);async function Hh(r,e){let{project:t,workspace:i}=await je.find(r,e);if(!i)throw new ct(t.cwd,e);return i}var b9e=Pe(Xr());ls();var S9e=Pe(WL());var pO={};ut(pO,{dedupeUtils:()=>NQ,default:()=>A4e,suggestUtils:()=>qh});var qae=Pe(Ac());var Nse=Pe(Um());ls();var qh={};ut(qh,{Modifier:()=>UT,Strategy:()=>DQ,Target:()=>Km,WorkspaceModifier:()=>xse,applyModifier:()=>Dse,extractDescriptorFromPath:()=>KT,extractRangeModifier:()=>Pse,fetchDescriptorFrom:()=>HT,findProjectDescriptors:()=>Fse,getModifier:()=>Hm,getSuggestedDescriptors:()=>Gm,makeWorkspaceDescriptor:()=>Rse,toWorkspaceModifier:()=>kse});var MT=Pe(Xr()),hqe=\"workspace:\",Km=(i=>(i.REGULAR=\"dependencies\",i.DEVELOPMENT=\"devDependencies\",i.PEER=\"peerDependencies\",i))(Km||{}),UT=(i=>(i.CARET=\"^\",i.TILDE=\"~\",i.EXACT=\"\",i))(UT||{}),xse=(i=>(i.CARET=\"^\",i.TILDE=\"~\",i.EXACT=\"*\",i))(xse||{}),DQ=(s=>(s.KEEP=\"keep\",s.REUSE=\"reuse\",s.PROJECT=\"project\",s.LATEST=\"latest\",s.CACHE=\"cache\",s))(DQ||{});function Hm(r,e){return r.exact?\"\":r.caret?\"^\":r.tilde?\"~\":e.configuration.get(\"defaultSemverRangePrefix\")}var pqe=/^([\\^~]?)[0-9]+(?:\\.[0-9]+){0,2}(?:-\\S+)?$/;function Pse(r,{project:e}){let t=r.match(pqe);return t?t[1]:e.configuration.get(\"defaultSemverRangePrefix\")}function Dse(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return MT.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function kse(r){switch(r){case\"^\":return\"^\";case\"~\":return\"~\";case\"\":return\"*\";default:throw new Error(`Assertion failed: Unknown modifier: \"${r}\"`)}}function Rse(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${hqe}${kse(e)}`)}async function Fse(r,{project:e,target:t}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(t===\"peerDependencies\"){let o=s.manifest.peerDependencies.get(r.identHash);o!==void 0&&n(o).locators.push(s.anchoredLocator)}else{let o=s.manifest.dependencies.get(r.identHash),a=s.manifest.devDependencies.get(r.identHash);t===\"devDependencies\"?a!==void 0?n(a).locators.push(s.anchoredLocator):o!==void 0&&n(o).locators.push(s.anchoredLocator):o!==void 0?n(o).locators.push(s.anchoredLocator):a!==void 0&&n(a).locators.push(s.anchoredLocator)}return i}async function KT(r,{cwd:e,workspace:t}){return await dqe(async i=>{x.isAbsolute(r)||(r=x.relative(t.cwd,x.resolve(e,r)),r.match(/^\\.{0,2}\\//)||(r=`./${r}`));let{project:n}=t,s=await HT(P.makeIdent(null,\"archive\"),r,{project:t.project,cache:i,workspace:t});if(!s)throw new Error(\"Assertion failed: The descriptor should have been found\");let o=new ti,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,t.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await ot.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error(\"Target path doesn't have a name\");return P.makeDescriptor(h.name,r)})}async function Gm(r,{project:e,workspace:t,cache:i,target:n,modifier:s,strategies:o,maxResults:a=1/0}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(r.range!==\"unknown\")return{suggestions:[{descriptor:r,name:`Use ${P.prettyDescriptor(e.configuration,r)}`,reason:\"(unambiguous explicit request)\"}],rejections:[]};let l=typeof t<\"u\"&&t!==null&&t.manifest[n].get(r.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case\"keep\":await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:\"(no changes)\"})});break;case\"reuse\":await g(async()=>{for(let{descriptor:h,locators:p}of(await Fse(r,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===t.anchoredLocator.locatorHash&&o.includes(\"keep\"))continue;let C=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;C+=p.length>1?` and ${p.length-1} other${p.length>2?\"s\":\"\"})`:\")\",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:C})}});break;case\"cache\":await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===r.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:\"(already used somewhere in the lockfile)\"})});break;case\"project\":await g(async()=>{if(t.manifest.name!==null&&r.identHash===t.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(r);if(h===null)return;let p=Rse(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ee.pretty(e.configuration,h.relativeCwd,ee.Type.PATH)})`})});break;case\"latest\":await g(async()=>{if(r.range!==\"unknown\")c.push({descriptor:r,name:`Use ${P.prettyRange(e.configuration,r.range)}`,reason:\"(explicit range requested)\"});else if(n===\"peerDependencies\")c.push({descriptor:P.makeDescriptor(r,\"*\"),name:\"Use *\",reason:\"(catch-all peer dependency pattern)\"});else if(!e.configuration.get(\"enableNetwork\"))c.push({descriptor:null,name:\"Resolve from latest\",reason:ee.pretty(e.configuration,\"(unavailable because enableNetwork is toggled off)\",\"grey\")});else{let h=await HT(r,\"latest\",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=Dse(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:\"(resolved from latest)\"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function HT(r,e,{project:t,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(r,e),a=new ti,l=t.configuration.makeFetcher(),c=t.configuration.makeResolver(),u={project:t,fetcher:l,cache:i,checksums:t.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g={...u,resolver:c,fetchOptions:u},f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:C,source:y,params:B,selector:v}=P.parseRange(P.convertToManifestRange(p.reference));if(C===t.configuration.get(\"defaultProtocol\")&&(C=null),MT.default.valid(v)&&s!==!1){let D=typeof s==\"string\"?s:o.range;v=Pse(D,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:C,source:y,params:B,selector:v}))}async function dqe(r){return await M.mktempPromise(async e=>{let t=ye.create(e);return t.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await r(new Rt(e,{configuration:t,check:!1,immutable:!1}))})}var Au=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.exact=z.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=z.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=z.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.dev=z.Boolean(\"-D,--dev\",!1,{description:\"Add a package as a dev dependency\"});this.peer=z.Boolean(\"-P,--peer\",!1,{description:\"Add a package as a peer dependency\"});this.optional=z.Boolean(\"-O,--optional\",!1,{description:\"Add / upgrade a package to an optional regular / peer dependency\"});this.preferDev=z.Boolean(\"--prefer-dev\",!1,{description:\"Add / upgrade a package to a dev dependency\"});this.interactive=z.Boolean(\"-i,--interactive\",{description:\"Reuse the specified package from other workspaces in the project\"});this.cached=z.Boolean(\"--cached\",!1,{description:\"Reuse the highest version already used somewhere within the project\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Xi(es)});this.silent=z.Boolean(\"--silent\",{hidden:!0});this.packages=z.Rest()}async execute(){var y;let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=(y=this.interactive)!=null?y:t.get(\"preferInteractive\"),a=Hm(this,i),l=[...o?[\"reuse\"]:[],\"project\",...this.cached?[\"cache\"]:[],\"latest\"],c=o?1/0:1,u=await Promise.all(this.packages.map(async B=>{let v=B.match(/^\\.{0,2}\\//)?await KT(B,{cwd:this.context.cwd,workspace:n}):P.tryParseDescriptor(B),D=B.match(/^(https?:|git@github)/);if(D)throw new be(`It seems you are trying to add a package using a ${ee.pretty(t,`${D[0]}...`,xi.RANGE)} url; we now require package names to be explicitly specified.\nTry running the command again with the package name prefixed: ${ee.pretty(t,\"yarn add\",xi.CODE)} ${ee.pretty(t,P.makeDescriptor(P.makeIdent(null,\"my-package\"),`${D[0]}...`),xi.DESCRIPTOR)}`);if(!v)throw new be(`The ${ee.pretty(t,B,xi.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let L=Cqe(n,v,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(L.map(async j=>{let $=await Gm(v,{project:i,workspace:n,cache:s,target:j,modifier:a,strategies:l,maxResults:c});return{request:v,suggestedDescriptors:$,target:j}}))})).then(B=>B.flat()),g=await ra.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async B=>{for(let{request:v,suggestedDescriptors:{suggestions:D,rejections:L}}of u)if(D.filter(j=>j.descriptor!==null).length===0){let[j]=L;if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");i.configuration.get(\"enableNetwork\")?B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range`):B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),B.reportSeparator(),B.reportExceptionOnce(j)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[],p=[];for(let{suggestedDescriptors:{suggestions:B},target:v}of u){let D,L=B.filter(V=>V.descriptor!==null),H=L[0].descriptor,j=L.every(V=>P.areDescriptorsEqual(V.descriptor,H));L.length===1||j?D=H:(f=!0,{answer:D}=await(0,Nse.prompt)({type:\"select\",name:\"answer\",message:\"Which range do you want to use?\",choices:B.map(({descriptor:V,name:W,reason:_})=>V?{name:W,hint:_,descriptor:V}:{name:W,hint:_,disabled:!0}),onCancel:()=>process.exit(130),result(V){return this.find(V,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let $=n.manifest[v].get(D.identHash);(typeof $>\"u\"||$.descriptorHash!==D.descriptorHash)&&(n.manifest[v].set(D.identHash,D),this.optional&&(v===\"dependencies\"?n.manifest.ensureDependencyMeta({...D,range:\"unknown\"}).optional=!0:v===\"peerDependencies\"&&(n.manifest.ensurePeerDependencyMeta({...D,range:\"unknown\"}).optional=!0)),typeof $>\"u\"?h.push([n,v,D,l]):p.push([n,v,$,D]))}return await t.triggerMultipleHooks(B=>B.afterWorkspaceDependencyAddition,h),await t.triggerMultipleHooks(B=>B.afterWorkspaceDependencyReplacement,p),f&&this.context.stdout.write(`\n`),(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async B=>{await i.install({cache:s,report:B,mode:this.mode})})).exitCode()}};Au.paths=[[\"add\"]],Au.usage=ve.Usage({description:\"add dependencies to the project\",details:\"\\n      This command adds a package to the package.json for the nearest workspace.\\n\\n      - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\\n\\n      - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\\n\\n      - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\\n\\n      - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\\\"peerDependenciesMeta\\\": { \\\"<package>\\\": { \\\"optional\\\": true } }`\\n\\n      - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\\n\\n      - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\\n\\n      If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\\n\\n      If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\\n    \",examples:[[\"Add a regular package to the current workspace\",\"$0 add lodash\"],[\"Add a specific version for a package to the current workspace\",\"$0 add lodash@1.2.3\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using a URL\",\"$0 add lodash@https://github.com/lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol\",\"$0 add lodash@github:lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash@lodash/lodash\"],[\"Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash-es@lodash/lodash#es\"]]});function Cqe(r,e,{dev:t,peer:i,preferDev:n,optional:s}){let o=r.manifest[\"dependencies\"].has(e.identHash),a=r.manifest[\"devDependencies\"].has(e.identHash),l=r.manifest[\"peerDependencies\"].has(e.identHash);if((t||i)&&o)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!t&&!i&&l)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((t||n)&&s)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" cannot simultaneously be a dev dependency and an optional dependency`);let c=[];return i&&c.push(\"peerDependencies\"),(t||n)&&c.push(\"devDependencies\"),s&&c.push(\"dependencies\"),c.length>0?c:a?[\"devDependencies\"]:l?[\"peerDependencies\"]:[\"dependencies\"]}var lu=class extends De{constructor(){super(...arguments);this.verbose=z.Boolean(\"-v,--verbose\",!1,{description:\"Print both the binary name and the locator of the package that provides the binary\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.name=z.String({required:!1})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,locator:n}=await je.find(t,this.context.cwd);if(await i.restoreInstallState(),this.name){let a=(await Wt.getPackageAccessibleBinaries(n,{project:i})).get(this.name);if(!a)throw new be(`Couldn't find a binary named \"${this.name}\" for package \"${P.prettyLocator(t,n)}\"`);let[,l]=a;return this.context.stdout.write(`${l}\n`),0}return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async o=>{let a=await Wt.getPackageAccessibleBinaries(n,{project:i}),c=Array.from(a.keys()).reduce((u,g)=>Math.max(u,g.length),0);for(let[u,[g,f]]of a)o.reportJson({name:u,source:P.stringifyIdent(g),path:f});if(this.verbose)for(let[u,[g]]of a)o.reportInfo(null,`${u.padEnd(c,\" \")}   ${P.prettyLocator(t,g)}`);else for(let u of a.keys())o.reportInfo(null,u)})).exitCode()}};lu.paths=[[\"bin\"]],lu.usage=ve.Usage({description:\"get the path to a binary script\",details:`\n      When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \\`-v,--verbose\\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n      When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n    `,examples:[[\"List all the available binaries\",\"$0 bin\"],[\"Print the path to a specific binary\",\"$0 bin eslint\"]]});var cu=class extends De{constructor(){super(...arguments);this.mirror=z.Boolean(\"--mirror\",!1,{description:\"Remove the global cache files instead of the local cache files\"});this.all=z.Boolean(\"--all\",!1,{description:\"Remove both the global cache files and the local cache files of the current project\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=await Rt.find(t);return(await Ge.start({configuration:t,stdout:this.context.stdout},async()=>{let s=(this.all||this.mirror)&&i.mirrorCwd!==null,o=!this.mirror;s&&(await M.removePromise(i.mirrorCwd),await t.triggerHook(a=>a.cleanGlobalArtifacts,t)),o&&await M.removePromise(i.cwd)})).exitCode()}};cu.paths=[[\"cache\",\"clean\"],[\"cache\",\"clear\"]],cu.usage=ve.Usage({description:\"remove the shared cache files\",details:`\n      This command will remove all the files from the cache.\n    `,examples:[[\"Remove all the local archives\",\"$0 cache clean\"],[\"Remove all the archives stored in the ~/.yarn directory\",\"$0 cache clean --mirror\"]]});var Lse=Pe(uQ()),GT=J(\"util\"),uu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.unsafe=z.Boolean(\"--no-redacted\",!1,{description:\"Don't redact secrets (such as tokens) from the output\"});this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=this.name.replace(/[.[].*$/,\"\"),n=this.name.replace(/^[^.[]*/,\"\");if(typeof t.settings.get(i)>\"u\")throw new be(`Couldn't find a configuration settings named \"${i}\"`);let o=t.getSpecial(i,{hideSecrets:!this.unsafe,getNativePaths:!0}),a=Ie.convertMapsToIndexableObjects(o),l=n?(0,Lse.default)(a,n):a,c=await Ge.start({configuration:t,includeFooter:!1,json:this.json,stdout:this.context.stdout},async u=>{u.reportJson(l)});if(!this.json){if(typeof l==\"string\")return this.context.stdout.write(`${l}\n`),c.exitCode();GT.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,GT.inspect)(l,{depth:1/0,colors:t.get(\"enableColors\"),compact:!1})}\n`)}return c.exitCode()}};uu.paths=[[\"config\",\"get\"]],uu.usage=ve.Usage({description:\"read a configuration settings\",details:`\n      This command will print a configuration setting.\n\n      Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \\`--no-redacted\\` to get the untransformed value.\n    `,examples:[[\"Print a simple configuration setting\",\"yarn config get yarnPath\"],[\"Print a complex configuration setting\",\"yarn config get packageExtensions\"],[\"Print a nested field from the configuration\",`yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'`],[\"Print a token from the configuration\",\"yarn config get npmAuthToken --no-redacted\"],[\"Print a configuration setting as JSON\",\"yarn config get packageExtensions --json\"]]});var Woe=Pe(zT()),zoe=Pe(uQ()),Voe=Pe(Joe()),VT=J(\"util\"),gu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Set complex configuration settings to JSON values\"});this.home=z.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=z.String();this.value=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=()=>{if(!t.projectCwd)throw new be(\"This command must be run from within a project folder\");return t.projectCwd},n=this.name.replace(/[.[].*$/,\"\"),s=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof t.settings.get(n)>\"u\")throw new be(`Couldn't find a configuration settings named \"${n}\"`);if(n===\"enableStrictSettings\")throw new be(\"This setting only affects the file it's in, and thus cannot be set from the CLI\");let a=this.json?JSON.parse(this.value):this.value;await(this.home?p=>ye.updateHomeConfiguration(p):p=>ye.updateConfiguration(i(),p))(p=>{if(s){let C=(0,Woe.default)(p);return(0,Voe.default)(C,this.name,a),C}else return{...p,[n]:a}});let u=(await ye.find(this.context.cwd,this.context.plugins)).getSpecial(n,{hideSecrets:!0,getNativePaths:!0}),g=Ie.convertMapsToIndexableObjects(u),f=s?(0,zoe.default)(g,s):g;return(await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout},async p=>{VT.inspect.styles.name=\"cyan\",p.reportInfo(0,`Successfully set ${this.name} to ${(0,VT.inspect)(f,{depth:1/0,colors:t.get(\"enableColors\"),compact:!1})}`)})).exitCode()}};gu.paths=[[\"config\",\"set\"]],gu.usage=ve.Usage({description:\"change a configuration settings\",details:`\n      This command will set a configuration setting.\n\n      When used without the \\`--json\\` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n      When used with the \\`--json\\` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n    `,examples:[[\"Set a simple configuration setting (a string, a number, or a boolean)\",\"yarn config set initScope myScope\"],[\"Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag\",'yarn config set initScope --json \\\\\"myScope\\\\\"'],[\"Set a complex configuration setting (an Array) using the `--json` flag\",`yarn config set unsafeHttpWhitelist --json '[\"*.example.com\", \"example.com\"]'`],[\"Set a complex configuration setting (an Object) using the `--json` flag\",`yarn config set packageExtensions --json '{ \"@babel/parser@*\": { \"dependencies\": { \"@babel/types\": \"*\" } } }'`],[\"Set a nested configuration setting\",'yarn config set npmScopes.company.npmRegistryServer \"https://npm.example.com\"'],[\"Set a nested configuration setting using indexed access for non-simple keys\",`yarn config set 'npmRegistries[\"//npm.example.com\"].npmAuthToken' \"ffffffff-ffff-ffff-ffff-ffffffffffff\"`]]});var nae=Pe(zT()),sae=Pe(am()),oae=Pe(iae()),fu=class extends De{constructor(){super(...arguments);this.home=z.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=()=>{if(!t.projectCwd)throw new be(\"This command must be run from within a project folder\");return t.projectCwd},n=this.name.replace(/[.[].*$/,\"\"),s=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof t.settings.get(n)>\"u\")throw new be(`Couldn't find a configuration settings named \"${n}\"`);let a=this.home?c=>ye.updateHomeConfiguration(c):c=>ye.updateConfiguration(i(),c);return(await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout},async c=>{let u=!1;await a(g=>{if(!(0,sae.default)(g,this.name))return c.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),u=!0,g;let f=s?(0,nae.default)(g):{...g};return(0,oae.default)(f,this.name),f}),u||c.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};fu.paths=[[\"config\",\"unset\"]],fu.usage=ve.Usage({description:\"unset a configuration setting\",details:`\n      This command will unset a configuration setting.\n    `,examples:[[\"Unset a simple configuration setting\",\"yarn config unset initScope\"],[\"Unset a complex configuration setting\",\"yarn config unset packageExtensions\"],[\"Unset a nested configuration setting\",\"yarn config unset npmScopes.company.npmRegistryServer\"]]});var XT=J(\"util\"),hu=class extends De{constructor(){super(...arguments);this.verbose=z.Boolean(\"-v,--verbose\",!1,{description:\"Print the setting description on top of the regular key/value information\"});this.why=z.Boolean(\"--why\",!1,{description:\"Print the reason why a setting is set a particular way\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async n=>{if(t.invalid.size>0&&!this.json){for(let[s,o]of t.invalid)n.reportError(34,`Invalid configuration key \"${s}\" in ${o}`);n.reportSeparator()}if(this.json){let s=Ie.sortMap(t.settings.keys(),o=>o);for(let o of s){let a=t.settings.get(o),l=t.getSpecial(o,{hideSecrets:!0,getNativePaths:!0}),c=t.sources.get(o);this.verbose?n.reportJson({key:o,effective:l,source:c}):n.reportJson({key:o,effective:l,source:c,...a})}}else{let s=Ie.sortMap(t.settings.keys(),l=>l),o=s.reduce((l,c)=>Math.max(l,c.length),0),a={breakLength:1/0,colors:t.get(\"enableColors\"),maxArrayLength:2};if(this.why||this.verbose){let l=s.map(u=>{let g=t.settings.get(u);if(!g)throw new Error(`Assertion failed: This settings (\"${u}\") should have been registered`);let f=this.why?t.sources.get(u)||\"<default>\":g.description;return[u,f]}),c=l.reduce((u,[,g])=>Math.max(u,g.length),0);for(let[u,g]of l)n.reportInfo(null,`${u.padEnd(o,\" \")}   ${g.padEnd(c,\" \")}   ${(0,XT.inspect)(t.getSpecial(u,{hideSecrets:!0,getNativePaths:!0}),a)}`)}else for(let l of s)n.reportInfo(null,`${l.padEnd(o,\" \")}   ${(0,XT.inspect)(t.getSpecial(l,{hideSecrets:!0,getNativePaths:!0}),a)}`)}})).exitCode()}};hu.paths=[[\"config\"]],hu.usage=ve.Usage({description:\"display the current configuration\",details:`\n      This command prints the current active configuration settings.\n    `,examples:[[\"Print the active configuration settings\",\"$0 config\"]]});ls();var NQ={};ut(NQ,{Strategy:()=>jm,acceptedStrategies:()=>I8e,dedupe:()=>ZT});var aae=Pe(wn()),jm=(e=>(e.HIGHEST=\"highest\",e))(jm||{}),I8e=new Set(Object.values(jm)),y8e={highest:async(r,e,{resolver:t,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of r.storedResolutions){let c=r.storedDescriptors.get(a);if(typeof c>\"u\")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);Ie.getSetWithDefault(o,c.identHash).add(l)}return Array.from(r.storedDescriptors.values(),async a=>{if(e.length&&!aae.default.isMatch(P.stringifyIdent(a),e))return null;let l=r.storedResolutions.get(a.descriptorHash);if(typeof l>\"u\")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=r.originalPackages.get(l);if(typeof c>\"u\"||!t.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u>\"u\")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let B=r.originalPackages.get(y);if(typeof B>\"u\")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return B.reference}),f=await t.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h>\"u\")return null;let p=h.locatorHash,C=r.originalPackages.get(p);if(typeof C>\"u\")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:C}})}};async function ZT(r,{strategy:e,patterns:t,cache:i,report:n}){let{configuration:s}=r,o=new ti,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:r.storedChecksums,fetcher:l,project:r,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:r,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise(\"Deduplication step\",async()=>{let g=y8e[e],f=await g(r,t,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=vi.progressViaCounter(f.length);await n.reportProgress(h);let p=0;await Promise.all(f.map(B=>B.then(v=>{if(v===null)return;p++;let{descriptor:D,currentPackage:L,updatedPackage:H}=v;n.reportInfo(0,`${P.prettyDescriptor(s,D)} can be deduped from ${P.prettyLocator(s,L)} to ${P.prettyLocator(s,H)}`),n.reportJson({descriptor:P.stringifyDescriptor(D),currentResolution:P.stringifyLocator(L),updatedResolution:P.stringifyLocator(H)}),r.storedResolutions.set(D.descriptorHash,H.locatorHash)}).finally(()=>h.tick())));let C;switch(p){case 0:C=\"No packages\";break;case 1:C=\"One package\";break;default:C=`${p} packages`}let y=ee.pretty(s,e,ee.Type.CODE);return n.reportInfo(0,`${C} can be deduped using the ${y} strategy`),p})}var pu=class extends De{constructor(){super(...arguments);this.strategy=z.String(\"-s,--strategy\",\"highest\",{description:\"The strategy to use when deduping dependencies\",validator:Xi(jm)});this.check=z.Boolean(\"-c,--check\",!1,{description:\"Exit with exit code 1 when duplicates are found, without persisting the dependency tree\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Xi(es)});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd),n=await Rt.find(t);await i.restoreInstallState({restoreResolutions:!1});let s=0,o=await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout,json:this.json},async a=>{s=await ZT(i,{strategy:this.strategy,patterns:this.patterns,cache:n,report:a})});return o.hasErrors()?o.exitCode():this.check?s?1:0:(await Ge.start({configuration:t,stdout:this.context.stdout,json:this.json},async l=>{await i.install({cache:n,report:l,mode:this.mode})})).exitCode()}};pu.paths=[[\"dedupe\"]],pu.usage=ve.Usage({description:\"deduplicate dependencies with overlapping ranges\",details:\"\\n      Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\\n\\n      This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\\n\\n      - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\\n\\n      **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\\n\\n      If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      ### In-depth explanation:\\n\\n      Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\\n\\n      Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\\n    \",examples:[[\"Dedupe all packages\",\"$0 dedupe\"],[\"Dedupe all packages using a specific strategy\",\"$0 dedupe --strategy highest\"],[\"Dedupe a specific package\",\"$0 dedupe lodash\"],[\"Dedupe all packages with the `@babel/*` scope\",\"$0 dedupe '@babel/*'\"],[\"Check for duplicates (can be used as a CI step)\",\"$0 dedupe --check\"]]});var Vh=class extends De{async execute(){let{plugins:e}=await ye.find(this.context.cwd,this.context.plugins),t=[];for(let o of e){let{commands:a}=o[1];if(a){let c=Hn.from(a).definitions();t.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(\" \").slice(1).join()===a.split(\" \").slice(1).join(),s=Aae()[\"@yarnpkg/builder\"].bundles.standard;for(let o of t){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)}\n`)}};Vh.paths=[[\"--clipanion=definitions\"]];var Xh=class extends De{async execute(){this.context.stdout.write(this.cli.usage(null))}};Xh.paths=[[\"help\"],[\"--help\"],[\"-h\"]];var qm=class extends De{constructor(){super(...arguments);this.leadingArgument=z.String();this.args=z.Proxy()}async execute(){if(this.leadingArgument.match(/[\\\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let t=x.resolve(this.context.cwd,U.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:t})}else return await this.cli.run([\"run\",this.leadingArgument,...this.args])}};var Zh=class extends De{async execute(){this.context.stdout.write(`${Lr||\"<unknown>\"}\n`)}};Zh.paths=[[\"-v\"],[\"--version\"]];var du=class extends De{constructor(){super(...arguments);this.commandName=z.String();this.args=z.Proxy()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,locator:n}=await je.find(t,this.context.cwd);return await i.restoreInstallState(),await Wt.executePackageShellcode(n,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:i})}};du.paths=[[\"exec\"]],du.usage=ve.Usage({description:\"execute a shell script\",details:`\n      This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell.\n\n      It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n    `,examples:[[\"Execute a single shell command\",\"$0 exec echo Hello World\"],[\"Execute a shell script\",'$0 exec \"tsc & babel src --out-dir lib\"']]});ls();var Cu=class extends De{constructor(){super(...arguments);this.hash=z.String({required:!1,validator:od(sd(),[ad(/^p[0-9a-f]{5}$/)])})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd);return await i.restoreInstallState({restoreResolutions:!1}),await i.applyLightResolution(),typeof this.hash<\"u\"?await B8e(this.hash,i,{stdout:this.context.stdout}):(await Ge.start({configuration:t,stdout:this.context.stdout,includeFooter:!1},async s=>{var a;let o=[([,l])=>P.stringifyLocator(i.storedPackages.get(l.subject)),([,l])=>P.stringifyIdent(l.requested)];for(let[l,c]of Ie.sortMap(i.peerRequirements,o)){let u=i.storedPackages.get(c.subject);if(typeof u>\"u\")throw new Error(\"Assertion failed: Expected the subject package to have been registered\");let g=i.storedPackages.get(c.rootRequester);if(typeof g>\"u\")throw new Error(\"Assertion failed: Expected the root package to have been registered\");let f=(a=u.dependencies.get(c.requested.identHash))!=null?a:null,h=ee.pretty(t,l,ee.Type.CODE),p=P.prettyLocator(t,u),C=P.prettyIdent(t,c.requested),y=P.prettyIdent(t,g),B=c.allRequesters.length-1,v=`descendant${B===1?\"\":\"s\"}`,D=B>0?` and ${B} ${v}`:\"\",L=f!==null?\"provides\":\"doesn't provide\";s.reportInfo(null,`${h} \\u2192 ${p} ${L} ${C} to ${y}${D}`)}})).exitCode()}};Cu.paths=[[\"explain\",\"peer-requirements\"]],Cu.usage=ve.Usage({description:\"explain a set of peer requirements\",details:`\n      A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants.\n\n      When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not.\n\n      When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set.\n\n      **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\\`yarn explain peer-requirements\\`).\n    `,examples:[[\"Explain the corresponding set of peer requirements for a hash\",\"$0 explain peer-requirements p1a4ed\"],[\"List all sets of peer requirements\",\"$0 explain peer-requirements\"]]});async function B8e(r,e,t){let{configuration:i}=e,n=e.peerRequirements.get(r);if(typeof n>\"u\")throw new Error(`No peerDependency requirements found for hash: \"${r}\"`);return(await Ge.start({configuration:i,stdout:t.stdout,includeFooter:!1},async o=>{var B,v;let a=e.storedPackages.get(n.subject);if(typeof a>\"u\")throw new Error(\"Assertion failed: Expected the subject package to have been registered\");let l=e.storedPackages.get(n.rootRequester);if(typeof l>\"u\")throw new Error(\"Assertion failed: Expected the root package to have been registered\");let c=(B=a.dependencies.get(n.requested.identHash))!=null?B:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u>\"u\")throw new Error(\"Assertion failed: Expected the resolution to have been registered\");let g=u!==null?e.storedPackages.get(u):null;if(typeof g>\"u\")throw new Error(\"Assertion failed: Expected the provided package to have been registered\");let f=[...n.allRequesters.values()].map(D=>{let L=e.storedPackages.get(D);if(typeof L>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let H=P.devirtualizeLocator(L),j=e.storedPackages.get(H.locatorHash);if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let $=j.peerDependencies.get(n.requested.identHash);if(typeof $>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency to be registered\");return{pkg:L,peerDependency:$}});if(g!==null){let D=f.every(({peerDependency:L})=>vt.satisfiesWithPrereleases(g.version,L.range));o.reportInfo(0,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(v=g.version)!=null?v:\"<missing>\")}, which ${D?\"satisfies\":\"doesn't satisfy\"} the following requirements:`)}else o.reportInfo(0,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ee.mark(i),p=[];for(let{pkg:D,peerDependency:L}of Ie.sortMap(f,H=>P.stringifyLocator(H.pkg))){let j=(g!==null?vt.satisfiesWithPrereleases(g.version,L.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(D),prettyLocator:P.prettyLocator(i,D),prettyRange:P.prettyRange(i,L.range),mark:j})}let C=Math.max(...p.map(({stringifiedLocator:D})=>D.length)),y=Math.max(...p.map(({prettyRange:D})=>D.length));for(let{stringifiedLocator:D,prettyLocator:L,prettyRange:H,mark:j}of Ie.sortMap(p,({stringifiedLocator:$})=>$))o.reportInfo(null,`${L.padEnd(C+(L.length-D.length),\" \")} \\u2192 ${H.padEnd(y,\" \")} ${j}`);p.length>1&&(o.reportSeparator(),o.reportInfo(0,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}ls();var lae=Pe(Xr()),mu=class extends De{constructor(){super(...arguments);this.onlyIfNeeded=z.Boolean(\"--only-if-needed\",!1,{description:\"Only lock the Yarn version if it isn't already locked\"});this.version=z.String()}async execute(){var o;let t=await ye.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&t.get(\"yarnPath\")){let a=t.sources.get(\"yarnPath\");if(!a)throw new Error(\"Assertion failed: Expected 'yarnPath' to have a source\");let l=(o=t.projectCwd)!=null?o:t.startingCwd;if(x.contains(l,a))return 0}let i=()=>{if(typeof Lr>\"u\")throw new be(\"The --install flag can only be used without explicit version specifier from the Yarn CLI\");return`file://${process.argv[1]}`},n;if(this.version===\"self\")n=i();else if(this.version===\"latest\"||this.version===\"berry\"||this.version===\"stable\")n=`https://repo.yarnpkg.com/${await Jm(t,\"stable\")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version===\"canary\")n=`https://repo.yarnpkg.com/${await Jm(t,\"canary\")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version===\"classic\")n=\"https://classic.yarnpkg.com/latest.js\";else if(this.version.match(/^https?:/))n=this.version;else if(this.version.match(/^\\.{0,2}[\\\\/]/)||U.isAbsolute(this.version))n=`file://${U.resolve(this.version)}`;else if(vt.satisfiesWithPrereleases(this.version,\">=2.0.0\"))n=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(vt.satisfiesWithPrereleases(this.version,\"^0.x || ^1.x\"))n=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(vt.validRange(this.version))n=`https://repo.yarnpkg.com/${await Q8e(t,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new be(`Invalid version descriptor \"${this.version}\"`);return(await Ge.start({configuration:t,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{let l=\"file://\",c;n.startsWith(l)?(a.reportInfo(0,`Downloading ${ee.pretty(t,n,xi.URL)}`),c=await M.readFilePromise(U.toPortablePath(n.slice(l.length)))):(a.reportInfo(0,`Retrieving ${ee.pretty(t,n,xi.PATH)}`),c=await Xt.get(n,{configuration:t})),await _T(t,null,c,{report:a})})).exitCode()}};mu.paths=[[\"set\",\"version\"]],mu.usage=ve.Usage({description:\"lock the Yarn version used by the project\",details:\"\\n      This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\\n\\n      A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\\n\\n      The version specifier can be:\\n\\n      - a tag:\\n        - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\\n        - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\\n        - `classic` -> the most recent classic (`^0.x || ^1.x`) release\\n\\n      - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\\n\\n      - a semver version (e.g. `2.4.1`, `1.22.1`)\\n\\n      - a local file referenced through either a relative or absolute path\\n\\n      - `self` -> the version used to invoke the command\\n    \",examples:[[\"Download the latest release from the Yarn repository\",\"$0 set version latest\"],[\"Download the latest canary release from the Yarn repository\",\"$0 set version canary\"],[\"Download the latest classic release from the Yarn repository\",\"$0 set version classic\"],[\"Download the most recent Yarn 3 build\",\"$0 set version 3.x\"],[\"Download a specific Yarn 2 build\",\"$0 set version 2.0.0-rc.30\"],[\"Switch back to a specific Yarn 1 release\",\"$0 set version 1.22.1\"],[\"Use a release from the local filesystem\",\"$0 set version ./yarn.cjs\"],[\"Use a release from a URL\",\"$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js\"],[\"Download the version used to invoke the command\",\"$0 set version self\"]]});async function Q8e(r,e){let i=(await Xt.get(\"https://repo.yarnpkg.com/tags\",{configuration:r,jsonResponse:!0})).tags.filter(n=>vt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new be(`No matching release found for range ${ee.pretty(r,e,ee.Type.RANGE)}.`);return i[0]}async function Jm(r,e){let t=await Xt.get(\"https://repo.yarnpkg.com/tags\",{configuration:r,jsonResponse:!0});if(!t.latest[e])throw new be(`Tag ${ee.pretty(r,e,ee.Type.RANGE)} not found`);return t.latest[e]}async function _T(r,e,t,{report:i}){var h;e===null&&await M.mktempPromise(async p=>{let C=x.join(p,\"yarn.cjs\");await M.writeFilePromise(C,t);let{stdout:y}=await Cr.execvp(process.execPath,[U.fromPortablePath(C),\"--version\"],{cwd:p,env:{...process.env,YARN_IGNORE_PATH:\"1\"}});if(e=y.trim(),!lae.default.valid(e))throw new Error(`Invalid semver version. ${ee.pretty(r,\"yarn --version\",ee.Type.CODE)} returned:\n${e}`)});let n=(h=r.projectCwd)!=null?h:r.startingCwd,s=x.resolve(n,\".yarn/releases\"),o=x.resolve(s,`yarn-${e}.cjs`),a=x.relative(r.startingCwd,o),l=x.relative(n,o);i.reportInfo(0,`Saving the new release in ${ee.pretty(r,a,\"magenta\")}`),await M.removePromise(x.dirname(o)),await M.mkdirPromise(x.dirname(o),{recursive:!0}),await M.writeFilePromise(o,t,{mode:493}),await ye.updateConfiguration(n,{yarnPath:l});let c=await ot.tryFind(n)||new ot;c.packageManager=`yarn@${e&&Ie.isTaggedYarnVersion(e)?e:await Jm(r,\"stable\")}`;let u={};c.exportTo(u);let g=x.join(n,ot.fileName),f=`${JSON.stringify(u,null,c.indent)}\n`;await M.changeFilePromise(g,f,{automaticNewlines:!0})}function cae(r){return Ct[TI(r)]}var b8e=/## (?<code>YN[0-9]{4}) - `(?<name>[A-Z_]+)`\\n\\n(?<details>(?:.(?!##))+)/gs;async function S8e(r){let t=`https://repo.yarnpkg.com/${Ie.isTaggedYarnVersion(Lr)?Lr:await Jm(r,\"canary\")}/packages/gatsby/content/advanced/error-codes.md`,i=await Xt.get(t,{configuration:r});return new Map(Array.from(i.toString().matchAll(b8e),({groups:n})=>{if(!n)throw new Error(\"Assertion failed: Expected the match to have been successful\");let s=cae(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected \"${n.name}\" to be named \"${s}\"`);return[n.code,n.details]}))}var Eu=class extends De{constructor(){super(...arguments);this.code=z.String({required:!1,validator:od(sd(),[ad(/^YN[0-9]{4}$/)])});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);if(typeof this.code<\"u\"){let i=cae(this.code),n=ee.pretty(t,i,ee.Type.CODE),s=this.cli.format().header(`${this.code} - ${n}`),a=(await S8e(t)).get(this.code),l=typeof a<\"u\"?ee.jsonOrPretty(this.json,t,ee.tuple(ee.Type.MARKDOWN,{text:a,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description.\n\nYou can help us by editing this page on GitHub \\u{1F642}:\n${ee.jsonOrPretty(this.json,t,ee.tuple(ee.Type.URL,\"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md\"))}\n`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:i,details:l})}\n`):this.context.stdout.write(`${s}\n\n${l}\n`)}else{let i={children:Ie.mapAndFilter(Object.entries(Ct),([n,s])=>Number.isNaN(Number(n))?Ie.mapAndFilter.skip:{label:FA(Number(n)),value:ee.tuple(ee.Type.CODE,s)})};$n.emitTree(i,{configuration:t,stdout:this.context.stdout,json:this.json})}}};Eu.paths=[[\"explain\"]],Eu.usage=ve.Usage({description:\"explain an error code\",details:`\n      When the code argument is specified, this command prints its name and its details.\n\n      When used without arguments, this command lists all error codes and their names.\n    `,examples:[[\"Explain an error code\",\"$0 explain YN0006\"],[\"List all error codes\",\"$0 explain\"]]});var uae=Pe(wn()),Iu=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Print versions of a package from the whole project\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Print information for all packages, including transitive dependencies\"});this.extra=z.Array(\"-X,--extra\",[],{description:\"An array of requests of extra data provided by plugins\"});this.cache=z.Boolean(\"--cache\",!1,{description:\"Print information about the cache entry of a package (path, size, checksum)\"});this.dependents=z.Boolean(\"--dependents\",!1,{description:\"Print all dependents for each matching package\"});this.manifest=z.Boolean(\"--manifest\",!1,{description:\"Print data obtained by looking at the package archive (license, homepage, ...)\"});this.nameOnly=z.Boolean(\"--name-only\",!1,{description:\"Only print the name for the matching packages\"});this.virtuals=z.Boolean(\"--virtuals\",!1,{description:\"Print each instance of the virtual packages\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n&&!this.all)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let o=new Set(this.extra);this.cache&&o.add(\"cache\"),this.dependents&&o.add(\"dependents\"),this.manifest&&o.add(\"manifest\");let a=(L,{recursive:H})=>{let j=L.anchoredLocator.locatorHash,$=new Map,V=[j];for(;V.length>0;){let W=V.shift();if($.has(W))continue;let _=i.storedPackages.get(W);if(typeof _>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");if($.set(W,_),P.isVirtualLocator(_)&&V.push(P.devirtualizeLocator(_).locatorHash),!(!H&&W!==j))for(let A of _.dependencies.values()){let Ae=i.storedResolutions.get(A.descriptorHash);if(typeof Ae>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");V.push(Ae)}}return $.values()},l=({recursive:L})=>{let H=new Map;for(let j of i.workspaces)for(let $ of a(j,{recursive:L}))H.set($.locatorHash,$);return H.values()},c=({all:L,recursive:H})=>L&&H?i.storedPackages.values():L?l({recursive:H}):a(n,{recursive:H}),u=({all:L,recursive:H})=>{let j=c({all:L,recursive:H}),$=this.patterns.map(_=>{let A=P.parseLocator(_),Ae=uae.default.makeRe(P.stringifyIdent(A)),ge=P.isVirtualLocator(A),re=ge?P.devirtualizeLocator(A):A;return O=>{let F=P.stringifyIdent(O);if(!Ae.test(F))return!1;if(A.reference===\"unknown\")return!0;let ue=P.isVirtualLocator(O),pe=ue?P.devirtualizeLocator(O):O;return!(ge&&ue&&A.reference!==O.reference||re.reference!==pe.reference)}}),V=Ie.sortMap([...j],_=>P.stringifyLocator(_));return{selection:V.filter(_=>$.length===0||$.some(A=>A(_))),sortedLookup:V}},{selection:g,sortedLookup:f}=u({all:this.all,recursive:this.recursive});if(g.length===0)throw new be(\"No package matched your request\");let h=new Map;if(this.dependents)for(let L of f)for(let H of L.dependencies.values()){let j=i.storedResolutions.get(H.descriptorHash);if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");Ie.getArrayWithDefault(h,j).push(L)}let p=new Map;for(let L of f){if(!P.isVirtualLocator(L))continue;let H=P.devirtualizeLocator(L);Ie.getArrayWithDefault(p,H.locatorHash).push(L)}let C={},y={children:C},B=t.makeFetcher(),v={project:i,fetcher:B,cache:s,checksums:i.storedChecksums,report:new ti,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},D=[async(L,H,j)=>{var W,_;if(!H.has(\"manifest\"))return;let $=await B.fetch(L,v),V;try{V=await ot.find($.prefixPath,{baseFs:$.packageFs})}finally{(W=$.releaseFs)==null||W.call($)}j(\"Manifest\",{License:ee.tuple(ee.Type.NO_HINT,V.license),Homepage:ee.tuple(ee.Type.URL,(_=V.raw.homepage)!=null?_:null)})},async(L,H,j)=>{var Ae;if(!H.has(\"cache\"))return;let $={mockedPackages:i.disabledLocators,unstablePackages:i.conditionalLocators},V=(Ae=i.storedChecksums.get(L.locatorHash))!=null?Ae:null,W=s.getLocatorPath(L,V,$),_;if(W!==null)try{_=M.statSync(W)}catch{}let A=typeof _<\"u\"?[_.size,ee.Type.SIZE]:void 0;j(\"Cache\",{Checksum:ee.tuple(ee.Type.NO_HINT,V),Path:ee.tuple(ee.Type.PATH,W),Size:A})}];for(let L of g){let H=P.isVirtualLocator(L);if(!this.virtuals&&H)continue;let j={},$={value:[L,ee.Type.LOCATOR],children:j};if(C[P.stringifyLocator(L)]=$,this.nameOnly){delete $.children;continue}let V=p.get(L.locatorHash);typeof V<\"u\"&&(j.Instances={label:\"Instances\",value:ee.tuple(ee.Type.NUMBER,V.length)}),j.Version={label:\"Version\",value:ee.tuple(ee.Type.NO_HINT,L.version)};let W=(A,Ae)=>{let ge={};if(j[A]=ge,Array.isArray(Ae))ge.children=Ae.map(re=>({value:re}));else{let re={};ge.children=re;for(let[O,F]of Object.entries(Ae))typeof F>\"u\"||(re[O]={label:O,value:F})}};if(!H){for(let A of D)await A(L,o,W);await t.triggerHook(A=>A.fetchPackageInfo,L,o,W)}L.bin.size>0&&!H&&W(\"Exported Binaries\",[...L.bin.keys()].map(A=>ee.tuple(ee.Type.PATH,A)));let _=h.get(L.locatorHash);typeof _<\"u\"&&_.length>0&&W(\"Dependents\",_.map(A=>ee.tuple(ee.Type.LOCATOR,A))),L.dependencies.size>0&&!H&&W(\"Dependencies\",[...L.dependencies.values()].map(A=>{var re;let Ae=i.storedResolutions.get(A.descriptorHash),ge=typeof Ae<\"u\"&&(re=i.storedPackages.get(Ae))!=null?re:null;return ee.tuple(ee.Type.RESOLUTION,{descriptor:A,locator:ge})})),L.peerDependencies.size>0&&H&&W(\"Peer dependencies\",[...L.peerDependencies.values()].map(A=>{var O,F;let Ae=L.dependencies.get(A.identHash),ge=typeof Ae<\"u\"&&(O=i.storedResolutions.get(Ae.descriptorHash))!=null?O:null,re=ge!==null&&(F=i.storedPackages.get(ge))!=null?F:null;return ee.tuple(ee.Type.RESOLUTION,{descriptor:A,locator:re})}))}$n.emitTree(y,{configuration:t,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Iu.paths=[[\"info\"]],Iu.usage=ve.Usage({description:\"see information related to packages\",details:\"\\n      This command prints various information related to the specified packages, accepting glob patterns.\\n\\n      By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\\n\\n      Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\\n\\n      Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\\n    \",examples:[[\"Show information about Lodash\",\"$0 info lodash\"]]});var LQ=Pe(Ac());ls();var yu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.immutable=z.Boolean(\"--immutable\",{description:\"Abort with an error exit code if the lockfile was to be modified\"});this.immutableCache=z.Boolean(\"--immutable-cache\",{description:\"Abort with an error exit code if the cache folder was to be modified\"});this.checkCache=z.Boolean(\"--check-cache\",!1,{description:\"Always refetch the packages and ensure that their checksums are consistent\"});this.inlineBuilds=z.Boolean(\"--inline-builds\",{description:\"Verbosely print the output of the build steps of dependencies\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Xi(es)});this.cacheFolder=z.String(\"--cache-folder\",{hidden:!0});this.frozenLockfile=z.Boolean(\"--frozen-lockfile\",{hidden:!0});this.ignoreEngines=z.Boolean(\"--ignore-engines\",{hidden:!0});this.nonInteractive=z.Boolean(\"--non-interactive\",{hidden:!0});this.preferOffline=z.Boolean(\"--prefer-offline\",{hidden:!0});this.production=z.Boolean(\"--production\",{hidden:!0});this.registry=z.String(\"--registry\",{hidden:!0});this.silent=z.Boolean(\"--silent\",{hidden:!0});this.networkTimeout=z.String(\"--network-timeout\",{hidden:!0})}async execute(){var f;let t=await ye.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<\"u\"&&t.useWithSource(\"<cli>\",{enableInlineBuilds:this.inlineBuilds},t.startingCwd,{overwrite:!0});let i=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,n=async(h,{error:p})=>{let C=await Ge.start({configuration:t,stdout:this.context.stdout,includeFooter:!1},async y=>{p?y.reportError(50,h):y.reportWarning(50,h)});return C.hasErrors()?C.exitCode():null};if(typeof this.ignoreEngines<\"u\"){let h=await n(\"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore\",{error:!LQ.default.VERCEL});if(h!==null)return h}if(typeof this.registry<\"u\"){let h=await n(\"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file\",{error:!1});if(h!==null)return h}if(typeof this.preferOffline<\"u\"){let h=await n(\"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead\",{error:!LQ.default.VERCEL});if(h!==null)return h}if(typeof this.production<\"u\"){let h=await n(\"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead\",{error:!0});if(h!==null)return h}if(typeof this.nonInteractive<\"u\"){let h=await n(\"The --non-interactive option is deprecated\",{error:!i});if(h!==null)return h}if(typeof this.frozenLockfile<\"u\"&&(await n(\"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead\",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder<\"u\"){let h=await n(\"The cache-folder option has been deprecated; use rc settings instead\",{error:!LQ.default.NETLIFY});if(h!==null)return h}let s=this.mode===\"update-lockfile\";if(s&&(this.immutable||this.immutableCache))throw new be(`${ee.pretty(t,\"--immutable\",ee.Type.CODE)} and ${ee.pretty(t,\"--immutable-cache\",ee.Type.CODE)} cannot be used with ${ee.pretty(t,\"--mode=update-lockfile\",ee.Type.CODE)}`);let o=((f=this.immutable)!=null?f:t.get(\"enableImmutableInstalls\"))&&!s,a=this.immutableCache&&!s;if(t.projectCwd!==null){let h=await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeFooter:!1},async p=>{await D8e(t,o)&&(p.reportInfo(48,\"Automatically fixed merge conflicts \\u{1F44D}\"),p.reportSeparator())});if(h.hasErrors())return h.exitCode()}if(t.projectCwd!==null&&typeof t.sources.get(\"nodeLinker\")>\"u\"){let h=t.projectCwd,p;try{p=await M.readFilePromise(x.join(h,xt.lockfile),\"utf8\")}catch{}if(p!=null&&p.includes(\"yarn lockfile v1\")){let C=await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeFooter:!1},async y=>{y.reportInfo(70,\"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \\u{1F44D}\"),y.reportSeparator(),t.use(\"<compat>\",{nodeLinker:\"node-modules\"},h,{overwrite:!0}),await ye.updateConfiguration(h,{nodeLinker:\"node-modules\"})});if(C.hasErrors())return C.exitCode()}}if(t.projectCwd!==null){let h=await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeFooter:!1},async p=>{var C;(C=ye.telemetry)!=null&&C.isNew&&(p.reportInfo(65,\"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry\"),p.reportInfo(65,`Run ${ee.pretty(t,\"yarn config set --home enableTelemetry 0\",ee.Type.CODE)} to disable`),p.reportSeparator())});if(h.hasErrors())return h.exitCode()}let{project:l,workspace:c}=await je.find(t,this.context.cwd),u=await Rt.find(t,{immutable:a,check:this.checkCache});if(!c)throw new ct(l.cwd,this.context.cwd);return await l.restoreInstallState({restoreResolutions:!1}),(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!0},async h=>{await l.install({cache:u,report:h,immutable:o,mode:this.mode})})).exitCode()}};yu.paths=[[\"install\"],ve.Default],yu.usage=ve.Usage({description:\"install the project dependencies\",details:`\n      This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n      - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n      - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \\`cacheFolder\\` in \\`yarn config\\` to see where the cache files are stored).\n\n      - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know).\n\n      - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n      Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n      If the \\`--immutable\\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \\`immutablePatterns\\` configuration setting). For backward compatibility we offer an alias under the name of \\`--frozen-lockfile\\`, but it will be removed in a later release.\n\n      If the \\`--immutable-cache\\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n      If the \\`--check-cache\\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n      If the \\`--inline-builds\\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n      If the \\`--mode=<mode>\\` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n      - \\`skip-build\\` will not run the build scripts at all. Note that this is different from setting \\`enableScripts\\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n      - \\`update-lockfile\\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n    `,examples:[[\"Install the project\",\"$0 install\"],[\"Validate a project when using Zero-Installs\",\"$0 install --immutable --immutable-cache\"],[\"Validate a project when using Zero-Installs (slightly safer if you accept external PRs)\",\"$0 install --immutable --immutable-cache --check-cache\"]]});var v8e=\"|||||||\",x8e=\">>>>>>>\",P8e=\"=======\",gae=\"<<<<<<<\";async function D8e(r,e){if(!r.projectCwd)return!1;let t=x.join(r.projectCwd,r.get(\"lockfileFilename\"));if(!await M.existsPromise(t))return!1;let i=await M.readFilePromise(t,\"utf8\");if(!i.includes(gae))return!1;if(e)throw new at(47,\"Cannot autofix a lockfile when running an immutable install\");let[n,s]=k8e(i),o,a;try{o=yi(n),a=yi(s)}catch{throw new at(46,\"The individual variants of the lockfile failed to parse\")}let l={...o,...a};for(let[c,u]of Object.entries(l))typeof u==\"string\"&&delete l[c];return await M.changeFilePromise(t,Ba(l),{automaticNewlines:!0}),!0}function k8e(r){let e=[[],[]],t=r.split(/\\r?\\n/g),i=!1;for(;t.length>0;){let n=t.shift();if(typeof n>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(n.startsWith(gae)){for(;t.length>0;){let s=t.shift();if(typeof s>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(s===P8e){i=!1;break}else if(i||s.startsWith(v8e)){i=!0;continue}else e[0].push(s)}for(;t.length>0;){let s=t.shift();if(typeof s>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(s.startsWith(x8e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(`\n`),e[1].join(`\n`)]}var wu=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Link all workspaces belonging to the target project to the current one\"});this.private=z.Boolean(\"-p,--private\",!1,{description:\"Also link private workspaces belonging to the target project to the current one\"});this.relative=z.Boolean(\"-r,--relative\",!1,{description:\"Link workspaces using relative paths instead of absolute paths\"});this.destination=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=x.resolve(this.context.cwd,U.toPortablePath(this.destination)),a=await ye.find(o,this.context.plugins,{useRc:!1,strict:!1}),{project:l,workspace:c}=await je.find(a,o);if(i.cwd===l.cwd)throw new be(\"Invalid destination; Can't link the project to itself\");if(!c)throw new ct(l.cwd,o);let u=i.topLevelWorkspace,g=[];if(this.all){for(let h of l.workspaces)h.manifest.name&&(!h.manifest.private||this.private)&&g.push(h);if(g.length===0)throw new be(\"No workspace found to be linked in the target project\")}else{if(!c.manifest.name)throw new be(\"The target workspace doesn't have a name and thus cannot be linked\");if(c.manifest.private&&!this.private)throw new be(\"The target workspace is marked private - use the --private flag to link it anyway\");g.push(c)}for(let h of g){let p=P.stringifyIdent(h.locator),C=this.relative?x.relative(i.cwd,h.cwd):h.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:p}},reference:`portal:${C}`})}return(await Ge.start({configuration:t,stdout:this.context.stdout},async h=>{await i.install({cache:s,report:h})})).exitCode()}};wu.paths=[[\"link\"]],wu.usage=ve.Usage({description:\"connect the local project to another one\",details:\"\\n      This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\\n    \",examples:[[\"Register a remote workspace for use in the current project\",\"$0 link ~/ts-loader\"],[\"Register all workspaces from a remote project for use in the current project\",\"$0 link ~/jest --all\"]]});var Bu=class extends De{constructor(){super(...arguments);this.args=z.Proxy()}async execute(){return this.cli.run([\"exec\",\"node\",...this.args])}};Bu.paths=[[\"node\"]],Bu.usage=ve.Usage({description:\"run node with the hook already setup\",details:`\n      This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n\n      The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version.\n    `,examples:[[\"Run a Node script\",\"$0 node ./my-script.js\"]]});var mae=J(\"os\");var fae=J(\"os\");var R8e=\"https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml\";async function bu(r){let e=await Xt.get(R8e,{configuration:r});return yi(e.toString())}var Qu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async n=>{let s=await bu(t);for(let[o,{experimental:a,...l}]of Object.entries(s)){let c=o;a&&(c+=\" [experimental]\"),n.reportJson({name:o,experimental:a,...l}),n.reportInfo(null,c)}})).exitCode()}};Qu.paths=[[\"plugin\",\"list\"]],Qu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"list the available official plugins\",details:\"\\n      This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\\n    \",examples:[[\"List the official plugins\",\"$0 plugin list\"]]});var F8e=/^[0-9]+$/;function hae(r){return F8e.test(r)?`pull/${r}/head`:r}var N8e=({repository:r,branch:e},t)=>[[\"git\",\"init\",U.fromPortablePath(t)],[\"git\",\"remote\",\"add\",\"origin\",r],[\"git\",\"fetch\",\"origin\",\"--depth=1\",hae(e)],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"]],L8e=({branch:r})=>[[\"git\",\"fetch\",\"origin\",\"--depth=1\",hae(r),\"--force\"],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"],[\"git\",\"clean\",\"-dfx\"]],T8e=({plugins:r,noMinify:e},t)=>[[\"yarn\",\"build:cli\",...new Array().concat(...r.map(i=>[\"--plugin\",x.resolve(t,i)])),...e?[\"--no-minify\"]:[],\"|\"]],Su=class extends De{constructor(){super(...arguments);this.installPath=z.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=z.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=z.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.plugins=z.Array(\"--plugin\",[],{description:\"An array of additional plugins that should be included in the bundle\"});this.noMinify=z.Boolean(\"--no-minify\",!1,{description:\"Build a bundle for development (debugging) - non-minified and non-mangled\"});this.force=z.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.skipPlugins=z.Boolean(\"--skip-plugins\",!1,{description:\"Skip updating the contrib plugins\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd),n=typeof this.installPath<\"u\"?x.resolve(this.context.cwd,U.toPortablePath(this.installPath)):x.resolve(U.toPortablePath((0,fae.tmpdir)()),\"yarnpkg-sources\",li.makeHash(this.repository).slice(0,6));return(await Ge.start({configuration:t,stdout:this.context.stdout},async o=>{await $T(this,{configuration:t,report:o,target:n}),o.reportSeparator(),o.reportInfo(0,\"Building a fresh bundle\"),o.reportSeparator(),await Wm(T8e(this,n),{configuration:t,context:this.context,target:n}),o.reportSeparator();let a=x.resolve(n,\"packages/yarnpkg-cli/bundles/yarn.js\"),l=await M.readFilePromise(a);await _T(t,\"sources\",l,{report:o}),this.skipPlugins||await O8e(this,{project:i,report:o,target:n})})).exitCode()}};Su.paths=[[\"set\",\"version\",\"from\",\"sources\"]],Su.usage=ve.Usage({description:\"build Yarn from master\",details:`\n      This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project.\n\n      By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \\`--skip-plugins\\` flag.\n    `,examples:[[\"Build Yarn from master\",\"$0 set version from sources\"]]});async function Wm(r,{configuration:e,context:t,target:i}){for(let[n,...s]of r){let o=s[s.length-1]===\"|\";if(o&&s.pop(),o)await Cr.pipevp(n,s,{cwd:i,stdin:t.stdin,stdout:t.stdout,stderr:t.stderr,strict:!0});else{t.stdout.write(`${ee.pretty(e,`  $ ${[n,...s].join(\" \")}`,\"grey\")}\n`);try{await Cr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw t.stdout.write(a.stdout||a.stack),a}}}}async function $T(r,{configuration:e,report:t,target:i}){let n=!1;if(!r.force&&M.existsSync(x.join(i,\".git\"))){t.reportInfo(0,\"Fetching the latest commits\"),t.reportSeparator();try{await Wm(L8e(r),{configuration:e,context:r.context,target:i}),n=!0}catch{t.reportSeparator(),t.reportWarning(0,\"Repository update failed; we'll try to regenerate it\")}}n||(t.reportInfo(0,\"Cloning the remote repository\"),t.reportSeparator(),await M.removePromise(i),await M.mkdirPromise(i,{recursive:!0}),await Wm(N8e(r,i),{configuration:e,context:r.context,target:i}))}async function O8e(r,{project:e,report:t,target:i}){let n=await bu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await eO(o,r,{project:e,report:t,target:i})}var pae=Pe(Xr()),dae=J(\"url\"),Cae=J(\"vm\");var vu=class extends De{constructor(){super(...arguments);this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);return(await Ge.start({configuration:t,stdout:this.context.stdout},async n=>{let{project:s}=await je.find(t,this.context.cwd),o,a;if(this.name.match(/^\\.{0,2}[\\\\/]/)||U.isAbsolute(this.name)){let l=x.resolve(this.context.cwd,U.toPortablePath(this.name));n.reportInfo(0,`Reading ${ee.pretty(t,l,ee.Type.PATH)}`),o=x.relative(s.cwd,l),a=await M.readFilePromise(l)}else{let l;if(this.name.match(/^https?:/)){try{new dae.URL(this.name)}catch{throw new at(52,`Plugin specifier \"${this.name}\" is neither a plugin name nor a valid url`)}o=this.name,l=this.name}else{let c=P.parseLocator(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\"));if(c.reference!==\"unknown\"&&!pae.default.valid(c.reference))throw new at(0,\"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.\");let u=P.stringifyIdent(c),g=await bu(t);if(!Object.prototype.hasOwnProperty.call(g,u))throw new at(51,`Couldn't find a plugin named \"${u}\" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);o=u,l=g[u].url,c.reference!==\"unknown\"?l=l.replace(/\\/master\\//,`/${u}/${c.reference}/`):Lr!==null&&(l=l.replace(/\\/master\\//,`/@yarnpkg/cli/${Lr}/`))}n.reportInfo(0,`Downloading ${ee.pretty(t,l,\"green\")}`),a=await Xt.get(l,{configuration:t})}await tO(o,a,{project:s,report:n})})).exitCode()}};vu.paths=[[\"plugin\",\"import\"]],vu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"download a plugin\",details:`\n      This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations.\n\n      Three types of plugin references are accepted:\n\n      - If the plugin is stored within the Yarn repository, it can be referenced by name.\n      - Third-party plugins can be referenced directly through their public urls.\n      - Local plugins can be referenced by their path on the disk.\n\n      Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \\`@yarnpkg/builder\\` package).\n    `,examples:[['Download and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import @yarnpkg/plugin-exec\"],['Download and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import exec\"],[\"Download and activate a community plugin\",\"$0 plugin import https://example.org/path/to/plugin.js\"],[\"Activate a local plugin\",\"$0 plugin import ./path/to/plugin.js\"]]});async function tO(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Cae.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=x.resolve(t.cwd,l);i.reportInfo(0,`Saving the new plugin in ${ee.pretty(n,l,\"magenta\")}`),await M.mkdirPromise(x.dirname(c),{recursive:!0}),await M.writeFilePromise(c,e);let u={path:l,spec:r};await ye.updateConfiguration(t.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let C=typeof p!=\"string\"?p.path:p,y=x.resolve(t.cwd,U.toPortablePath(C)),{name:B}=Ie.dynamicRequire(y);B!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),{...g,plugins:f}})}var M8e=({pluginName:r,noMinify:e},t)=>[[\"yarn\",`build:${r}`,...e?[\"--no-minify\"]:[],\"|\"]],xu=class extends De{constructor(){super(...arguments);this.installPath=z.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=z.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=z.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.noMinify=z.Boolean(\"--no-minify\",!1,{description:\"Build a plugin for development (debugging) - non-minified and non-mangled\"});this.force=z.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=typeof this.installPath<\"u\"?x.resolve(this.context.cwd,U.toPortablePath(this.installPath)):x.resolve(U.toPortablePath((0,mae.tmpdir)()),\"yarnpkg-sources\",li.makeHash(this.repository).slice(0,6));return(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{let{project:o}=await je.find(t,this.context.cwd),a=P.parseIdent(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\")),l=P.stringifyIdent(a),c=await bu(t);if(!Object.prototype.hasOwnProperty.call(c,l))throw new at(51,`Couldn't find a plugin named \"${l}\" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let u=l;await $T(this,{configuration:t,report:s,target:i}),await eO(u,this,{project:o,report:s,target:i})})).exitCode()}};xu.paths=[[\"plugin\",\"import\",\"from\",\"sources\"]],xu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"build a plugin from sources\",details:`\n      This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations.\n\n      The plugins can be referenced by their short name if sourced from the official Yarn repository.\n    `,examples:[['Build and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import from sources @yarnpkg/plugin-exec\"],['Build and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import from sources exec\"]]});async function eO(r,{context:e,noMinify:t},{project:i,report:n,target:s}){let o=r.replace(/@yarnpkg\\//,\"\"),{configuration:a}=i;n.reportSeparator(),n.reportInfo(0,`Building a fresh ${o}`),n.reportSeparator(),await Wm(M8e({pluginName:o,noMinify:t},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=x.resolve(s,`packages/${o}/bundles/${r}.js`),c=await M.readFilePromise(l);await tO(r,c,{project:i,report:n})}var Pu=class extends De{constructor(){super(...arguments);this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd);return(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{let o=this.name,a=P.parseIdent(o);if(!t.plugins.has(o))throw new be(`${P.prettyIdent(t,a)} isn't referenced by the current configuration`);let l=`.yarn/plugins/${o}.cjs`,c=x.resolve(i.cwd,l);M.existsSync(c)&&(s.reportInfo(0,`Removing ${ee.pretty(t,l,ee.Type.PATH)}...`),await M.removePromise(c)),s.reportInfo(0,\"Updating the configuration...\"),await ye.updateConfiguration(i.cwd,u=>{if(!Array.isArray(u.plugins))return u;let g=u.plugins.filter(f=>f.path!==l);return u.plugins.length===g.length?u:{...u,plugins:g}})})).exitCode()}};Pu.paths=[[\"plugin\",\"remove\"]],Pu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"remove a plugin\",details:`\n      This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration.\n\n      **Note:** The plugins have to be referenced by their name property, which can be obtained using the \\`yarn plugin runtime\\` command. Shorthands are not allowed.\n   `,examples:[[\"Remove a plugin imported from the Yarn repository\",\"$0 plugin remove @yarnpkg/plugin-typescript\"],[\"Remove a plugin imported from a local file\",\"$0 plugin remove my-local-plugin\"]]});var Du=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async n=>{for(let s of t.plugins.keys()){let o=this.context.plugins.plugins.has(s),a=s;o&&(a+=\" [builtin]\"),n.reportJson({name:s,builtin:o}),n.reportInfo(null,`${a}`)}})).exitCode()}};Du.paths=[[\"plugin\",\"runtime\"]],Du.usage=ve.Usage({category:\"Plugin-related commands\",description:\"list the active plugins\",details:`\n      This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins.\n    `,examples:[[\"List the currently active plugins\",\"$0 plugin runtime\"]]});var ku=class extends De{constructor(){super(...arguments);this.idents=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);let o=new Set;for(let l of this.idents)o.add(P.parseIdent(l).identHash);if(await i.restoreInstallState({restoreResolutions:!1}),await i.resolveEverything({cache:s,report:new ti}),o.size>0)for(let l of i.storedPackages.values())o.has(l.identHash)&&i.storedBuildState.delete(l.locatorHash);else i.storedBuildState.clear();return(await Ge.start({configuration:t,stdout:this.context.stdout,includeLogs:!this.context.quiet},async l=>{await i.install({cache:s,report:l})})).exitCode()}};ku.paths=[[\"rebuild\"]],ku.usage=ve.Usage({description:\"rebuild the project's native packages\",details:`\n      This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again.\n\n      Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future).\n\n      By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory.\n    `,examples:[[\"Rebuild all packages\",\"$0 rebuild\"],[\"Rebuild fsevents only\",\"$0 rebuild fsevents\"]]});var rO=Pe(wn());ls();var Ru=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Apply the operation to all workspaces from the current project\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Xi(es)});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=this.all?i.workspaces:[n],a=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],l=[],c=!1,u=[];for(let p of this.patterns){let C=!1,y=P.parseIdent(p);for(let B of o){let v=[...B.manifest.peerDependenciesMeta.keys()];for(let D of(0,rO.default)(v,p))B.manifest.peerDependenciesMeta.delete(D),c=!0,C=!0;for(let D of a){let L=B.manifest.getForScope(D),H=[...L.values()].map(j=>P.stringifyIdent(j));for(let j of(0,rO.default)(H,P.stringifyIdent(y))){let{identHash:$}=P.parseIdent(j),V=L.get($);if(typeof V>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");B.manifest[D].delete($),u.push([B,D,V]),c=!0,C=!0}}}C||l.push(p)}let g=l.length>1?\"Patterns\":\"Pattern\",f=l.length>1?\"don't\":\"doesn't\",h=this.all?\"any\":\"this\";if(l.length>0)throw new be(`${g} ${ee.prettyList(t,l,xi.CODE)} ${f} match any packages referenced by ${h} workspace`);return c?(await t.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,u),(await Ge.start({configuration:t,stdout:this.context.stdout},async C=>{await i.install({cache:s,report:C,mode:this.mode})})).exitCode()):0}};Ru.paths=[[\"remove\"]],Ru.usage=ve.Usage({description:\"remove dependencies from the project\",details:`\n      This command will remove the packages matching the specified patterns from the current workspace.\n\n      If the \\`--mode=<mode>\\` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n      - \\`skip-build\\` will not run the build scripts at all. Note that this is different from setting \\`enableScripts\\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n      - \\`update-lockfile\\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n    `,examples:[[\"Remove a dependency from the current project\",\"$0 remove lodash\"],[\"Remove a dependency from all workspaces at once\",\"$0 remove lodash --all\"],[\"Remove all dependencies starting with `eslint-`\",\"$0 remove 'eslint-*'\"],[\"Remove all dependencies with the `@babel` scope\",\"$0 remove '@babel/*'\"],[\"Remove all dependencies matching `react-dom` or `react-helmet`\",\"$0 remove 'react-{dom,helmet}'\"]]});var Eae=J(\"util\"),_h=class extends De{async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await je.find(e,this.context.cwd);if(!i)throw new ct(t.cwd,this.context.cwd);return(await Ge.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=Ie.sortMap(o.keys(),u=>u),l={breakLength:1/0,colors:e.get(\"enableColors\"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c,\" \")}   ${(0,Eae.inspect)(g,l)}`)})).exitCode()}};_h.paths=[[\"run\"]];var Fu=class extends De{constructor(){super(...arguments);this.inspect=z.String(\"--inspect\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.inspectBrk=z.String(\"--inspect-brk\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.topLevel=z.Boolean(\"-T,--top-level\",!1,{description:\"Check the root workspace for scripts and/or binaries instead of the current one\"});this.binariesOnly=z.Boolean(\"-B,--binaries-only\",!1,{description:\"Ignore any user defined scripts and only check for binaries\"});this.silent=z.Boolean(\"--silent\",{hidden:!0});this.scriptName=z.String();this.args=z.Proxy()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n,locator:s}=await je.find(t,this.context.cwd);await i.restoreInstallState();let o=this.topLevel?i.topLevelWorkspace.anchoredLocator:s;if(!this.binariesOnly&&await Wt.hasPackageScript(o,this.scriptName,{project:i}))return await Wt.executePackageScript(o,this.scriptName,this.args,{project:i,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let a=await Wt.getPackageAccessibleBinaries(o,{project:i});if(a.get(this.scriptName)){let c=[];return this.inspect&&(typeof this.inspect==\"string\"?c.push(`--inspect=${this.inspect}`):c.push(\"--inspect\")),this.inspectBrk&&(typeof this.inspectBrk==\"string\"?c.push(`--inspect-brk=${this.inspectBrk}`):c.push(\"--inspect-brk\")),await Wt.executePackageAccessibleBinary(o,this.scriptName,this.args,{cwd:this.context.cwd,project:i,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:c,packageAccessibleBinaries:a})}if(!this.topLevel&&!this.binariesOnly&&n&&this.scriptName.includes(\":\")){let u=(await Promise.all(i.workspaces.map(async g=>g.manifest.scripts.has(this.scriptName)?g:null))).filter(g=>g!==null);if(u.length===1)return await Wt.executeWorkspaceScript(u[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName===\"node-gyp\"?new be(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${P.prettyLocator(t,s)}). This typically happens because some package depends on \"node-gyp\" to build itself, but didn't list it in their dependencies. To fix that, please run \"yarn add node-gyp\" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new be(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${P.prettyLocator(t,s)}).`);{if(this.scriptName===\"global\")throw new be(\"The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead\");let c=[this.scriptName].concat(this.args);for(let[u,g]of vh)for(let f of g)if(c.length>=f.length&&JSON.stringify(c.slice(0,f.length))===JSON.stringify(f))throw new be(`Couldn't find a script named \"${this.scriptName}\", but a matching command can be found in the ${u} plugin. You can install it with \"yarn plugin import ${u}\".`);throw new be(`Couldn't find a script named \"${this.scriptName}\".`)}}};Fu.paths=[[\"run\"]],Fu.usage=ve.Usage({description:\"run a script defined in the package.json\",details:`\n      This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace:\n\n      - If the \\`scripts\\` field from your local package.json contains a matching script name, its definition will get executed.\n\n      - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed.\n\n      - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed.\n\n      Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax).\n    `,examples:[[\"Run the tests from the local workspace\",\"$0 run test\"],['Same thing, but without the \"run\" keyword',\"$0 test\"],[\"Inspect Webpack while running\",\"$0 run --inspect-brk webpack\"]]});var Nu=class extends De{constructor(){super(...arguments);this.save=z.Boolean(\"-s,--save\",!1,{description:\"Persist the resolution inside the top-level manifest\"});this.descriptor=z.String();this.resolution=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(await i.restoreInstallState({restoreResolutions:!1}),!n)throw new ct(i.cwd,this.context.cwd);let o=P.parseDescriptor(this.descriptor,!0),a=P.makeDescriptor(o,this.resolution);return i.storedDescriptors.set(o.descriptorHash,o),i.storedDescriptors.set(a.descriptorHash,a),i.resolutionAliases.set(o.descriptorHash,a.descriptorHash),(await Ge.start({configuration:t,stdout:this.context.stdout},async c=>{await i.install({cache:s,report:c})})).exitCode()}};Nu.paths=[[\"set\",\"resolution\"]],Nu.usage=ve.Usage({description:\"enforce a package resolution\",details:'\\n      This command updates the resolution table so that `descriptor` is resolved by `resolution`.\\n\\n      Note that by default this command only affect the current resolution table - meaning that this \"manual override\" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\\n\\n      Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\\n    ',examples:[[\"Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0\",\"$0 set resolution lodash@npm:^1.2.3 1.5.0\"]]});var Iae=Pe(wn()),Lu=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Unlink all workspaces belonging to the target project from the current one\"});this.leadingArguments=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);let o=i.topLevelWorkspace,a=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:c,reference:u}of o.manifest.resolutions)u.startsWith(\"portal:\")&&a.add(c.descriptor.fullName);if(this.leadingArguments.length>0)for(let c of this.leadingArguments){let u=x.resolve(this.context.cwd,U.toPortablePath(c));if(Ie.isPathLike(c)){let g=await ye.find(u,this.context.plugins,{useRc:!1,strict:!1}),{project:f,workspace:h}=await je.find(g,u);if(!h)throw new ct(f.cwd,u);if(this.all){for(let p of f.workspaces)p.manifest.name&&a.add(P.stringifyIdent(p.locator));if(a.size===0)throw new be(\"No workspace found to be unlinked in the target project\")}else{if(!h.manifest.name)throw new be(\"The target workspace doesn't have a name and thus cannot be unlinked\");a.add(P.stringifyIdent(h.locator))}}else{let g=[...o.manifest.resolutions.map(({pattern:f})=>f.descriptor.fullName)];for(let f of(0,Iae.default)(g,c))a.add(f)}}return o.manifest.resolutions=o.manifest.resolutions.filter(({pattern:c})=>!a.has(c.descriptor.fullName)),(await Ge.start({configuration:t,stdout:this.context.stdout},async c=>{await i.install({cache:s,report:c})})).exitCode()}};Lu.paths=[[\"unlink\"]],Lu.usage=ve.Usage({description:\"disconnect the local project from another one\",details:`\n      This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments.\n    `,examples:[[\"Unregister a remote workspace in the current project\",\"$0 unlink ~/ts-loader\"],[\"Unregister all workspaces from a remote project in the current project\",\"$0 unlink ~/jest --all\"],[\"Unregister all previously linked workspaces\",\"$0 unlink --all\"],[\"Unregister all workspaces matching a glob\",\"$0 unlink '@babel/*' 'pkg-{a,b}'\"]]});var yae=Pe(Um()),iO=Pe(wn());ls();var ml=class extends De{constructor(){super(...arguments);this.interactive=z.Boolean(\"-i,--interactive\",{description:\"Offer various choices, depending on the detected upgrade paths\"});this.exact=z.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=z.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=z.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Resolve again ALL resolutions for those packages\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Xi(es)});this.patterns=z.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=[...i.storedDescriptors.values()],a=o.map(g=>P.stringifyIdent(g)),l=new Set;for(let g of this.patterns){if(P.parseDescriptor(g).range!==\"unknown\")throw new be(\"Ranges aren't allowed when using --recursive\");for(let f of(0,iO.default)(a,g)){let h=P.parseIdent(f);l.add(h.identHash)}}let c=o.filter(g=>l.has(g.identHash));for(let g of c)i.storedDescriptors.delete(g.descriptorHash),i.storedResolutions.delete(g.descriptorHash);return(await Ge.start({configuration:t,stdout:this.context.stdout},async g=>{await i.install({cache:s,report:g})})).exitCode()}async executeUpClassic(){var y;let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=(y=this.interactive)!=null?y:t.get(\"preferInteractive\"),a=Hm(this,i),l=o?[\"keep\",\"reuse\",\"project\",\"latest\"]:[\"project\",\"latest\"],c=[],u=[];for(let B of this.patterns){let v=!1,D=P.parseDescriptor(B);for(let L of i.workspaces)for(let H of[\"dependencies\",\"devDependencies\"]){let $=[...L.manifest.getForScope(H).values()].map(V=>P.stringifyIdent(V));for(let V of(0,iO.default)($,P.stringifyIdent(D))){let W=P.parseIdent(V),_=L.manifest[H].get(W.identHash);if(typeof _>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let A=P.makeDescriptor(W,D.range);c.push(Promise.resolve().then(async()=>[L,H,_,await Gm(A,{project:i,workspace:L,cache:s,target:H,modifier:a,strategies:l})])),v=!0}}v||u.push(B)}if(u.length>1)throw new be(`Patterns ${ee.prettyList(t,u,xi.CODE)} don't match any packages referenced by any workspace`);if(u.length>0)throw new be(`Pattern ${ee.prettyList(t,u,xi.CODE)} doesn't match any packages referenced by any workspace`);let g=await Promise.all(c),f=await ra.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async B=>{for(let[,,v,{suggestions:D,rejections:L}]of g){let H=D.filter(j=>j.descriptor!==null);if(H.length===0){let[j]=L;if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");let $=this.cli.error(j);i.configuration.get(\"enableNetwork\")?B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range\n\n${$}`):B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range (note: network resolution has been disabled)\n\n${$}`)}else H.length>1&&!o&&B.reportError(27,`${P.prettyDescriptor(t,v)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(f.hasErrors())return f.exitCode();let h=!1,p=[];for(let[B,v,,{suggestions:D}]of g){let L,H=D.filter(W=>W.descriptor!==null),j=H[0].descriptor,$=H.every(W=>P.areDescriptorsEqual(W.descriptor,j));H.length===1||$?L=j:(h=!0,{answer:L}=await(0,yae.prompt)({type:\"select\",name:\"answer\",message:`Which range to you want to use in ${P.prettyWorkspace(t,B)} \\u276F ${v}?`,choices:D.map(({descriptor:W,name:_,reason:A})=>W?{name:_,hint:A,descriptor:W}:{name:_,hint:A,disabled:!0}),onCancel:()=>process.exit(130),result(W){return this.find(W,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let V=B.manifest[v].get(L.identHash);if(typeof V>\"u\")throw new Error(\"Assertion failed: This descriptor should have a matching entry\");if(V.descriptorHash!==L.descriptorHash)B.manifest[v].set(L.identHash,L),p.push([B,v,V,L]);else{let W=t.makeResolver(),_={project:i,resolver:W},A=W.bindDescriptor(V,B.anchoredLocator,_);i.forgetResolution(A)}}return await t.triggerMultipleHooks(B=>B.afterWorkspaceDependencyReplacement,p),h&&this.context.stdout.write(`\n`),(await Ge.start({configuration:t,stdout:this.context.stdout},async B=>{await i.install({cache:s,report:B,mode:this.mode})})).exitCode()}};ml.paths=[[\"up\"]],ml.usage=ve.Usage({description:\"upgrade dependencies across the project\",details:\"\\n      This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\\n\\n      If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\\n\\n      If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\\n\\n      The, `-C,--caret`, `-E,--exact` and  `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\\n\\n      This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\\n    \",examples:[[\"Upgrade all instances of lodash to the latest release\",\"$0 up lodash\"],[\"Upgrade all instances of lodash to the latest release, but ask confirmation for each\",\"$0 up lodash -i\"],[\"Upgrade all instances of lodash to 1.2.3\",\"$0 up lodash@1.2.3\"],[\"Upgrade all instances of packages with the `@babel` scope to the latest release\",\"$0 up '@babel/*'\"],[\"Upgrade all instances of packages containing the word `jest` to the latest release\",\"$0 up '*jest*'\"],[\"Upgrade all instances of packages with the `@babel` scope to 7.0.0\",\"$0 up '@babel/*@7.0.0'\"]]}),ml.schema=[av(\"recursive\",lc.Forbids,[\"interactive\",\"exact\",\"tilde\",\"caret\"],{ignore:[void 0,!1]})];var Tu=class extends De{constructor(){super(...arguments);this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"List, for each workspace, what are all the paths that lead to the dependency\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.peers=z.Boolean(\"--peers\",!1,{description:\"Also print the peer dependencies that match the specified name\"});this.package=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let s=P.parseIdent(this.package).identHash,o=this.recursive?K8e(i,s,{configuration:t,peers:this.peers}):U8e(i,s,{configuration:t,peers:this.peers});$n.emitTree(o,{configuration:t,stdout:this.context.stdout,json:this.json,separators:1})}};Tu.paths=[[\"why\"]],Tu.usage=ve.Usage({description:\"display the reason why a package is needed\",details:`\n      This command prints the exact reasons why a package appears in the dependency tree.\n\n      If \\`-R,--recursive\\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named \"Foo\" when looking for \"Bar\", it means that \"Foo\" already got printed higher in the tree.\n    `,examples:[[\"Explain why lodash is used in your project\",\"$0 why lodash\"]]});function U8e(r,e,{configuration:t,peers:i}){let n=Ie.sortMap(r.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={};for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=r.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(\"Assertion failed: The resolution should have been registered\");let f=r.storedPackages.get(g);if(!f)throw new Error(\"Assertion failed: The package should have been registered\");if(f.identHash!==e)continue;{let p=P.stringifyLocator(a);s[p]={value:[a,ee.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ee.Type.DEPENDENT]}}}return o}function K8e(r,e,{configuration:t,peers:i}){let n=Ie.sortMap(r.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let C=r.storedResolutions.get(p.descriptorHash);if(!C)throw new Error(\"Assertion failed: The resolution should have been registered\");let y=r.storedPackages.get(C);if(!y)throw new Error(\"Assertion failed: The package should have been registered\");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error(\"Assertion failed: The package should have been registered\");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let C=p!==null?ee.tuple(ee.Type.DEPENDENT,{locator:f,descriptor:p}):ee.tuple(ee.Type.LOCATOR,f),y={},B={value:C,children:y},v=P.stringifyLocator(f);if(h[v]=B,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&r.tryWorkspaceByLocator(f))))for(let D of f.dependencies.values()){if(!i&&f.peerDependencies.has(D.identHash))continue;let L=r.storedResolutions.get(D.descriptorHash);if(!L)throw new Error(\"Assertion failed: The resolution should have been registered\");let H=r.storedPackages.get(L);if(!H)throw new Error(\"Assertion failed: The package should have been registered\");g(H,y,D)}};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error(\"Assertion failed: The package should have been registered\");g(h,c,null)}return u}var hO={};ut(hO,{default:()=>o4e,gitUtils:()=>AA});var AA={};ut(AA,{TreeishProtocols:()=>TQ,clone:()=>fO,fetchBase:()=>Yae,fetchChangedFiles:()=>jae,fetchChangedWorkspaces:()=>n4e,fetchRoot:()=>Gae,isGitUrl:()=>ep,lsRemote:()=>Hae,normalizeLocator:()=>uO,normalizeRepoUrl:()=>Vm,resolveUrl:()=>gO,splitRepoUrl:()=>zm});var cO=Pe(Lae()),Uae=Pe(PB()),$h=Pe(J(\"querystring\")),AO=Pe(Xr());var Oae=J(\"url\");function aO(r,e,t){let i=r.indexOf(t);return r.lastIndexOf(e,i>-1?i:1/0)}function Tae(r){try{return new Oae.URL(r)}catch{return}}function r4e(r){let e=aO(r,\"@\",\"#\"),t=aO(r,\":\",\"#\");return t>e&&(r=`${r.slice(0,t)}/${r.slice(t+1)}`),aO(r,\":\",\"#\")===-1&&r.indexOf(\"//\")===-1&&(r=`ssh://${r}`),r}function Mae(r){return Tae(r)||Tae(r4e(r))}function Kae(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||\"ssh\"} -o BatchMode=yes`}}var i4e=[/^ssh:/,/^git(?:\\+[^:]+)?:/,/^(?:git\\+)?https?:[^#]+\\/[^#]+(?:\\.git)(?:#.*)?$/,/^git@[^#]+\\/[^#]+\\.git(?:#.*)?$/,/^(?:github:|https:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z._0-9-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\\.git)?(?:#.*)?$/,/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/],TQ=(n=>(n.Commit=\"commit\",n.Head=\"head\",n.Tag=\"tag\",n.Semver=\"semver\",n))(TQ||{});function ep(r){return r?i4e.some(e=>!!r.match(e)):!1}function zm(r){r=Vm(r);let e=r.indexOf(\"#\");if(e===-1)return{repo:r,treeish:{protocol:\"head\",request:\"HEAD\"},extra:{}};let t=r.slice(0,e),i=r.slice(e+1);if(i.match(/^[a-z]+=/)){let n=$h.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!=\"string\")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(TQ).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s<\"u\"?(o=s,a=n[s]):(o=\"head\",a=\"HEAD\");for(let l of Object.values(TQ))delete n[l];return{repo:t,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(\":\"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:t,treeish:{protocol:s,request:o},extra:{}}}}function Vm(r,{git:e=!1}={}){if(r=r.replace(/^git\\+https:/,\"https:\"),r=r.replace(/^(?:github:|https:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\\.git)?(#.*)?$/,\"https://github.com/$1/$2.git$3\"),r=r.replace(/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/,\"https://github.com/$1/$2.git#$3\"),e){let t=Mae(r);t&&(r=t.href),r=r.replace(/^git\\+([^:]+):/,\"$1:\")}return r}function uO(r){return P.makeLocator(r,Vm(r.reference))}async function Hae(r,e){let t=Vm(r,{git:!0});if(!Xt.getNetworkSettings(`https://${(0,cO.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await lO(\"listing refs\",[\"ls-remote\",t],{cwd:e.startingCwd,env:Kae()},{configuration:e,normalizedRepoUrl:t}),s=new Map,o=/^([a-f0-9]{40})\\t([^\\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function gO(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=zm(r),o=await Hae(t,e),a=(c,u)=>{switch(c){case\"commit\":{if(!u.match(/^[a-f0-9]{40}$/))throw new Error(\"Invalid commit hash\");return $h.default.stringify({...s,commit:u})}case\"head\":{let g=o.get(u===\"HEAD\"?u:`refs/heads/${u}`);if(typeof g>\"u\")throw new Error(`Unknown head (\"${u}\")`);return $h.default.stringify({...s,commit:g})}case\"tag\":{let g=o.get(`refs/tags/${u}`);if(typeof g>\"u\")throw new Error(`Unknown tag (\"${u}\")`);return $h.default.stringify({...s,commit:g})}case\"semver\":{let g=vt.validRange(u);if(!g)throw new Error(`Invalid range (\"${u}\")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith(\"refs/tags/\")).map(([p,C])=>[AO.default.parse(p.slice(10)),C]).filter(p=>p[0]!==null)),h=AO.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range (\"${u}\")`);return $h.default.stringify({...s,commit:f.get(h)})}case null:{let g;if((g=l(\"commit\",u))!==null||(g=l(\"tag\",u))!==null||(g=l(\"head\",u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve \"${u}\" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve \"${u}\" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol (\"${c}\")`)}},l=(c,u)=>{try{return a(c,u)}catch{return null}};return`${t}#${a(i,n)}`}async function fO(r,e){return await e.getLimit(\"cloneConcurrency\")(async()=>{let{repo:t,treeish:{protocol:i,request:n}}=zm(r);if(i!==\"commit\")throw new Error(\"Invalid treeish protocol when cloning\");let s=Vm(t,{git:!0});if(Xt.getNetworkSettings(`https://${(0,cO.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await M.mktempPromise(),a={cwd:o,env:Kae()};return await lO(\"cloning the repository\",[\"clone\",\"-c core.autocrlf=false\",s,U.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await lO(\"switching branch\",[\"checkout\",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function Gae(r){let e=null,t,i=r;do t=i,await M.existsPromise(x.join(t,\".git\"))&&(e=t),i=x.dirname(t);while(e===null&&i!==t);return e}async function Yae(r,{baseRefs:e}){if(e.length===0)throw new be(\"Can't run this command with zero base refs specified.\");let t=[];for(let a of e){let{code:l}=await Cr.execvp(\"git\",[\"merge-base\",a,\"HEAD\"],{cwd:r});l===0&&t.push(a)}if(t.length===0)throw new be(`No ancestor could be found between any of HEAD and ${e.join(\", \")}`);let{stdout:i}=await Cr.execvp(\"git\",[\"merge-base\",\"HEAD\",...t],{cwd:r,strict:!0}),n=i.trim(),{stdout:s}=await Cr.execvp(\"git\",[\"show\",\"--quiet\",\"--pretty=format:%s\",n],{cwd:r,strict:!0}),o=s.trim();return{hash:n,title:o}}async function jae(r,{base:e,project:t}){let i=Ie.buildIgnorePattern(t.configuration.get(\"changesetIgnorePatterns\")),{stdout:n}=await Cr.execvp(\"git\",[\"diff\",\"--name-only\",`${e}`],{cwd:r,strict:!0}),s=n.split(/\\r\\n|\\r|\\n/).filter(c=>c.length>0).map(c=>x.resolve(r,U.toPortablePath(c))),{stdout:o}=await Cr.execvp(\"git\",[\"ls-files\",\"--others\",\"--exclude-standard\"],{cwd:r,strict:!0}),a=o.split(/\\r\\n|\\r|\\n/).filter(c=>c.length>0).map(c=>x.resolve(r,U.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!x.relative(t.cwd,c).match(i)):l}async function n4e({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new be(\"This command can only be run from within a Yarn project\");let t=[x.resolve(e.cwd,e.configuration.get(\"cacheFolder\")),x.resolve(e.cwd,e.configuration.get(\"installStatePath\")),x.resolve(e.cwd,e.configuration.get(\"lockfileFilename\")),x.resolve(e.cwd,e.configuration.get(\"virtualFolder\"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&t.push(o)});let i=await Gae(e.configuration.projectCwd);if(i==null)throw new be(\"This command can only be run on Git repositories\");let n=await Yae(i,{baseRefs:typeof r==\"string\"?[r]:e.configuration.get(\"changesetBaseRefs\")}),s=await jae(i,{base:n.hash,project:e});return new Set(Ie.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?Ie.mapAndFilter.skip:t.some(l=>o.startsWith(l))?Ie.mapAndFilter.skip:a}))}async function lO(r,e,t,{configuration:i,normalizedRepoUrl:n}){try{return await Cr.execvp(\"git\",e,{...t,strict:!0})}catch(s){if(!(s instanceof Cr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new at(1,`Failed ${r}`,l=>{l.reportError(1,`  ${ee.prettyField(i,{label:\"Repository URL\",value:ee.tuple(ee.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u===\"error\"?\"Error\":`${(0,Uae.default)(u)} Error`;l.reportError(1,`  ${ee.prettyField(i,{label:f,value:ee.tuple(ee.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var OQ=class{supports(e,t){return ep(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,n=uO(e),s=new Map(t.checksums);s.set(n.locatorHash,i);let o={...t,checksums:s},a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){let i=await fO(e.reference,t.project.configuration),n=zm(e.reference),s=x.join(i,\"package.tgz\");await Wt.prepareExternalProject(i,s,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace,locator:e});let o=await M.readFilePromise(s);return await Ie.releaseAfterUseAsync(async()=>await mi.convertToZip(o,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var MQ=class{supportsDescriptor(e,t){return ep(e.range)}supportsLocator(e,t){return ep(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=await gO(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var s4e={configuration:{changesetBaseRefs:{description:\"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.\",type:\"STRING\",isArray:!0,isNullable:!1,default:[\"master\",\"origin/master\",\"upstream/master\",\"main\",\"origin/main\",\"upstream/main\"]},changesetIgnorePatterns:{description:\"Array of glob patterns; files matching them will be ignored when fetching the changed files\",type:\"STRING\",default:[],isArray:!0},cloneConcurrency:{description:\"Maximal number of concurrent clones\",type:\"NUMBER\",default:2}},fetchers:[OQ],resolvers:[MQ]};var o4e=s4e;var Ou=class extends De{constructor(){super(...arguments);this.since=z.String(\"--since\",{description:\"Only include workspaces that have been changed since the specified ref.\",tolerateBoolean:!0});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Find packages via dependencies/devDependencies instead of using the workspaces field\"});this.noPrivate=z.Boolean(\"--no-private\",{description:\"Exclude workspaces that have the private field set to true\"});this.verbose=z.Boolean(\"-v,--verbose\",!1,{description:\"Also return the cross-dependencies between workspaces\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd);return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async s=>{let o=this.since?await AA.fetchChangedWorkspaces({ref:this.since,project:i}):i.workspaces,a=new Set(o);if(this.recursive)for(let l of[...o].map(c=>c.getRecursiveWorkspaceDependents()))for(let c of l)a.add(c);for(let l of a){let{manifest:c}=l;if(c.private&&this.noPrivate)continue;let u;if(this.verbose){let g=new Set,f=new Set;for(let h of ot.hardDependencies)for(let[p,C]of c.getForScope(h)){let y=i.tryWorkspaceByDescriptor(C);y===null?i.workspacesByIdent.has(p)&&f.add(C):g.add(y)}u={workspaceDependencies:Array.from(g).map(h=>h.relativeCwd),mismatchedWorkspaceDependencies:Array.from(f).map(h=>P.stringifyDescriptor(h))}}s.reportInfo(null,`${l.relativeCwd}`),s.reportJson({location:l.relativeCwd,name:c.name?P.stringifyIdent(c.name):null,...u})}})).exitCode()}};Ou.paths=[[\"workspaces\",\"list\"]],Ou.usage=ve.Usage({category:\"Workspace-related commands\",description:\"list all available workspaces\",details:\"\\n      This command will print the list of all workspaces in the project.\\n\\n      - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\\n\\n      - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\\n\\n      - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\\n\\n      - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\\n    \"});var Mu=class extends De{constructor(){super(...arguments);this.workspaceName=z.String();this.commandName=z.String();this.args=z.Proxy()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);let s=i.workspaces,o=new Map(s.map(l=>[P.stringifyIdent(l.locator),l])),a=o.get(this.workspaceName);if(a===void 0){let l=Array.from(o.keys()).sort();throw new be(`Workspace '${this.workspaceName}' not found. Did you mean any of the following:\n  - ${l.join(`\n  - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:a.cwd})}};Mu.paths=[[\"workspace\"]],Mu.usage=ve.Usage({category:\"Workspace-related commands\",description:\"run a command within the specified workspace\",details:`\n      This command will run a given sub-command on a single workspace.\n    `,examples:[[\"Add a package to a single workspace\",\"yarn workspace components add -D react\"],[\"Run build script on a single workspace\",\"yarn workspace components run build\"]]});var a4e={configuration:{enableImmutableInstalls:{description:\"If true (the default on CI), prevents the install command from modifying the lockfile\",type:\"BOOLEAN\",default:qae.isCI},defaultSemverRangePrefix:{description:\"The default save prefix: '^', '~' or ''\",type:\"STRING\",values:[\"^\",\"~\",\"\"],default:\"^\"}},commands:[cu,uu,gu,fu,Nu,Su,mu,Ou,Vh,Xh,qm,Zh,Au,lu,hu,pu,du,Cu,Eu,Iu,yu,wu,Lu,Bu,xu,vu,Pu,Qu,Du,ku,Ru,_h,Fu,ml,Tu,Mu]},A4e=a4e;var IO={};ut(IO,{default:()=>c4e});var Le={optional:!0},dO=[[\"@tailwindcss/aspect-ratio@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@tailwindcss/line-clamp@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0\",{peerDependencies:{postcss:\"^8.0.0\"}}],[\"@samverschueren/stream-to-observable@<0.3.1\",{peerDependenciesMeta:{rxjs:Le,zenObservable:Le}}],[\"any-observable@<0.5.1\",{peerDependenciesMeta:{rxjs:Le,zenObservable:Le}}],[\"@pm2/agent@<1.0.4\",{dependencies:{debug:\"*\"}}],[\"debug@<4.2.0\",{peerDependenciesMeta:{[\"supports-color\"]:Le}}],[\"got@<11\",{dependencies:{[\"@types/responselike\"]:\"^1.0.0\",[\"@types/keyv\"]:\"^3.1.1\"}}],[\"cacheable-lookup@<4.1.2\",{dependencies:{[\"@types/keyv\"]:\"^3.1.1\"}}],[\"http-link-dataloader@*\",{peerDependencies:{graphql:\"^0.13.1 || ^14.0.0\"}}],[\"typescript-language-server@*\",{dependencies:{[\"vscode-jsonrpc\"]:\"^5.0.1\",[\"vscode-languageserver-protocol\"]:\"^3.15.0\"}}],[\"postcss-syntax@*\",{peerDependenciesMeta:{[\"postcss-html\"]:Le,[\"postcss-jsx\"]:Le,[\"postcss-less\"]:Le,[\"postcss-markdown\"]:Le,[\"postcss-scss\"]:Le}}],[\"jss-plugin-rule-value-function@<=10.1.1\",{dependencies:{[\"tiny-warning\"]:\"^1.0.2\"}}],[\"ink-select-input@<4.1.0\",{peerDependencies:{react:\"^16.8.2\"}}],[\"license-webpack-plugin@<2.3.18\",{peerDependenciesMeta:{webpack:Le}}],[\"snowpack@>=3.3.0\",{dependencies:{[\"node-gyp\"]:\"^7.1.0\"}}],[\"promise-inflight@*\",{peerDependenciesMeta:{bluebird:Le}}],[\"reactcss@*\",{peerDependencies:{react:\"*\"}}],[\"react-color@<=2.19.0\",{peerDependencies:{react:\"*\"}}],[\"gatsby-plugin-i18n@*\",{dependencies:{ramda:\"^0.24.1\"}}],[\"useragent@^2.0.0\",{dependencies:{request:\"^2.88.0\",yamlparser:\"0.0.x\",semver:\"5.5.x\"}}],[\"@apollographql/apollo-tools@<=0.5.2\",{peerDependencies:{graphql:\"^14.2.1 || ^15.0.0\"}}],[\"material-table@^2.0.0\",{dependencies:{\"@babel/runtime\":\"^7.11.2\"}}],[\"@babel/parser@*\",{dependencies:{\"@babel/types\":\"^7.8.3\"}}],[\"fork-ts-checker-webpack-plugin@<=6.3.4\",{peerDependencies:{eslint:\">= 6\",typescript:\">= 2.7\",webpack:\">= 4\",\"vue-template-compiler\":\"*\"},peerDependenciesMeta:{eslint:Le,\"vue-template-compiler\":Le}}],[\"rc-animate@<=3.1.1\",{peerDependencies:{react:\">=16.9.0\",\"react-dom\":\">=16.9.0\"}}],[\"react-bootstrap-table2-paginator@*\",{dependencies:{classnames:\"^2.2.6\"}}],[\"react-draggable@<=4.4.3\",{peerDependencies:{react:\">= 16.3.0\",\"react-dom\":\">= 16.3.0\"}}],[\"apollo-upload-client@<14\",{peerDependencies:{graphql:\"14 - 15\"}}],[\"react-instantsearch-core@<=6.7.0\",{peerDependencies:{algoliasearch:\">= 3.1 < 5\"}}],[\"react-instantsearch-dom@<=6.7.0\",{dependencies:{\"react-fast-compare\":\"^3.0.0\"}}],[\"ws@<7.2.1\",{peerDependencies:{bufferutil:\"^4.0.1\",\"utf-8-validate\":\"^5.0.2\"},peerDependenciesMeta:{bufferutil:Le,\"utf-8-validate\":Le}}],[\"react-portal@<4.2.2\",{peerDependencies:{\"react-dom\":\"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0\"}}],[\"react-scripts@<=4.0.1\",{peerDependencies:{react:\"*\"}}],[\"testcafe@<=1.10.1\",{dependencies:{\"@babel/plugin-transform-for-of\":\"^7.12.1\",\"@babel/runtime\":\"^7.12.5\"}}],[\"testcafe-legacy-api@<=4.2.0\",{dependencies:{\"testcafe-hammerhead\":\"^17.0.1\",\"read-file-relative\":\"^1.2.0\"}}],[\"@google-cloud/firestore@<=4.9.3\",{dependencies:{protobufjs:\"^6.8.6\"}}],[\"gatsby-source-apiserver@*\",{dependencies:{[\"babel-polyfill\"]:\"^6.26.0\"}}],[\"@webpack-cli/package-utils@<=1.0.1-alpha.4\",{dependencies:{[\"cross-spawn\"]:\"^7.0.3\"}}],[\"gatsby-remark-prismjs@<3.3.28\",{dependencies:{lodash:\"^4\"}}],[\"gatsby-plugin-favicon@*\",{peerDependencies:{webpack:\"*\"}}],[\"gatsby-plugin-sharp@<=4.6.0-next.3\",{dependencies:{debug:\"^4.3.1\"}}],[\"gatsby-react-router-scroll@<=5.6.0-next.0\",{dependencies:{[\"prop-types\"]:\"^15.7.2\"}}],[\"@rebass/forms@*\",{dependencies:{[\"@styled-system/should-forward-prop\"]:\"^5.0.0\"},peerDependencies:{react:\"^16.8.6\"}}],[\"rebass@*\",{peerDependencies:{react:\"^16.8.6\"}}],[\"@ant-design/react-slick@<=0.28.3\",{peerDependencies:{react:\">=16.0.0\"}}],[\"mqtt@<4.2.7\",{dependencies:{duplexify:\"^4.1.1\"}}],[\"vue-cli-plugin-vuetify@<=2.0.3\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":Le,\"vuetify-loader\":Le}}],[\"vue-cli-plugin-vuetify@<=2.0.4\",{dependencies:{\"null-loader\":\"^3.0.0\"}}],[\"vue-cli-plugin-vuetify@>=2.4.3\",{peerDependencies:{vue:\"*\"}}],[\"@vuetify/cli-plugin-utils@<=0.0.4\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":Le}}],[\"@vue/cli-plugin-typescript@<=5.0.0-alpha.0\",{dependencies:{\"babel-loader\":\"^8.1.0\"}}],[\"@vue/cli-plugin-typescript@<=5.0.0-beta.0\",{dependencies:{\"@babel/core\":\"^7.12.16\"},peerDependencies:{\"vue-template-compiler\":\"^2.0.0\"},peerDependenciesMeta:{\"vue-template-compiler\":Le}}],[\"cordova-ios@<=6.3.0\",{dependencies:{underscore:\"^1.9.2\"}}],[\"cordova-lib@<=10.0.1\",{dependencies:{underscore:\"^1.9.2\"}}],[\"git-node-fs@*\",{peerDependencies:{\"js-git\":\"^0.7.8\"},peerDependenciesMeta:{\"js-git\":Le}}],[\"consolidate@<0.16.0\",{peerDependencies:{mustache:\"^3.0.0\"},peerDependenciesMeta:{mustache:Le}}],[\"consolidate@<=0.16.0\",{peerDependencies:{velocityjs:\"^2.0.1\",tinyliquid:\"^0.2.34\",\"liquid-node\":\"^3.0.1\",jade:\"^1.11.0\",\"then-jade\":\"*\",dust:\"^0.3.0\",\"dustjs-helpers\":\"^1.7.4\",\"dustjs-linkedin\":\"^2.7.5\",swig:\"^1.4.2\",\"swig-templates\":\"^2.0.3\",\"razor-tmpl\":\"^1.3.1\",atpl:\">=0.7.6\",liquor:\"^0.0.5\",twig:\"^1.15.2\",ejs:\"^3.1.5\",eco:\"^1.1.0-rc-3\",jazz:\"^0.0.18\",jqtpl:\"~1.1.0\",hamljs:\"^0.6.2\",hamlet:\"^0.3.3\",whiskers:\"^0.4.0\",\"haml-coffee\":\"^1.14.1\",\"hogan.js\":\"^3.0.2\",templayed:\">=0.2.3\",handlebars:\"^4.7.6\",underscore:\"^1.11.0\",lodash:\"^4.17.20\",pug:\"^3.0.0\",\"then-pug\":\"*\",qejs:\"^3.0.5\",walrus:\"^0.10.1\",mustache:\"^4.0.1\",just:\"^0.1.8\",ect:\"^0.5.9\",mote:\"^0.2.0\",toffee:\"^0.3.6\",dot:\"^1.1.3\",\"bracket-template\":\"^1.1.5\",ractive:\"^1.3.12\",nunjucks:\"^3.2.2\",htmling:\"^0.0.8\",\"babel-core\":\"^6.26.3\",plates:\"~0.4.11\",\"react-dom\":\"^16.13.1\",react:\"^16.13.1\",\"arc-templates\":\"^0.5.3\",vash:\"^0.13.0\",slm:\"^2.0.0\",marko:\"^3.14.4\",teacup:\"^2.0.0\",\"coffee-script\":\"^1.12.7\",squirrelly:\"^5.1.0\",twing:\"^5.0.2\"},peerDependenciesMeta:{velocityjs:Le,tinyliquid:Le,\"liquid-node\":Le,jade:Le,\"then-jade\":Le,dust:Le,\"dustjs-helpers\":Le,\"dustjs-linkedin\":Le,swig:Le,\"swig-templates\":Le,\"razor-tmpl\":Le,atpl:Le,liquor:Le,twig:Le,ejs:Le,eco:Le,jazz:Le,jqtpl:Le,hamljs:Le,hamlet:Le,whiskers:Le,\"haml-coffee\":Le,\"hogan.js\":Le,templayed:Le,handlebars:Le,underscore:Le,lodash:Le,pug:Le,\"then-pug\":Le,qejs:Le,walrus:Le,mustache:Le,just:Le,ect:Le,mote:Le,toffee:Le,dot:Le,\"bracket-template\":Le,ractive:Le,nunjucks:Le,htmling:Le,\"babel-core\":Le,plates:Le,\"react-dom\":Le,react:Le,\"arc-templates\":Le,vash:Le,slm:Le,marko:Le,teacup:Le,\"coffee-script\":Le,squirrelly:Le,twing:Le}}],[\"vue-loader@<=16.3.3\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",webpack:\"^4.1.0 || ^5.0.0-0\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":Le}}],[\"vue-loader@^16.7.0\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",vue:\"^3.2.13\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":Le,vue:Le}}],[\"scss-parser@<=1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"query-ast@<1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"redux-thunk@<=2.3.0\",{peerDependencies:{redux:\"^4.0.0\"}}],[\"skypack@<=0.3.2\",{dependencies:{tar:\"^6.1.0\"}}],[\"@npmcli/metavuln-calculator@<2.0.0\",{dependencies:{\"json-parse-even-better-errors\":\"^2.3.1\"}}],[\"bin-links@<2.3.0\",{dependencies:{\"mkdirp-infer-owner\":\"^1.0.2\"}}],[\"rollup-plugin-polyfill-node@<=0.8.0\",{peerDependencies:{rollup:\"^1.20.0 || ^2.0.0\"}}],[\"snowpack@<3.8.6\",{dependencies:{\"magic-string\":\"^0.25.7\"}}],[\"elm-webpack-loader@*\",{dependencies:{temp:\"^0.9.4\"}}],[\"winston-transport@<=4.4.0\",{dependencies:{logform:\"^2.2.0\"}}],[\"jest-vue-preprocessor@*\",{dependencies:{\"@babel/core\":\"7.8.7\",\"@babel/template\":\"7.8.6\"},peerDependencies:{pug:\"^2.0.4\"},peerDependenciesMeta:{pug:Le}}],[\"redux-persist@*\",{peerDependencies:{react:\">=16\"},peerDependenciesMeta:{react:Le}}],[\"sodium@>=3\",{dependencies:{\"node-gyp\":\"^3.8.0\"}}],[\"babel-plugin-graphql-tag@<=3.1.0\",{peerDependencies:{graphql:\"^14.0.0 || ^15.0.0\"}}],[\"@playwright/test@<=1.14.1\",{dependencies:{\"jest-matcher-utils\":\"^26.4.2\"}}],...[\"babel-plugin-remove-graphql-queries@<3.14.0-next.1\",\"babel-preset-gatsby-package@<1.14.0-next.1\",\"create-gatsby@<1.14.0-next.1\",\"gatsby-admin@<0.24.0-next.1\",\"gatsby-cli@<3.14.0-next.1\",\"gatsby-core-utils@<2.14.0-next.1\",\"gatsby-design-tokens@<3.14.0-next.1\",\"gatsby-legacy-polyfills@<1.14.0-next.1\",\"gatsby-plugin-benchmark-reporting@<1.14.0-next.1\",\"gatsby-plugin-graphql-config@<0.23.0-next.1\",\"gatsby-plugin-image@<1.14.0-next.1\",\"gatsby-plugin-mdx@<2.14.0-next.1\",\"gatsby-plugin-netlify-cms@<5.14.0-next.1\",\"gatsby-plugin-no-sourcemaps@<3.14.0-next.1\",\"gatsby-plugin-page-creator@<3.14.0-next.1\",\"gatsby-plugin-preact@<5.14.0-next.1\",\"gatsby-plugin-preload-fonts@<2.14.0-next.1\",\"gatsby-plugin-schema-snapshot@<2.14.0-next.1\",\"gatsby-plugin-styletron@<6.14.0-next.1\",\"gatsby-plugin-subfont@<3.14.0-next.1\",\"gatsby-plugin-utils@<1.14.0-next.1\",\"gatsby-recipes@<0.25.0-next.1\",\"gatsby-source-shopify@<5.6.0-next.1\",\"gatsby-source-wikipedia@<3.14.0-next.1\",\"gatsby-transformer-screenshot@<3.14.0-next.1\",\"gatsby-worker@<0.5.0-next.1\"].map(r=>[r,{dependencies:{\"@babel/runtime\":\"^7.14.8\"}}]),[\"gatsby-core-utils@<2.14.0-next.1\",{dependencies:{got:\"8.3.2\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.1.0-next.0\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.2.0-next.1\",{peerDependencies:{webpack:\"*\"}}],[\"babel-plugin-remove-graphql-queries@<=3.14.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.8.0-next.1\"}}],[\"gatsby-plugin-netlify@3.13.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"clipanion-v3-codemod@<=0.2.0\",{peerDependencies:{jscodeshift:\"^0.11.0\"}}],[\"react-live@*\",{peerDependencies:{\"react-dom\":\"*\",react:\"*\"}}],[\"webpack@<4.44.1\",{peerDependenciesMeta:{\"webpack-cli\":Le,\"webpack-command\":Le}}],[\"webpack@<5.0.0-beta.23\",{peerDependenciesMeta:{\"webpack-cli\":Le}}],[\"webpack-dev-server@<3.10.2\",{peerDependenciesMeta:{\"webpack-cli\":Le}}],[\"@docusaurus/responsive-loader@<1.5.0\",{peerDependenciesMeta:{sharp:Le,jimp:Le}}],[\"eslint-module-utils@*\",{peerDependenciesMeta:{\"eslint-import-resolver-node\":Le,\"eslint-import-resolver-typescript\":Le,\"eslint-import-resolver-webpack\":Le,\"@typescript-eslint/parser\":Le}}],[\"eslint-plugin-import@*\",{peerDependenciesMeta:{\"@typescript-eslint/parser\":Le}}],[\"critters-webpack-plugin@<3.0.2\",{peerDependenciesMeta:{\"html-webpack-plugin\":Le}}],[\"terser@<=5.10.0\",{dependencies:{acorn:\"^8.5.0\"}}],[\"babel-preset-react-app@10.0.x\",{dependencies:{\"@babel/plugin-proposal-private-property-in-object\":\"^7.16.0\"}}],[\"eslint-config-react-app@*\",{peerDependenciesMeta:{typescript:Le}}],[\"@vue/eslint-config-typescript@<11.0.0\",{peerDependenciesMeta:{typescript:Le}}],[\"unplugin-vue2-script-setup@<0.9.1\",{peerDependencies:{\"@vue/composition-api\":\"^1.4.3\",\"@vue/runtime-dom\":\"^3.2.26\"}}],[\"@cypress/snapshot@*\",{dependencies:{debug:\"^3.2.7\"}}],[\"auto-relay@<=0.14.0\",{peerDependencies:{\"reflect-metadata\":\"^0.1.13\"}}],[\"vue-template-babel-compiler@<1.2.0\",{peerDependencies:{[\"vue-template-compiler\"]:\"^2.6.0\"}}],[\"@parcel/transformer-image@<2.5.0\",{peerDependencies:{[\"@parcel/core\"]:\"*\"}}],[\"@parcel/transformer-js@<2.5.0\",{peerDependencies:{[\"@parcel/core\"]:\"*\"}}],[\"parcel@*\",{peerDependenciesMeta:{[\"@parcel/core\"]:Le}}],[\"react-scripts@*\",{peerDependencies:{eslint:\"*\"}}],[\"focus-trap-react@^8.0.0\",{dependencies:{tabbable:\"^5.3.2\"}}],[\"react-rnd@<10.3.7\",{peerDependencies:{react:\">=16.3.0\",\"react-dom\":\">=16.3.0\"}}],[\"connect-mongo@*\",{peerDependencies:{\"express-session\":\"^1.17.1\"}}],[\"vue-i18n@<9\",{peerDependencies:{vue:\"^2\"}}],[\"vue-router@<4\",{peerDependencies:{vue:\"^2\"}}],[\"unified@<10\",{dependencies:{\"@types/unist\":\"^2.0.0\"}}],[\"react-github-btn@<=1.3.0\",{peerDependencies:{react:\">=16.3.0\"}}],[\"react-dev-utils@*\",{peerDependencies:{typescript:\">=2.7\",webpack:\">=4\"},peerDependenciesMeta:{typescript:Le}}],[\"@asyncapi/react-component@<=1.0.0-next.39\",{peerDependencies:{react:\">=16.8.0\",\"react-dom\":\">=16.8.0\"}}],[\"xo@*\",{peerDependencies:{webpack:\">=1.11.0\"},peerDependenciesMeta:{webpack:Le}}],[\"babel-plugin-remove-graphql-queries@<=4.20.0-next.0\",{dependencies:{\"@babel/types\":\"^7.15.4\"}}],[\"gatsby-plugin-page-creator@<=4.20.0-next.1\",{dependencies:{\"fs-extra\":\"^10.1.0\"}}],[\"gatsby-plugin-utils@<=3.14.0-next.1\",{dependencies:{fastq:\"^1.13.0\"},peerDependencies:{graphql:\"^15.0.0\"}}],[\"gatsby-plugin-mdx@<3.1.0-next.1\",{dependencies:{mkdirp:\"^1.0.4\"}}],[\"gatsby-plugin-mdx@^2\",{peerDependencies:{gatsby:\"^3.0.0-next\"}}],[\"fdir@<=5.2.0\",{peerDependencies:{picomatch:\"2.x\"},peerDependenciesMeta:{picomatch:Le}}],[\"babel-plugin-transform-typescript-metadata@<=0.3.2\",{peerDependencies:{\"@babel/core\":\"^7\",\"@babel/traverse\":\"^7\"},peerDependenciesMeta:{\"@babel/traverse\":Le}}],[\"graphql-compose@>=9.0.10\",{peerDependencies:{graphql:\"^14.2.0 || ^15.0.0 || ^16.0.0\"}}]];var CO;function Jae(){return typeof CO>\"u\"&&(CO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==\",\"base64\")).toString()),CO}var mO;function Wae(){return typeof mO>\"u\"&&(mO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=\",\"base64\")).toString()),mO}var EO;function zae(){return typeof EO>\"u\"&&(EO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"mzfdL4Ntw15vVvEA/pu5KZCTjSudMgzQWnAw/f5/b08oOtYRMVy0a9j4YQVHmzKg3gqoHLaezg4GKNQ0BKoxMGj9KKnyZbuOYCU4YtTbtl8QX35mK9FBMfw87tXZcbQUzYyuQw4zH571Y1BPM1vHdr329pMGg8cATm71ByCmqjEZ6bmKTcgJhfENT75euTqctD1XYySqZ7UkUKVHetzJgpfl/fLN1T8/Xw9+aDGyMmvmDHuZ63SRzF4UpTiR7GhwFFd3BzZTNf6/Te333qwuSpMUmYeEnQJT2+qXle0BCeQ0SHyAqfbza/2s0zk9Rg0jukLN+7Jixm+iRCDSWQ4EQvM8Qq/lcnYT35ywSP2MqjC9BSAhUVN6/f6rsvyXl6BT0Yq+nNjOUBEd85WwLtrQpjVjywIsEEws23L56fLw31yYsktNKZSl4uD0CR1Z9bN82IHcPMgQEUjX9DMquiaUnOiceigTcu51Yua4RBG4AN7G+3Zfb2p1hSAJYL830jiyHcDZXWKc5sQ53LgUKa2zBhWZkcEuoIBuAiBfgwQlv2/k1kg9xmZkRGQWqgpQAyIlkTKrHWfN5bSXq/G39bdz/ipAS7m27LXkeGm9Pxwu++e0T/pHV5rf+8W713R3SZwK3xJiAxaEvjKWNwXwimqBQXuZb4kFsjXA2JnYpzSNU/SktPWhf4GV3v+ZWpnO8Y5zjt1r8D/W1O95s6izWW+Q3Z3MvFwu01MSHJ8KNSB5xjmOHGaiixTRoXHGZnIuVihFAoMkkrIYmO4C1jTINVXAmfrdT8Ouhpz1e1el2HZU35ekXDNLpo2ToF7AFi5AQWzfk9q+eRzkZ3QRmksDw0JgAOwBBIXxPUrTpEoio240yxKCAioeyTBFtWL621qjWYRSUitX9Nc9zpeh+9TTG38sLYQVIFCgit6TosU1z0kkZZmMafpziwlLQBIQ+1cQoLYRNcC67ukvQaaK9ibtaPrluFEpIxxjzdr89rYvBAREIDk5hRYKlITTZlO5QBi4S7SW3QeLsazizmbuzb5RoXkFhA5iwLqDL8Stf4N858x/z5AklOl2g//I6b++sftnjaZpYpUjrks4gIikYoDdsdw5nHT9XxlblCheiMBcwwd7maWim1yf8Ld+o21xOr8JBY+6mI+mWrjvBfc+t2PqnxcMfvdnuX+f+O1pfup94Hc5cQm09E68eo2Mrgd/G5NuUT3fNz53h2/9rpjPTfhkdpyfm/K9/Fc4deXpYD763Ju9TwjC4wGpo+zLFp79+FGmcp21FRT4OzTz+pQEsAyIjRe8ExRi5KXfHfJR6n4K4fXZGuQd+qGtnB9iacNCgxwC/NveXUJXfsGPG8VVrgDVpGu/tWYMAZqCiQZ1BfvMVS46X8zG7zqd8/4a+Up/y+4C/KYRfHu1hRuXrVZ5kZovsvlvoLhnsaX0w4rp44Lpv7aonE0OZpaYZ/tfEPBr8Na9dIx8WTyukNcDFpgofOmSXvDJ7A5QHrKsVJoRqJDvRXv6m1TNj/05mCnpYQFH2kktCz2i6D/TXiN7ZVuoXPb96d49i14NUIhu4jz+JOsceJtiBXH1m+5kE00uXkepSjsXmGtCF59NmuJdsCZbps1BwWApNv4EyxyaIQGO+GSrIZEy10eq1VqX1wDXlgKHi5u/XZ426osNDSJhoNf4F3TqIeYQ8yJFoQyW8C/xzURFCzySSfXrYyQpcDOEDara1rEPvogv64GN18MMkEj08aEJsqpUqfcNd5kEkk/e3r07DzJnyFho5dufqrvn7qatqTeHb6ZRv8tlWS7ottYkzgB9fmIeYO76HMeh1/gR+Jz4xAiu9p63JQJZKmmxhYHTOtsQ4/6OlzvTuU1ZAEoBGbJ5UyAmbUDBSVSMyYPPvIjBHHOnCC2YPY8tdFaZNFxjguDrLWDUv24kimWLlAZ1/hOenPmjFIuJmCkh6lEe0RpBbF2tcJGae6J8kSp9WraV7Ofi04LQXLRk+pjkC1Nh8kVMsOCDSgv+9XNOr5GmRTDqRSTiwg1KRlHO+xSwc5CxiQjloxTgIGpiG9HPDF6mF3aIKHk9j60KI1BAu6cHkePn3DdxRzmPI9v5FVBt1Ob1udDsM5IHpnJJWql7JgIPCi32tX4o5+tkBS8zLzxaBIRubwI0mYf+Blui8G0k4UQzD7l6KnLzmdUBibJ8iMq3nMPt8aHN/+nNYHvlRm303W10JjEgPks8Z3RWMgumv+kvqy8hFgq+4PoutPZHlmqGw7UWfd4swkk8EtfzwIIMj13mrpeNPSpBbTTGyg9FiHEt8rmfCtQrxC6WOkBsudE5hfOU5HxfUu7UN11ei6aFuLFnUXxc9dkPYWOdlyiX/LaQPO/LnG/221gKIbHirZdiCEQh1vW0Wb/+yh/6xvyYyj59wdvYPBnJTqmkN86c3Lg5ruSvSH6hQCmmYpENgcP1TrDHXHusze1AjXHP2cJXjwpnXn1Jqg+GOuJhD5rIQIqessXiOeZYiXxdoztDpcupyV5V10Bk5/ThwvW9U7j6SSADkvNkMbW1yNnPq+9BpEBFEBR4VO+U6cUB7cT8LjsvbJJfHi9M0qerKbYc+bVbCMI6rTE7XSO/dMZKfkqBQUVWLnImowCYdzh43ZXDZkTWhhyCOEmRin0iMXy8bs+Lz7PZMx8QB1oXis1xPEMpXcfnzGCItLKcyW26kAqMa3zL27V9CikGs6g8esbKjbhd/8C1lGVt6SMXVcx263DPV95bd3D2CxBmS/kHOV7rucs3rrPoqg/MkP7mpAnC6lLLVGnHF7ldJTqzNRGEl9gJrhS93nkapKp+EZxTVCxE1m7VQnypMAD6iHJD0gYn2HfuZQ1T5Lcrx1sqd6Yzf03XOqWpey9YNoZfKXOAyutUvsTTkL5S7lQZUHZhsrxHBMjpKU2K+DMfm0DEDv7MQEsABUb2axCg6KlSS4KqXOvSV6LcYwnEyMFLw9IcIVuEkbFzhuBqgUPoIy+X6DmF2IIMUbOGzB46zfa6GTA+EFSUp8IhnePSKnI9wxlWsm56qdDbF1QSRVl5ou8gL0uQ5DteSBQJeeivJOk5+ObVfPLXInz5YznzvJr3fr+IMol7+BJfMPn4M4egHv3blq7XEhKe8Z0mrX+5Fxqf3F4COtF3Ynm28zI/qhBbxFiEQVzfYZFHZOBCbicOFAUh5JnI9UyOzjovyEj85MPlDkKbvWjFq0a96/D0v0EjbLqlE1cdJ+rL+8SX1mwQ2vsG1SJIcqBt8DEGcZ5i34uVQe717RBhKH3KWnTE2C60M9qFHtZqoJBtdUY/79YSmLFy2lyjDDuf1bS7dkWqXj+lYqs4xUjL8BY6byDVy4VBdf92VreqcREtpurprXhBSFewFanDhYOozPJ7gNGZFdJ4Tog9dW1x7/9ocDQI7C50H7vVobk7Nv+CcZ6QCufcXCYRys2n4u5JFPeTEntV0xJVNfVbab/AAqnS+hKVtrAuW0g2WZw3dZx9OfsJO03dTr/PHd7Jeycozl3LRvv70WVdm5u3/JD1IeD/UdTNRajQ1O5xvkXlOdHz/8EmbFyxFDAYPiC+ul65Ccs6dbLCnPdxr3de8Z5Ixjr+jMY3awUUnLeI+dyqlk1aDPTtGnBH/mQyvQcG5H21WtxYEvbx/4xFWm8Eg2xcHURYBZsBJsaLSbe+lQD6Fbn2E6jUInmfh+0fq/gH68OLa2VABIEnM9bqC8IcmngGLidNuuJC05Ah/HWzSE77lkRopipGlbTTIr7FcMC+J/9NQsAA4W43RdPWB7ozJ/E9fq7TaX9wcjw++vlyQGI+MBjUGjDaQOfXl54PSEBcLFKNmvLkdGJLhUudOBnbH5JUOb2QhMsH/2RQZB+iwR8Ps/mBiiAGJGOWDZCoOR5GKVwAIOqJfEua+MIrGKzdJr+CxlQjAGC5gKjScpqBJGVmfycB88Eq935daX/sJt+YfgyJNsmW08tIrBwbkSQuAIDsNUBy4Wmgl7drgXbqEQDQASPsCM0k8TItJzHzwQmat13CHz/wge2MdxMPjbiZzPxDwQoAsfNdP/76dpyMHh2DWVxKIueD3eehB5V/rM4ufCFKmgO9ySaoo3dG4m4KFwDYZZG7XeGkAQ5rZ8j3RpOpRgAgnqyEY7rHIL0bqYnPyQv45l7r0ZcyS8LmeudkAAB8sQjk/+cWf/816/RM6cYSoz39iVkhWT2n2Vkykpp6cD0VQCNnkq9Wt0ND5wUR4Wm/5Li83rm3AAC/KFA2TJRsLGcqf07M8J/TjCuUqctp9nQHGd/+VSYAkEFBuSG5D3cXxOTPRi6obHE1s5ixlLQFAEqcP294OH+j9lKNNc7N1CUA0JKhtZJ5OkHq/XTPPLQWlhyF653DFgAIJy+d5cIwsOu110tMa8B6qhEAKG2UaEwBf0DrH3XBm8mwGV62t1xeBUC42Wxpxnv8Hlu7ruXnAD6b9NZnaW2GmS/IZQsAJMdGxxsG53fc3iqrGufX3QgAeKKSjCltOmbxc9xTsLp+Veve1FpKJItZ75wMAIBfSxtqvGhy97OneI2uyox5uwnEEfsctJEepnppd3fnI70PBHra3zK1vd65twAAB5Z+Gi96vRuMIq9lXKAxa58j37Ymk5kAQKTNhAzw2ba/dZObiS3bbacx1qZwAYBaFundEQ6KPGOdvPYz37bGxCUAcK6iP9JyQ1v+4cb44cSXbVxYTuECAGXy9OjkCcc8Iw2vfc23pTGxCQCs1AteheG39Z7aWzqvP7V3OcEKgKizWVdMXwVD98lqJ9xTW/9s99I4r6kmzI0LAGTMPjdsuMN5ee7LeU01AgCLEzOPQsUfnUOr1EzGc5Pc0m1dEhCsMp1KMB6kd3lY8BsQTX0qMoG+KeD3woA9CaZsB4Mk9dDAACjp0BXhiVfssgATLyw0cQUeiE9tbuKp0BGXAFwNGPn1n0m/Ih/S+0BNL3tKn+S9Xi/o+8hVFxL4LF6h4KJzQmZY9i0mrw7OT1DN81ZQ5J1g/GwaA3De24MXKWboXzvnc4xmi93tIuJ43lN+UaYn1EigSvqGXNqOwtbCaoK+ksloZBmF7Pcsb2C4gMLD3qvcT9NVXl/IOfMvQRJG7YVPVTlAr+oT1oiex/80hC98ztvraU4KFCB9DPF2kV/5TxC7EQ9OFBwkVNfa+8awd4SRLEbyPONxF1bcnZyspCVmGJM5WN0n3iesL6tRdUycCocN+7BbG1vxe7PU9AQpaxCXzlv0ilFJwRtPLfCeJgm65lqPXk4SZfzfQV8MWESxY8/l1fk1u43AAu8RncmJK16QAXdfADU86zwYVaQnHzjg7+qjiMmkD/cx7D10x+anLY4dHrHiZkrgOngb8MLguR6e3vcl7lAuv3fKlAFDWHHj3EcGgrQX+VSMbpqlLK4kUX2UotvKYHPuXYC2KuujNBUFBrS2bJuwH3zsMQnyspuURAY2/FPAslAJrMAiQ9uVtt60lJJISYZI7sbEQRmfEk/xxT3q5luhcbmVBULH1+PQFx86HIqeh30+tcScT4L7+V0OUuXjiyTClzueT968B00cNPA6UYxEUgSSGrRNUycBSzj9kbmv2iJ3P8yxURrZnNRKnhOijSJh4GPMb8PI086c+s2zGAwEPgLVx4sTPB2vXRvze8hnT3tyXhK505DUInuWycuzBAqvB67P2v8jcn2tDECtLV0uGtk13iDmTG1FPvm5uDn29vueW8G1qIBx9e3kgDEhP8bEaUS+Oo6G7odbm4BAmvY2vp3nRleti46vxsW/LkfuvO7OFl5RNOmX3yNWAB9jMfZxL1t4dfpr9xLhZbuzt+YFICSMwxPRb3lP8n4/NgFANFmMVOUAkzpEsyOQ6b3lFoPJ88GM5MTBzhGs6RLgTcMtKNJkGWEV8Chg/ZXEdBFYB/VntoxgQ0YohYFFQgroJLoudfkHMlu8USAfbUsYBhcqVP05m6BDPdYFMpjK6kWqOuwjPFdzX9fhH+E5/71UV0JLnntURvC/GutQ7DyVVSxxbKcofujaT8IbcShHYK0/j9Glt50ZoCVhtQAwMQdxPQCCfocTKMyc1zt+i22WjkbSOXsE3ulVp4DgPU+IAuzGmrsiCW+uThYc4IuWy8LPcgEI7esSQTBKPq/nAAlSKS5iknjK635xJO3nx926g2059mrgDzBcA9l0ytc7dguec5Aek8ooWwWdev1IQoL7ojYuncbcGYMc+bze6C3HkgJsbBJ2bhOKZWdQwwg/uiFUl1ls7HFN2ANLMN9Ldwsj5358bdjtCZnJHdsxd++TqCNuyIaNGS1Fk0c0xiX9DekLqd0k1mTK1WlNJV++Z2SN7heuc7ijDSWlEXeEFRkFehxDX/2r3qiIr0jnnIUHtG81yl0xc6azpde9FpWa0r4CfV1FHwo9rNj3FB5DKHFbBGGxpyzgETkH8HyuqqaO6YKroxUXeFkiT6s/baYgSebS6jd73NYGGAn89VzKZxR628g1Cz5x9eiPXZqCKsd7r0LM2oJlHZnoWPy2aU4YNdn6RSCoqXxxadRpTgPUZjlbH8kWFHeeCOXOPgE9Ro0a8Eq+p3VFKrumKU1GBFYiA+6a8RknMwDg5tDQ+MLnhl77uOmEJgAwwiSUb4BlTODAHel2ps833JaSmaZpY3iQjdQQ5u3Kd4mUfc1qM1klsFZAJM0MAFBsDEWSdxy8djeTb9OEJgDg+cJtKL8C0FGBPvZ3on1r8C72VMLOoG6p2VqL+U0nUt05MRWAx2qsDSKcmtqGv+dnItXcS4/TZOXAWgZ3k8wAwB53DbXcWNiXZO0qN0xoAgApwQzlQ8AbB5jBVG9ZVtn6K7K/UAL+wUvk3j0b8tRNudAEDyFKZaNZ0gwAOChdyz8n3HXuzMO5YPF2C+m7eWC+A/HKqN6Kh8fyMLAdnQiF9LDdMCaGQMaKdMlNx2YHZgqtxnI4LL8nLRGrxckBbDPNLH84OyoxqCivtNH58UHq1UIUo2jqajKS1HgsuGaOWH5pTTt7qWkZQ0KqiKjM0S+yCDplxT12ij4N7dGpkCiVC7h7fvSRipXILmrVqGrRl3jbsUErQpxx2T5xNUEKOq4Z61eyeSywGSa0QoLjjqlI2NB43HMB23IEpj83UEpfjj7tKgv4ILg92kONa4/5c8zilKi5uT43a42aFw+6bWY+E1jLyMNIJWeIXh7tlP0sfRSpvRpkZhk975LO9I2dRAQlaZZl2ZhuK5qkV2HgSwdEuwH2CLtm7cqVDA/hluyOm18KFSsnNZkzJDTTjY5rtDudNBrkMC2RgNvIptaRfevcXoCKxKQc/GiHP7uzVdK7HYa33ETemds2fhcsLy7YdgYwdx0Q5kS3dun0q6s2iC0wqxpC4Z3zemAU15HnihsRX0BnSAgeCEkUjSPRwE3FbXDcm/xtCh6l9ZoW9uQmw27cXxE2B3qRgRw/pXPxpeRes+jZtuuypUGstEEQJUzDDtjv6TLhl7WCyA/cfsrH0ONBdZKnQvO7KWYAYCd5rtkRPqvRi29ebk+zqwq8NguVTn+XCQCoDN/eROmKPzzEjdIl9MLfFQ6xohErRH2sPu7TfAnGnNRjeENlPE9ZqbMOX3ihrcDzbkAwWGAKHgT1L3PumZOt6TuimLTH4nakwQ3PtPXVUL80bItwZN+HNqTKfywTtc8N9vtXzuuRul6lH5QmsXthodmrxJUru3EKauh973x/Nva615fgmBIqEFD4/+6cwD7aQucN3qNC5tDPjW47OcVsfEX4O2mAUIDaVqY3Mdz0VsZ0+9mdqRI7w7a1pIZkkaMavd1xzfB6d85KT1VwtBIjQomsZpR1ShvF2jO4v3VGHVyYtcwVuXBX8W2poIFviytXjRu+yPArZ7ZzVv7LxXxeR1RelX/UCOqCK7fW0oLjTmCvOD/fkKZbhzXVcThVNrhXoYEKSLOJimXtUUsNviHaB7fP/71nF0CmCKvmWwisW3kj0E4zAwA2MPaE56CU3lQ15e29wDClCQDMgvHcvUtg7v4oAYC7uLqqmclbsFxjpinVmOguH01A4Y2j3YPtl7fOZItor7PKAcgRYbCVmnR5/Drf1vaRUvazkTPCnu4pByCHhNm+4dK0fWrJu+3nS94UkfNHWPZo1E3wsNrPiCXT92UGAJhhqdgT5qgo1oAd3t4ClglNAKDFtY1j93fsY9ImAYAWU92sph2U17HP8SvGwS/2iKdKwdGom+ABxMdVHjUvU2YAwFqoxqd9oBgy7sH8UwiF08LYhxaCtmvM5rviK0Id+osWH/gsjuvmPxb+PEpGQ8MNREgtj619rgXb4Ce0UtAWsN19zwbPZT/4iyqgjqAA6P5dbfHSGj4BTrvhMO7gIvi4uUWcPDcaMp6zJegKCFT1i1+tq1aFDKF/j7iFSW4eMuQQlP2cboiQDoDsEYgku3ol+ARedF4zo2Zcmv6PdtSjpw5Mix/Q4CppdkfKugfm6vDaOfbPmh5K3TMS3R4QjOtE4dc1dOgS6LuVzqB2F03O9U9AMJftNnDfHLMm6PqNp3Z5P3B7de5xlM93jueL+sWcdvoDRvaYRlI6FIvcD+NujrylqW0oGPo7z3Nk7cWj07tZnHtSt7wDRCHX8ygdFoS+tECGSqgcemq5GcDJNrgYgU0rQWbBAoMbLxK70V9eW8e+X+iepgAAX6sdTZyLe6fUGQdpVFy+Tt94WF5ciy2ZatVSqjyIxLWux/JhGA88WjuCHsFTvTo+D8E/wrTmIx5YAhFfZdB9sgxSfwwbuAjdwmFbDBP55CzpP+NIMRtaICSkA0osfKCH5n3WCytMjMHH8UpwrQ5xWuy8GMiuyeY0NDDF4+79RmUr4MAtrjMicP37n/ZXe7D0rO0AHB0tY4oG2sJJWqxMMJIsOaKypHVMivmHrcTlOGw2AULY3b1oOGSKZ5FiKQw4aGx8avlOg3ZgVW/n2G6P+NB6pZJQwi0YoFPNyLEh/feFNbtDdCFD7h6ENpjhIAJuJbJSkD0SlwJz4dmTD/zEBcDTH+levVzb7IzWlFt+RFtsmGIHO2RLVb9RvQekkqsMm2R9w3ahtFpAdEIs+IKIrFaM/RNSnOKAGO6j3NKRmNgVhs5GaIRNhqzjkYh4XM+6/NACUqJvtEXgbad4OFRigHQjLNcfhwxoRc6YmF/9KsJDnmzl+ud7poa33BUBWybyR7b+LmkUpryDXGq6n35IZEhQjBdhlG+OuVCLreVBaVpCHZqAYdDc/m3Q9TNkgBQH2wYZ5IJY0Fuu4stJKxlH/O6MJjt0MOt6txRxPpHADw9yST5RRSfEorhZhDdm0sO7Dd0VUY1r84+Lq8k9TCuqGs4kk5RlCIngE6k2iXiW54ApMqAiZY1oioFkl2Hs+DCXupgnXY0WbZs2rOVou3UzCSJJAc8/+3labtq1TiLCtFJOiOZOcB854nd81MCbo/nDxOVxYoa0LB6QFsvENT6oD3pOu7zS48ViOrsCDJk7zVPo44tS6vCY9ueoRuzSi647Hjh2yTeMfodvrQ2VFzyM5i147K78wlcxa9N7lD+L+Ou61jltClcoPnyMwdze0nU41dOZxh01R6v9fEh47+c5jBB+UaANQood8s+l9rCHjS5kC/fxcX6XscyThfmgj0yMX0Tx4FM1zU3Ugg4+7PBJiCYsDWzfHY3Fy5iVSZqnZbzoel0w2dsPVwaT+nXZzdXwPg8RVMNHt9mtbFdzzsUMAOxldkr7QPH/NW5UcShyBWvx2tWpWt6gaqQyAQDx12e6coCTw4Jzva51av2d71Fg9QBcG0Fr8drgOXr1BdxQ9EjcB4g6DIjn6Jonxe08wdVV9/HnjohAdbk9WmKkGQqAVR379jcLI6Y0Yxd+DDR88k5A1AdEuGDlih2GIYKSEKKzQICSRBaeHl//5+L0Zai7+afk9EpHANAbtmtzc4knyfigS7hrnPp7CneCM9CQRLopYez8QrJiB9uey3dq5og73gJkGiuVm2h87YzyJWDeDeuJiefSTl0DYuyam834FwTtdjBG4tj1M4Pz99WWqx7qv3wt5wI9PgmXv3byhi1ZIwN92NmYK4Hv97F8OU+eEUogSKeFyCXh6Xfgjeud2+++5yxcnP96/F49FsEktxsZA7JIGNdjBbsTU7zzP4DJg0gPPE0jqiQn7RkFfVxU69Amd3atTy12BUFvvwKHXde67D2Yd8c795MqzifjK0vSg900Rb8iEn23c+nvjE6nT5OupxqQ10BTmo9XWhBY9zzV71mvQxrEtrUbEGM+nuqsBPBpXNkZd+qW7smr4NicOdb1SFnrVEM7U/kqfyzdqf0PrXDzlzqi8/Wqro3Qg2Yd8U4SYTSccDbX3z0gbw2c+rar/tLrelE36Zi3FkuOcoWLZmk6vwkZ54wzD5+zk+PAQ3dtRnlaFWuNGEeGTe7MT13DndwJm21ra/TodIigsv7+tkZ74q6AyUyQ2xvjJ7CKL+EBB/yJc/geWwWdF+Momtsoy2LDMPRlK8EBbIOe/YGFifycHtMMON+PXQokl0lAtCisj+MtpxE/vjduGqamvS6Ciuk+0jAwHQjBD3suA5vROmFBFHpQshID17SlRUGA5ka83G+wOI+WFau8E9/PnzA2NkLBqaOoVobspXTlRRd2F0/YHVVQHa2OAzMWKvxXXqQzT3XPRvuFjcFUKvsgE+bxGXdbpo3WyOTVusQiFjjn33Q6CxQXgKrGneGfaEkYiXAZy/tdGCusKSWYImN+Y+XF6iNp3CwDXrOGMKMBr4gGlt1/L5HMypc8Qcrv8/UVxF+ITdmrBP10POIb4nxaU7sl27bNNjsR9JXbDrlyPf7lQ38gfKanVYw1jfuOTLt4nj4reMNvXK82UEXblDjx1GfeYILabZTgQScc5O8mEDLp6UrnUyqyZItSAt4GeEsufpJ0bRp2QbRl8NyFPGPHCi9jpp55HjM2e/dk6TGSbq6EbUF1mzdS35O4FPIocPoLgHDE5eusWRuyfgd72NNVcsIw6SK9mOboSCinoQF1J+Sfcxa69RB6sSoMvbmBUk+wQnKNeL+0VZWWgk+CEW6AHRYS+iCWjQVMu25XLUzPWrdxGeUp9Pflq1YTfsh6cW2EMiwdEGJ7cONF2qvnMIamgiP7i436cxu9J3cb33LivFvTwpThCN1Ei0WRdAoBAZhD7L+xYRp/kiUNT5h3u9xpeBlIKUBsxRyT1sRTJaXQbeRJhVP/wGJ8P/iBVL+/8uvDN5SLLf1e/EI1hj83YlbwJCtx76eu7XK3+xneEOdEoczuJm8MXO0pbEVeheBAvLSHiC4IjKHhjuRC+FUOWHD8VSlvMYIdGAOxoxN0rK5z/2/WgsjV+0htDBqlDokzEct7j/1RDg9zaaciHAm8TFfXTE+sACm+lGSXVGl5eUwGOWYILJMsChIbxBvgnfIoSLKc9MWrDR97/oCScD4ryd8dBnwy+stnB+AR/XORelOWpHItvet8XMIMAEQ9JX19Lyc83RQyLHp9ACYuu1hjewpcZm0mABCOz8h94EXMJrfgpir07kz32nX9AEBoUBoO5SXojucbN2jKF88WaJn9zQFc0SW42zqbfeD67HfqbE+YVLukmgupCm1K6hlw7rzZLUCevIUnoKp5tm9BYf33NEHKVzFXZBITxrfR0fxssbyDPTbOEfTz0F5OAwmg5f5+lMfE58rte7m4ZjaVW6+J+J09ORckgCYSzdqWStH7/XrxdGCkXW1n9Niy8usE1etSh7mlTGk2xQwAtKSyrd0PlgptRzXODs4eOT7UTjrDxwlNAIDg6ly4zQE8x/Su2O9K9gMALFDNoubAVujTgEgwHoMq/rcL8pjBGjD/9J4Mplw5ptNDOx9ENVfIP3gbAmXwpn3Q4yGkvpxuCZBuk2YAgCUFSrv/uSqE7dFg7G4VYjsa0fysip/2rM3BL3Px6lw5nrod/di6EwGT+OjhxTEM3C6I0njKuLlxUJtDzAui+/Y27bvxr/bukugTqvNmeXjQEyARXCQ2SlLgmemkZ9V36dh9i9XcrQ5zzxWnqg1QwZ408Oa4dyVsX20eqd6VBMUL29CdK/k9wxkbqnc1OBWMYBndvRrx/ctNmFLat8/MYr4J8574Hr837Dq6nkw5JWuKFFZq1dC/LWIGAEZUS6F1931J2BJXVcoyO8t2sadTTqnPBADM7H2CTO5vWEO5e++nYJfCxWxt2D8/9tmvhcUsK7+uafThOL+2unAPFVbRbjweYZ+tfbawGADw6njG2yg5RCX9sqrhTzXuw1+iqluN1Wu1U6KllDB/KYfnTKuNmOv4rfrwlyjQahgBF9IqLHZZ71C333fuysb4NdAu6VlCNm9Fkndy3HRbsvs8/1bWKBVEe5sKrgDRqyCbOwVxqhpv7g0kA21F2i6yd+g4rdGzXz7fneIH2tufLdxyPjpe/XNhpbSn76d0ez651yf0vJ+MridDUz8XqqKdGvWsYwYAuiV2u/zErrYOn1khcR0tud+uNrx2r8S1W6AJAIyTRUQbgQ1H7vsBtV0p5xm6rq4vCAAGzRtRTThQ8JhZpCDKdo+UgkBZYloKgu36caSgEKfAIwUl2XKfulOpmBwInK4KpcFwt1EueTNQ4Lq9RTjgzvHsWOBG/jtX4PZUFaXE5Znw6ZiuvRv19qdIQnxml0B5dCBIAO3398OtY6qV0fxqqbF5h774VKA6OhokgIYSDc/WIUg+qs8M7vBpTzFtjhDMn7yR0mX+OLDqwOopZgCgygxXA8p+sPShNhd57Rg/y2twm9IEAHCgltuowJmo3DTXkEkaBAA9IJZFWWBV6CPAdjB2gxj+NwQhZjANMsH7gCnnjld9i70nN5QseoFzK1iKskEYGbDc8GAz3izptpp5jYTJF9/5c0jUgNkSyc5gHhV3eOZfEheYKi20FyG1MeIL/rJiUT3kM2dWG6vOd++UOfnHe3fn0sQVz4tiEw8O2MjYgeB2MRRg+cWBoBot8qLdjZn4kauWyvDuOrgqbh4IbPxBA+8FJAV4UhW/Cmi3JN9dzHckzIkSb7wdEYI/BHM7tn8uqSSZz0eUgpHmedkxa5NNvT+qPq/+6dTcMYq0BBfAmI6UsgpgmNEppgtKusc6fvNQCF+RPsv64q9jI6IuAhGCulX62Hzj1xPvzUju6lDBc6BiWbh5iQ6rH2Z0S3k2lpCVjEDEMqDjFCqq7E+AJtdPP4PrWVZS0O96fSvu3DpPhTYQgcaHH/QdsKnJWcWBJqGhAoMhMR2GkFz8FGu+AATSHfpVkE2LczxMp2OH0vVrjILc8jlov+/R5be8zqtBOHn9gKPqxzWEJwZ8pKLuflU+kk8mPi8mSV3QCE7EVclJIfgkSuSzdE/zNoQThhOXWxBbqRHwQxXEHDqjX5CUOKOXwFVst+eq01npBF+fhlQoknN6wH/+1R4zDEAmZBZK4BzTXrMrkpw+/ULeds+iyy2ScjdsXcUYWGkJ4srJjihyoJifKvvms3WSRBwqF+aKCEV9/D8M1nRMxtnZ1R4lWzCeC8b+2WG77HuqjV7+GwQ3WYNR+dxnT42sn1weyzcPi2YCtlLp+faAqbCBQXwxMh+h+eRbI64CzdkR+im0RkA2Ngv3WCwOSawtncofp3vqiHLJPvxtzy74zbWidaTk98VZjnkxcOGt5YLgKuqy9jKMs5CHW3/o4HIdAGAl6MyPKLc5Y2kx5hR7tQuHPDWOxVhtwRldNbknzrD81EjFDn2WBz290KFP3T/DozjNSm3BOTbDvFq+wMl7hjvWJ8GbhARMhOCdwgRVm3ThQnmh706FPmcwny3+PGuHsqsUdMV+/IpzEcIwzq4lL5cZqn1JMcwUpqi7EtYUYtxk8ni9TOCatu4aMGwUO5xsniNpuCIUNx17dwMmNgwLXjfiIvhxeZnw5XRbmjERmvABUIP0VTGCRWNA3seTFvo04scG/1WNtqxHQTxa+p11ljLSQd/qtZ64f5u+ADDcbfAEBrZpzh178IImotoJfwedGkSIa2OA3EF9u1GKJw6v5MFpBiGRl3sQGQRvhuji6oJgi8qfGMW7AgocpAO4zgeB4dmfxGbNA6HLp3MtB5CUBGsE935fAOcQokGADvMuThzTHvCeXrtA5vhcCZGDajDtqLNY2pUATUp2JXJlstRfadpCX0lg51lrf8hCA2ILdm9C0TQsgSEd6WM3f8qrdKTNPwAi1zCxVmKLpQvxhTz3pZY9/zViznaoGDlVMpwk7oY/WsgP7BzcT+1c4aXUuj17eJ/Ubvq5bv/ALgMvb6nmMIszVmlpujz+ybWabL5wYIjTp8glYd4DtlEnYLvxnn7OSixN14JXEtTpnbkDNuz63BdP5nGWpFuw7p/J2hhSH7zVmr6y3ueU2pDAon4Ak4OAhYbu8G3c9wBaWQzd9fAiRNErFM+P8ohEuLAHBIkhfUJS/vX0JM/wHKHiIkT0Tq6rMXfyRd4tpLUsEoBEWrZaVMrH5NNbTIgk+ZcKdKCU5ywjt/L/58ZbNiQqQJ6Wz/Yb94AsHTfXp+X2k4XcvI0cHRXL2fx+Xoq0EYVEJmypOb1I4thKTHfH/lkvxujHEagLhkCpP568nuezyLRCbXNt7fsPQt1WreZJvYlH1iI2e4EIbtaa826qP0qYeZYYbDXrocVGwi+q5nb45qYw3ujZE/jKJgEnpFNVDq9BEQtzi0UnhMG7cYfGoCCrYu9ho/XchmMyUbKonEcC3I32SXb2kN0U95r5ekMKjpu5fEFj026nYzUgdh13bQXunydeqO927fT6VvHfVp2VXwVfaZcPDZ0hFrp6a427oxDGPi1Pyf/szSU2BrC7hwsDBQcnX9zDYit8Vdgguq9tb6443h4Sr2lvQmPxqla94leBqmM9eFdOQPttc7lfSs/tbqZ9RhKF1lvZNHoNUrXXm1Zoec+ZlPIehOtlr4dK4uZBOglIF9K5Ld/nTZbJrMj7YPd4Yu0IWzLyvbk8ohfjiQFX7IJS7F/yf7R2m7NHPKV8+FVf/+Ke7J7qkM9HFNoBxAZuqbwjUJMEmu4nrZuQX+JeWUN0BwG6zghYXYiUlQBcBMHsCFUznYic3QrU6Ds9f7waiAUBTXkg0VVWFsWju6MfKpx/ly+TlS/+/hW//hZvvabNYf2YHXyX6T4L/pcvi0+HY6Uk+xbu6jttztekXv7mmMLXUMtUH9Qx6aP+aMjA+TuEMrSIbRci1p+IRq3xcGOShCYzy0zaIwK03v5kv5kSvmBtNEs9Te5bKW/XthoD0WG8yZUcSEjHrK+9YgNmTYwJEjSvuB+CU29baxQufW2eijoXr7yYZZEjyajnoajiVVstOdrZvOXkKty4jatzA3eo8hu5ccN0Q2c3bbJVhYNHG+MeX42xgRO8ZJNf2H06UR7PIeC7JMC8SXcLTYCFRoceD+8bEGis6+wDmp4F7WbIVaMsRwTpYY0Ro7zpImBn/fqJMaWDp2porgxlDh1o4QGfLgKORIXYXlCZIgXik9s45lOiQWb6EKECef/czwbuHkQFhhYtEDfZs/Q2Nq0zm7gCwm0S1Iquemin26yD0C4JzldgjvSIoFcUQoohXnn5roHc6oSWa/188MIgMBmz1+gWv9K7d4gnjftDwjV+PEv+G4ggjYWrvG4VUC1kyJM8Ve37RRBkWGc825A3DCMURcwtUKRiRdeE0Dk5SqVxXttc0yZ5sSfiuuPNIe0hjclN3G/bb9WE8Uo6B81rqKu/yqGAal2QSeuvjZu1dUXj8ZDt+mgCdpc0tl2IBtEc13St8i6q/Ibbz5A2mGay+GtL+G3GB3Kb9/9k4W4xOEOFr8QVqGj9MPJXvsjAd5XZX2tFjHbPXaurZrjt/EkA7noo6Azr7mq4zCMItm7H7bvziu9Qc9gVt9irfPrJcx0IhT1j8OpE0HFyYfyAs62uSH1qJ8fH64c7ZiyO7mtPS6t/PGsr8Uw+LTmgiIYp5hJRES38LNfHzdlyZ3AMkjzglhIacMUdgC4Lf863SLwQjoJ68DI03SJOUboLOAg+GKlKTuPBF/XHxaSv3KsLksLDQNaj4u0fR8O/OoT98bR5+yV6TB/JlGU6R17TOvBTdhbH2SXNaWFK5pE2dXX69Fmwir/7fLuRcLzbo7+O3UrVVzM4EBOQXBVgksjj+QnSAGl/YyflfQT8h/TnLh15vk7Y+5kjCM8dwUsInrc3Bqa7Ams4xxwXUVk+rjCQETZ6t9tECALO7fv2UNLIAVsmeFBNjAFhMunEPSEA7zeCQk2qtZT6CPJ28bjX2AO4eAuhtxIt4POIgo6qxOQ6Ddh7ShDoeN+DfaT1TmN14gYNj7VzLsUh3U53wPBMMXROQgt/DDGlYXsscga5Fk52g42em4H8M0ghWf7SiPVSvnFu/Bpx00VCL3BL4LTMzMay9AUolgSqdYzPk4jlyTPjhi+xLcVcq8iiWycwVNZgpdjdu4ARr86LG372hNsQKQnw9hFYWJXYbHR0xKSfU0lbGeclWoiYoAleko0pwBM/mBUdmJLTKNzGMPDU/IoxOWyg/ED6gDDvKFaG13ddNmAIsb21tx0iv9fJy5euo7syYQbEsT7khw9DemrkfuP+MMmtw+NHnGaeWGMUxwebrBzZ7GJbDgP+yKqYFNshwMtyYpYjMVk9CE9Rko5NXQi51WFZXt3SXkSDzzeOwL6CqgdrCSWgmuVMM0hxt7WvQXtzZr3QM5mWXV50zgYBKCs5iLiWGL8t5qxd/Ks9oBAwUuqVDrqVWSGD8GoQ3lgCfsn31fkn5QfM/sxupYFCLXGgeADVBfTvXb+MrID1Y8d7+gOfTna+BJDtl1U6TaAMFTPA0ToER9H61CsrmaqFwOP+P7SJf7bsDcAVO1Y09qPpZAvgfRY7nn+2rMGRpF5XypCdpgGATFx/97wsDX1v6ey66F5cPC9edHsxvWz907oewGSXZ8oGkKfu/3kOVh0lxkOAIxj2jF6NnKYP4a/V2fUuTARWgyBAeTaf1rNsV2eVO0PoLFHvzrkKsh+5HQ4haocgwHf+rIjE0r61aCXGVYDdpIMpgPOdZ5oAPsVmDW9Bm/cvJ/Ad1WADP1uF9lq5r6ra4JSsOfI+PuHFaji477X3ZouyFPMqyywQPurxeqXJhW6WNhmqGH4BnBXD0/rFeM9uVEG7MAB0ailJsgixzZCEAfr3uZ+vJZrQXph4aCpwoYGAExkHZG7s1KmtPmEO9KM9Xgxlp9AVMNe8I2sMYUFr8XO00/tY98ukE8RXJXt56IuCVazaCoIB/KituHu1fqhTcsgSsZj8HGDzFELS9c91C7+QbyC1yE5nb8w6gLTNoLjF8e8gHGmm5n63ziTw8BzLaHDIynvRHms4IqoA7vRJpgNtzyQiybnARxWkd8icajYEgN0O0BFVFW+ekYPv43VI/efD/KNj/4XDKvE4zptbr1+0Gn6tnMAvOTuezeaZjOVG5Q6H0/OEY48Z7Tzh2PM1XQ/kCOPIwJanTZVOslYnKIgUC/mCvKxCSvHL4bMtUjaaUO5XbM6rXD4njre1H714XiDZseyqBR3gTd0AwIHVeDEgYuk4diIpzgXXtHbnicPArFDP1Zx+rKzY0xtc7bbqqKPlZzQI2O1EcEKE3Fx34VS5BFu2a5lt4S0r/3IFprjxHwBAUeBE7OfY4E68W7rAvbPDYcTe0mojTpw/eQHJBgVsEWI1AgH2CDzQ82YDHs3HEgDn/k/bAQBW1dHJ8N/6WM2jk20tqavttEqCuvbLMIACVEtThAKiCVW2Z0hc2do8AIC94GJ8XK5AjfzMdkAdePZyQdfxhh2Cuq2AWokz+43qDwmX9OexRjL9g1Zn3mw3/z8PZgqwXxx/6mcw1oBR0DSmLCx1lQ5lfpG/nfxq2a4yGcTProVqG0AzmEY2N98fMVzSn8dqYU5zKT61yn49GSvcuu/x53J2i/OZCbUyZ+jvv7QNiNc18e5odb5CfG3x1mnh2wZQa3PGM3OX1C7IoW+S4ZX+G76rrjZ7p5XukHaVRFyh9G+XdQMAPn0NoKGyrlM+zeJcMHXl3aSDmmaFerqw+7GyYqmeLpq+VRIZQdc4Ee2ImDDXXcjYJXCZ2nW2hTNX+bdrcHIb/wGAPgTUhf0MBvTIu20Z9NEXLw50xP5WBWwQFCA8CFfb9CMOWRnfNR38U1nfs0vN1flat/Tz4+2UIkHQN/q3y7oAgGjgIvbZ8L8rcOtXjiv364sXL8Qv/inUGj6vvlPWsyfJ6ceycJRvlkJaBs4yCqFpbCgAADQDxBXZ4F9D7O3wNp1/hQ21rXh6INu9WQcA8AwRjSvm0kzpJWORaLqvkK1t+Kntptz3IszKGvLDyFtxSA+tMRirKOUbz+8ubNjebfHIIBAUiObRFrd98ho1rXab21svHv6PXlkOtX7Yvp2rZg5Ah9feT5ouwWRqrR9e+2b4st/b/7J3z2tao3ARP7uzrb1sX9rSz7M74pWraiiTdFVR/3Y5NwBwEq5mP0qGLeWmgB+RE1NZUk7PNefGzrWYl+KZFeoZRfTj4oo1zqswSn0XSUQAlHIZIgAwomMdJzj1LJhopkWauO1PVyDRwpv+AQCdB7Ih9uMZ/1mQp9BcesVC5bSEE/WXsnhN9ooeeXpvGKHMuZzXyibyybzAybQjRL4pfzLV5BYHWxyym77jfJyN+7bcUCip48p23wvVzJ5Xg2HUnQgh4Ovkn19yc3W1xEVzVzUGyeBSCAZzaHjVIq5aLVLBjUEoePghE9y4h1dQ093Sr6bZU9uWz28cAsGgLRRDHNiMNHBxhIGLIgucdV49M5LABgSBQXiLb838yrZkfmaEgGF4KtZTzUgAl0EAWPYJYaC5vJ6uhQX2kL8nR++/lr5ST3VTTci6DD4oEa7d6LJqXRfSIw6rlYQrhtIbiRMDCBaHy6YAAPEGInazx57hjUSGrXbsNV/tkmsT6BdXmbV1Kihtb8oDAMI1Ijto4KaqPd8qp33zbzHTp+be9JT+J1xsR73pYWmdwGU4Sw6mtg1qcGOdioFo6Q18dihopzes2suRNow/Znl2B141NvfuLd1yd9Klfx6bBuNdahat3zp4AQo6B7imnsf7ZWB3Nm5yXbSlW+pOE1a1mQZPSFdn/7NuAMCFQgO8gDjezDFwm/IueRWwaSEApsICcwDUqyQQ87cCVHWIAABk6FzgBDc1N/ya7QXeZeVfMtUadZWu/QcAXIa8fcGPzxZuxmuGCx6uJM5sXbYPj7H0OaO45lrRFMMKpi/cet/FlCV7glKOUXerq+fOC26z6uHOJOTJ73qHhMywMV+4QTXq2gGAKZPQkOdbmhs0UW23EtQFBSsNCaRSmwcAeALGY+HQvmVVYK+8DIoTXJECm2PZKEuBg1gDaqXAVbdAsXwcac+3rHSEPVyUUVOe3M/SEyrTI4bmHZlwMSs19LPkP1aDr5mi0y+h8uzA2ACactQf762u0hL5GPSj5PNkzvgRqtJjiJqFTUbZSpI/X8CXqvGfNZR+JVSdHR0bQM3DhqP0KYmum3qlmjfnpBaRULXO64oI61WFRVwC/dtl3QDAjp1/aJA39xQwK2u3nY2XmBaCQq+uqLGOqgLFWSVRJ0CnDhEAAAQdspzgVPMuz9le4Jwq/zYNbmvjPwCgk0E32c+4QKe95hLggLZ4x2aq6KGn9x65VuSj3AIn6X24C5+iEqWUP5RhboeeEvKz2Pp3JJz+kL/jnuKWvxetJx2f/rkAkZSY0h+X2wAANJ/qIG6bHlhQdf+Ot1+kfGZEVSF3ewZZpxSmMSCIxeeTQhizbRlmDcK4DpxNHMJCq1hPAABsq3eoQl/JnExQ6f6xEDNzlSuzE4BZcSY1OwDAXCEiFlOKJYjLZ2YAxPTEGQOxIDM5AX0Dx6DEgSeO2+2dMk+BmvkXqZBplPqs2FdVZLGcIOcZTODvXFaQ/87tv+yVtpb3GF6+O5704hW85Z/n3rEtqw1mdp0hAJAdCRJnKdSmWGizk0DlPAOa5eSYJBIYk89jYvj43zGrSu0VLAHBardIsMYAe2sQAQACSJQ7ahjRQKKty+q/bTdNPLS9/h8AWEAbyP25srJqfGU3r4mvrPE18dWL9BqzpNS6+0BLn+hg8IJjJjEfPIz3PzV7x0Fezt1ffu1JfzGt7AZBnMz/XvAMlBDJK7VRm5ouRj34aLI3wjFO6IxIfmzKa6edYg/y37P3+fd7thLDY+V+H+b5I/2uUYxwdKdPf37fSLPd7m+YBuhX/ZBF7OC+x7aqfY+cD16FvYODDCYW4mPbDH9zv+/B09O2zI/cybAd7wRh7PU1ND9YPrugMbHL73ouTJZJ2n3BGL3FG2lTHMLbLJ4CAEybSh6N5/NJb6THqrbzmWHz3ApTVAN07K18yFiUBwAE6VU5xJwqD+fmktyoRsacgdy8INs8Qe5R0GB1QdO+tqhRDTJdiOL4IEtK4xRe5WmlNfrj8HLcndQLw1+ILd/yfjSOfjczTJua1l04S1m7lDTfdrflW9o744I113WWRk/r3xYZAgCxBr8YaXYWIODNRIDTuvN3s9YNBTpyhcGjd5c7BKhUScABuOVECPNc4bnuwm1yousDcVz5xwTBku6ya/8BgJWg6z7352Dg1Pjabh6JD9b4SHx4zdEoXaA0LoFzJCr7UNP2ZHqTX0TCVtAlYSBhrzVQoqCpu2Z3sA1NVwVjgxPJdM+mdgBgWAUNcA3fiEUy4LTbjRgSiVxaGauiKnCaujwAgOXwqqqgBj5ua0G2/IynQBI823sgfbxhSiANfAxqKi7c21tQycJH9Fk1p4hvvhjhMnvE0KghE1ZFpSIaZPlTsz3ztPAJl9fOag2gAUP9MegpnfL0GemtBj8n+F1Z4Sp7DFGfrkFRgsdulL5qbGD3m1O4unZqawD17Zq1pSkteI67D6oZPvH2jXDFnVlB1SJXpCuefq0DBwCmxz8+1C1vbggYwdrN5fplhoUIuVRYFBuoUpVEWUCPnQj0HP9/rrvQdUtFE7m9aGuv8m/7Ihtqd7tq/wGABaFN0/25sqhpvLGb18RX1via+Oo110bpEqHmBbwF4fH9qoNtytimdLiivsFSU9HISd4v98O2nMl2gsgOz1jdR2bAfSL8dpV2gQnfP+5oxKx+883Qwh/P/yGx/6tIGYA5WR7PN2ZI+7AAFTIccAQigYXhcT4NUqF4MClMh/ktUl+980Prnbc7RB9zn4MlT82Ho68emVEqRk8vnq4I0REel4p9hHludmROispdeKW6jT6uPN273ZcYDg6hH+lkf6NkdhnYiOjV0xXJVKu/FpLGeDmsLHtq8TbDMJgEo2wgO+bC6Gl2j1zVDRJfmo2wZvQkMqhdhtnHyfuqGxilmH8mGa1bX0brGoXGbcBuH40c7wHzPTW0x4nAbPvDFNzM7qSGnT6ddhL1Fw3k1MPcaaAKIyccWCubMGc/hHKGCeJsLUYcNf5rYWxaccLA6BA7B+3WJNtINxYCQeWbjvkEr+RX8oLEJe/t4EY1TiALmBzSUi9AOqcDjN3Xdepfo1NsUfy5HUV9Pp1yri4HuLguBRC1zIexybfAH/ZYWHTTxIL4W1r7+hXApQMhEm392o4B/JXWqnd8Z4szmxMZjfUGdQqDexkL5i6ZOk/+ZPl1VxLVi/v8UvXhu200CHX6Gv3DgN1kcoTPkamW2dF8tTqDHYHvqbDzCqVokqmIdTkzdjIV9V4ejm+9NOKuNxqXcWVio56m0u2W7SaI6bMhy453DS6dbP4M5SlcmF+HUA9uP9D8Tb38+m73L+EfhMObsZ/f3+nLqk4nH7p5GTj4baxf2rsnXExEXZf8N7icMNB7ZmWuKEySz+E/oB0FiJgGaG3H+xniIcfaaQYOejYM/ZXY6+orPNydZAyUVVkgpJE37FlBex2uza4/qKQDYO0WudR4d1qmQiNJluPTcDdAavQFU3orqnJ60mZFkB9jduH+nV09emMyDfuAaAH3kcx8AYA/oKdH87lrINVhPDgP7L7JmJMZghPgMTN21ExIsFdP23j4BrGFbkjdoZz/+t7IZcorQD+tkfGCTgdiAKAnFFUCV4kBe9gywKPeCfqcaWgydwuxohOGsJROnI0FQ87uz5FrG+2RzGLvwiZHi2cqwZ+MDXVTFQSPtRG34PYqjBDIigZ9oJivAVo2Sji/qHTDiaqh1qp0RPKIU+oYxSgYaebvmn7JG/rIu9Zr9gCAqRB/zQZIZSEGpPj5BkL5/f+2NEDoPEqYv7Si7pZoMbd1LQnUXEMMqDI5s2v4xGHYcEi5CwkYCAqAlsVVJeB0IAB0Q42aoKtzDTXoZqvzyKkHkZhvYXZVmrU874LQbDcfW5hkduuRRWNe6hBeagSVW4piaDhYtbh7VbM7V7WBrlW1jxWMMFLqw6OXNUYrnJs/3jHCdkQZrJya5bUDl1jowKQU3gPi8p3hf3v9powvXv4xpjHsnbxa3C8VdMPEAxU0d2r4tpAkC1S73VYCmoRDlWEl5KNb9zqdnGEPdtPihopRnkue8kXFx6jyQAG9DN8XmnbqDHDkLX4krnsN3u7FvN4wbWcD14uEVmAjs21Bq8oge3sKWmmuxtu37H9xm3UmDfA9NKt8ITkn5c25PpUxS9YNTRiz5SpeJd4nDsHyrvE/Kx60M3IAuWLq5sq7pUczhg/pI7uH9Zq49gBl/hg/j/UxzPCM/arh67tkAFjtYVYL6mEtWT+AfQ0jzvVhq3ffmaOgyg/fwbertQzbOzGJRIDRoqkq02x4x1u6SQ7Nr4le0o6v7DedVMrVdElPlc/73KovJuwUMLU1JgDAdAOLWvrYiZa6iBLwjv+JhVApbWeqEKEahAXqFkK1CpHUOACk04Ybo15ztYWTdok2rmGlKG4RzJTUNbluDwCYibz2hbOQDvtRDhTXa/oK1NISD/pPBQrqxEqHACdyCk4OYlVwK47AjWimEnbNzgqnt4Jw1yQnjuUdeImVTjo+dkPunEaqfwgAxkVy3vF9e6TrU8XdBuDccpUUSaaR1XtU5LM334Ur+7jEoLN+5nTgtHn2zYCjZhAXgENXiN0dl2up6+pAIGbqpdRNeL3dinEzjNpv3KEbQOOL+mFAVTpGY2ezdxRvvzSOJ5qz+Y3bdAOokdesZ1upon4Sj1jX5RerdONq4zW/ybsUVLu6YWIfGbyyGAYXPgOFlAkAUAO0fQ9HZLBBSnDkgDAgxc/uAC83qAATlgQCOK/tQovFvbUFN16B+959X20tkZoTZMI+LgUQAEwD1u4PQpAIm2tw7gfi7uCTaLhhpViu6uIV0FKwGpZ8Cmt1yotdnVFCoZ8938/Mg+85X0pJziBaOcIsDeBQKYmTpRYIWEEeDMLF8gyuMXW/4SBwlgEOCSC2juSJ62n2CVjDCmgA7PXlHAOyaz4AAJcQ0lXAIm8BJ/2Inol2DSt+Lgdrbcs/uPupUaHOLLMcLJ52Fdg5W2Q1k7QXpPGmpayb/fiXTYUBcyluMo85BuPAarWOJG2mHJedZRUnDXGV0o21aAhVGDauJHLRPrBAg294O/Tnn1DnXoke573MHy/Bxh8tZ7z8m0uuk+JhbMMLnjEORwON0dGdPdku8SU/+fc1XewvrR5zkmj1oj6qwl2yvXxyts6vzlYQYP08fOLC8BFNrTMBAKaA7eXp6wXUxf9kINSDtjOhBqFehwQCFq3ColsXSS2gpkYUAFA1SIER0USyqHmKJbtYLFNs/JejF0hmyjfAS7J46medNgDgXk1nqYWSDeo1bOOnEV3YbK/ZMtiUL24FbJpLtYvMSy6UbO80ruxFVgucobSiidPliVJV4PwyJe3SdoZ3LR3lWWlR8lzLYf6GaS4wBc8bNJgiHwtAN+UaiAAgEJge3xcu3fRW3IUH3TnOSipVCJCz12zfmyvMrWyN9wWdkObtZoNM4frfYlImuJdC8j/hYrskU4RVsQfvSKbZUSrEvNDgozxNZ0K40ZYNXmnkCflmadJ7L8z8Zk0+/Qgj3l9zuLK/7FShXK2zVxSUeNcV3iParDMBAK6AdLsecUZrUkQJpuQAjqZtIyF6Ws+kKgEntlKYpCFnUsBrjiQasMqJcM5AXViEAAAIOWBEXPBnWNaUm3JRYhrH1fXeWm0AYHvMdE2rUDjHxXN0PkcVusZrjgJasMRzKcaJgjZdqa3YjD8G4W5Z1/TEZJStcM+OQDh9GOFe8a7NgHtdRbhZDjNced4DwFH42NF0Z1wDEQCcG9xd35cT3T1X2yUkibZclbnUg5Xmqir45pAzSZvvCxzQwt3Gb3wFtbYyCymo0MleSUF3GMRugW5WiO0Ml2XHTa4U/J51+GiXm05qKrg1Q+0v3XIbQBuGenLeXh6xD+bHbrs8nP2l51CRrXlftrrvNoCKbQ2fi0hI8MfjFdkl/YxcFUyltnbtzXpzkv1zdZKA1Po6vOLCXsBJmQAADoutYeqr6Cm2YLILKLX9KjL3/FnHwIgb9AA7LIlFRrM2Jt80vLe2sMcjgr1ZNaSjiRL7y0ltAKACsUVvhaDnMl0Eo9bC6rApgdxgfAJ0u23KgOMfXLsjxWBYeJUppT/7RgxZWYT17xWOxw3fXpccavb3piO/K0999z6t9udlO5Z8iCXIUgIyy0BYcypWKG/rG8e13oVC9wt3hL5nT+fgXvblCXpGwwygtQdcAfN7LUsp8r7ikr2VhpYBSZ/8V++mcotZ1983M0iP6sGSl+OA+W/WlA0e7ztGogh/HWfEjYZo5jvvCv11MsMmup3/A0cpofCPM2h/5I99absBAPr//MamT617ypYaud/Vsm3rSqvodvG/7sv+6ddU4JaVM+kG7mQrw2k4cQaFVHvyKIgpZsMHADB1h/AY4YpX4B6q5sa/ZzXNLm/6VeRHez/vZy0LAHC4z6ldZC49PZfojEdqr3xmT0o7TFk9Xb64ercgHr9RPbhvOF/SlfpaJWzXOb2ZSn1ImdKlS29+Mm34blhwTpq8TN74PI50k/GtcymremkDmPyOiYH6u5aDV0Gc+vG87zzSw4ifSz73uR4bF6lmeorwCnVtAKhWgItXnoUXUIoVKIO+h12Hg3RQuG5ZhFu7AvtFCACApAMZkcKqLVqyr/UfJLIDRvCV9Bl1ewBA56p0kyJSwha4D061e8CQ2Ct9JgKHxPXoiZFZH2kkcdhQisiSvcSS7Ct7YcPNVGI5rgCxVuHSzTnouhOhm7B98M49RiykyqQqr7t9SpVlxecv28GqLrMnNDHFrHt+vnBpxtvV40s8HWvH/5Ox7Raym8lat9IH7pmWf/lrcf6s19lV6Yapk7lI3xhMyOkygmcwusSuZBYFfVwgSM+dvRy7U6EKa1IiPkekPmPgcVKTXh+bPMAAHJWqPtnJmg+19hlUQtSFCe94E/7CC58OCqBx83MqLvgG3DbilKRfnLHx7XoJiLl6aRd65vob5iImI0VNjgLSdPYF5aUkJ3KgHPqmK54dOKr82cvED2bSAsX9EGzWvOg/icB+Lj+P5oIkPG7m7az2ctvDW76ZI5vNIR0O4himT4abAp5ZaVCuA2CFNYAsvtxh5jtt/gXN/4lSYfIr18ONBk6Xt5P6n/bDG6UkjAF8CBC8X3wmYNbB1WPkPt4GLGrau9d+o04SvTjFy3APLaB7vwdqLh7AmEN1jjh2bS+TU2J+oH05zbUJ3lRjG8BQYNDoyUbOkBZl0nz2gAXJ8bMpbFnIlz2jDc2dlgDwiiPWCpqoOeeHdLo2Nv930SnReX1lwru7Fd6UbAqvUd+wy7EZmPKAMGSyJfXGdFrHFLz2bCYzEr3qjAzc/O2TUKUOdtvO5zHJ491SV+F7d4Bd/tuBinBe5beXXYbUbd7pD035EZsKHXMizn5OAKR4pT2PkZBRNEeLB/g2ed2MI8beT2Zx4UIKicPYgX1J9UoZ2pUDo4vKyuVKwDyPMg0iF/FD80dpH2m3aauo5+3XamgJLdVhGmr4PI/f3H1S2wdNTbWdllmiOG0OXUcltk7/fdgi4T0VcqVdaP5pQxg9tcLZAA1aY94Wx8PNbFzi4RZdnsyiYH0cgx+7Jev+5W6TYd83gYmLg9m5rrU6lGFb02vkNmlv3A34wt8eIzFVhqlgXGKiknGKiXLFLSZqcBxjokzboJLfJzLa4IkKRzvyiZcM24LfETth+J8I8LD3NBa6xljNRLljNxMVCpdPVDK20xSC7LGfiWqKBb3je6vc+uNFE1UTP5qoSDxpopzeSLPjTRM1P/400RCJR01ULD41UWXxqlxbsNQK5eNZWd1lpjWbH++q04VnvJj3JBK7eehRDgk4zy1rQGozoszii3lp9ZGjKEpj2muh34dTtMGgUpGuZ8Xow9M+6Yn9J8XVOQDjj67B0UjJcesudmHDw5RcaE9Qm1A4rYjpgZwoNKGGxCFIgFRvrrGRqvLtloFJo+lSsmr5nTWbxOYoElfzN5nCCz/1R7bptS/CUWhamlnb/yKm9uH44nCkXUm1iCq/F0OpWm7/rrTLtHIqQrAy3btUFYtE9Z8RAgCpXihT9qjycAdIULeXwezE7iYDIWo52RNlIFtxHxbKUIqySmzbwWt5OhVDuJtwnBrTzTDku/hIT6OZD81NGn+G6b1DwxAe662Dk13FpUg9UZ5AmJoOShi0V48CAOgATMkyjN6mcSNIYLX7R2WYqY6xcjvFo0b5VbgLzMDtqVtXuIEQyb0j4NqJILsxd4sQAADJ1esSuesLF0lU3X+QSHSvCUpTtwcAoHddliokhctwHxYrOwQFsvKZ7FaS1eWJya5wg/R9I0Y7bZMrgle+skvZk60Is0RR47Env0hBxvGKsrkrDlcRRgzVLel3m1jQDEjdVmX1KfPLVb+8xAuHxyd1nzaeBADNLZJGYaPdANCCoKbK87Unce6kmjr9B/Viu/WpaZv66qrs+VSqKW09IQDAGWBdpVwX494KTtnO3F4JA/JsXCCMwiCQhjhilRjTjGmmOU5NzDfa5/4m+q/ks/x0DWU3QsAXQYcAsaNOSRNPOBVfiDzpky54bVA0AQRlPzLzF1WHAAEFZZsPE09LmtebW84P3YdEr+5ggrK/dW5jVW+3oPZDE277ZQhPRpRAbD8uRwEA9tmsBCauh1gS6xVRQmX4X/MQulPlmYJ5/xt0YQaKEEovR1J2XqIE19aJAgBuQrpGQKR0oL5iS2KnQdKnrtsDADpb3ewVkRImzX1wrBM4hsRO9JlIOySurCVGehNDJw27vmU2XYhFelf27dGWMpVYOu9P1LZrKbP6sji1auKBfXeH3/Eq38A37bEOb+cAWSYZMtFplxdpF5g5TpZtILf1JQBAUojuhm3oTlAxw0HYhvu3OkJeT2Ovf9Q4dcSMvosYz1nLmSXteNbU96/oZMsJYXU1HwDAZhHTmJBl0AOBdlsNpCEB0xtZAAC4ABGlQInsQMSOzyQzZd9SkaXKDotlCIe+b7y6l4p0yz5DJoiu9d0cHgNnWDSgP+HY/OTTudo341Xn4Me221mHu8muJuDoQFeuojf3MTSPZyDME2P5gpuqRwEAbsR2XHUV0cIB3AE8W3nmbcBzzMBLwFssyTvARcttqRzX52lLQy8nGs2oFCNaszKRM7+AJ/R5MzwAwO0DpWE/moJk0W5q6v8Nkte+WIsrysfatIS0We+qaLu3lKmka/AAZXZwS4PB6P3KOF13C/I6qZZtSqoLx6ce5cynb4hMjo85GCkaf5X38o50MNM/ysGfFggDW15cW/dBCsP1+8KRZwaRGGHMEAPH8AwQhBlvPAkAcG4SzHGj3QCAlCEcxvOx1MuXuCscZbUdyw6HvDNU4aAgmLOREADAzkFsy8NR2FBGDePq1tIYWS0Ruxxtg9jlQpjQdKptbOQgF+H8O7glMNxZdl5wOJ/SpnUUyifnnbde6O+Ax0IHzj61JToS7Kq0sbf7moqQCauYa8Ogcj0KAKAyQh2G6QIJBOUAZhYpHOGb845Ol2JaZvkV7poZhARS7SLFczG76LpzI7p765+LEAAAcWxONGNi7spEHgl3U6sNADBdgCBNqagx+9EG0nLtpq7kECHtxBcrXUQgofa4lAKyv5CStq/u7gVbppKrxqK4WxJsuUWppqCKc7lKqaZLqX5zXSDBguApflegRLgCNooDETMBD2UgiD2l9iQA0MiEyGy0GwDoPhKKsX0zqTHcpVRxx1lIVc1VBNY7KGrhstYTAgCZyyGp08dNC0S5pFEmSsSGo20RGy6EDQ1PbXAzJmmO68/BwlvovUAr68hPs09HiY5Iqyq28EyGVoGmSSwtfPGeWnkhBQBQsKfsox7BZClttwb0CBK05/mzFPa2NQiwlxYpIrCbmigAwHpSLnCCJtKTPx54djmxQC3FAwBFnKJcblr4+sM6HGfuE7efSsXEt0G3rdo6jXkDf2DXXYhQUjslezhpd9JRbzJa8shLaaz6NjglOOTQ28KpmzYsztv0iLjJAkoAYONvl+4GgApU0ufskQg8r3A3fmQCFQqmQZvLcelX6Hwi+rU7/N/gVdsu6J/0KSQxERwCBAGUNuMj+jOaH+VPdjGw84k1CQAofX1H8w1wh1Wg/nTY8PqOhnkYLnqkWgoAIGi1emMqBxzYwpHxDNoEGm3QuLksqRR1CGjztk1L2X5tQV0kgHIiwSzGAwATSA2QD0A4B1iOC4xya7DyDfxG/EWqtI/o18NKUuPiek97aq8YDnJo9eCL74k/2Z5yZKCubEDWXYXo7unHJSYAQASoLQO20kIyHIRj3L/bGghJgdlUzmwvMClbuVxYc2ZQ2Bpbvq5Ewb82t+X/8NL56yLj/5NY1gfoKsyPFXaR2lWnNGIMBS0zvXklgamqrEkEhrOZBQBgucBdOC6X3Moak3ham5lZ7eoVuI0nVlUZCELFu39SpeqxQGzSqj+H3hwuR5Zq3biWUDWRaYbqO02cKk8w+ajflx8J5+wzRCJN+Mxckpo0fCu+Ux8+Mk7WPUa4HXep6r4w/qGZfa7fmDCzAJN+LEoBANymo94LnrMEWKufl7JTWn12ivgrunYNboiOLtIF6MLDXes8DDBkjhc27646BafZ2CWa9Ky7JNWb/yCRQjqusEToq4kHAESnkiq5MezHmGcUDo3ymqbXWC8yVL7YTLGqS4b7x8YqzICtZnP2EYKR5XhvTz83cIm1cgWGoKp5lwegKg976/nEUGz8J8xNyP7xQb5IWQki+65UdIXOgHF/bHpYI4aocCsXOZ+ZzGcz5FaD8DAaeuq6l2/FvzwTK6ltmmadFcXOa5qIfVG4lp+6/3zZhPDS+rm8N3XUvJ0Iaq1eLw94C/TZG5ggw+6t0C9i6LoTR+Jq6OzvNMDWoDwB0/EKnEMUQwZkirIi0iH62AGi2nqiPEme9A2L/icsLwGKDPjoonpIZui2azJEywYJV+xbaQbvNu2O/FsobbCim4kkZMkugQhoghY0Xt4Ngi0g0VWYK7O9+azdlztQ43fbQ/hfN+ZbD8+yEGX1Pv4ZJgsM+078bTXTE/sQajkcYMzKA/sVXC+3S3sDwacoJ2NOWgQ7W73dWkbxO+9jseTuJ1yBF+MQ6PDAL7cyPe8kUQKrwSZYZLgHvsinB2+fjQU7aRR0mwCiYgFB4nboI0+ID0uOg3wtvXWUnQGXK++0QXvMTTkZ0pImGoEiXYh3CG/fH0tv3x/B2/eQdkQ9P5bevmtOz4CGSuf7t8QHpMBS4PY1XjKc6eMTLzegxaLSxV8MahAJGCTMOUxqECYakWoUHgNv34eWEyshe5+cTTw7PZGRQ67wtCX6BnnWh2n4lazIjFjnpC00/Zw01k5A5OaQtNqdpfOS1O5DUrA0YKOL33V3HXUVOQ2laeAdnBvrOSTM5Vbo+KKvkYQCojN1M9LETeGili+zThBOIG4E6ZCVqOP1JHwmolFRc7KhfChHCEKVkVn4kstQ1kZCACCcFDcTMqpFAxdRZbLvMA5iIzMoQo42yB6gIWcZPgy00HYd/rXL0wv1Y2P/vDkTibwK0P23E/zPrMLGkSr+mu66roHJZ5an/amr1rxQJOVfm5t+fZOv3PPulR/x165MJUCe4TXKCJmLCtPq2tdKjRcAJP8dvfQdPORkQr137hdTroUuZ0xChYODrTrr8/UtovkKPRSdaOGWopxV2y5WN7UKpJ5V5QYvFOrLZhQAQB3GKgrEsXTOIVwm/3PlDTBWOslVnnUp/xSgq5lB1wBdZEldR4Su3wUAsBRy4URbGflgh+LSVYm6xz/wjtRwTTwAYEkmyv2x1oLZQ6tw8ZrWgaJKY0uW/BrbkBLHtN5XBbXXoWdON+DgUKiWrAu9dUPOUCjA1kT0EQg7IFADQEQ7rC5McvKon4xfXBxGWcikbVs9DeZuM5kAoI4hNd2cimMStcgIxN3Z7hvgQsrOinuDQqng6Fbv3Wm+i5ixcWZ1MnY4DeplmCWZVrNstUmmZxmE1CALysVk55iaXb8p3YG85uT1EM7raENMzD7RBTrm+FVzwPYphvDTXQzq61+LUQAAUWw3neZJl9RnAK5w3Gp1cll91rVWf0VdrkEXUZeT1IVoVDbxAgCNUWCJGY3KiZYo3MCNZhN38MXJPQBgl5bFk7pu9eMn1XhlJpBMPrE3kYOFeI0cp5W6xUoH783TYxw4R/zbF7qy6ppNEW7kmvOJKxzQEjRxlAgjbVtvpDqpaeRANbtt4DdLZQLADQ5zSPXgKUUwjS6jDNz1ZTQTV2GDfm8cTjuN3ebtdPKGFJLe6ewPIMSQtCN1/ocR/enSsdlNtrEKL2TrHUA809w6bLdgNWxoaykAwEKt1Y1hC3iH29t/ti4LWG+QGxhQZ0kGVDVeAMDQtkV3wMXE5Vxncg8A6Eal8qQo/SN8n3ASgIvPza1ERKmn16zEA7gDLP5NqkE9/4/m8o5iJ/8fz85P7Qu88Sf/q7oH371P63bS1TnZrqozsKiSMmQWzQjD1Sg0uYNW0n+3xyqL7FkcYe6nGaFVKRj/onKeu5zje942DqRTvLxn/cmvA33ezEIOAABjlbyltDLaIPB/17A6+umFFgBgjc02LulSwGBbuoVk5ug6wTolIabBOq2WSM26q8QbBWX8R3VbpSD7zA8cZd3rOv/GXILf0XJYfajP0yrhG0JL0XMXUgCAKr5tlTT0YYjyoIsb53+76NfINopnri/jAwsrgzVwsu4Jh57oYFQvBhAGRHoXALhleQgrCsfSEqKjiQT7cCoeAOCBPfyHBUJhkwdig7EA4riUCCrhewS6mMAMaUWt3qCrvQe14NbE9g1AKiCgYYAadThsPD9Jv7g4jDqBi7ZtegQyvZlMAKBzEM1rTrlzJLSGEXC3VWRigAus4yqymj/RCmprLSEAsFXl1ytYdxaOs9EN1aNN/rqLmYaL7904w+tyNrwb5+K7wIAQG6omUxX7Y34+HjpyA2LQycPxtGFKfCgnkuplhnWgosX97aFtQ3j5GVXicDEKAKASUYZ6dnJGLhfQzWFXjReeufKv79vOksHat50ln2w5g0YJWxSAqd0FAHANbYGcaJtloOWhVOuqRPcE939H0rgmHgDwSabluljdMsxRLyiO1fStdqNkzXliTzdsl9RCbZjUsMC5LV+vcw+arbiF8v+a8aADCcVyvNDTlyqheK9Bz00Uog0I1DwgjhdWu+aEy6PqMQl/fQ1GIeeWbfUuiaq0mUwAELohtbs5Fa9J1A4jELPVXjbAhaDZinuWyCnijGoKAQCm0pQzxtk4m+407Yya7rTdbJHu9LkQMunv2DNlDtsZ/vP9CWfHpT7GgZGesTLaRG6/uUEuXDlkRkYTKQCAwWM4/2jVPrKU1qUBs6JBvUtWcVR5s5qZa7ukcp7PlKupZSmf2zHB/6EYE23vAi8AsMC28qK6oG0lJtqXOKnuB55biQcA1sDJ6ucWUKjAYUVzC5XMwDlSXBtZj4iqlULj9sQVjSSBtJ5MyCfdIYGbjA6tu24a/Ag8sj9RGwaaAAZUPFxCtN1MpdKMvtpsUNweXRJUygSAMnCCoK4Rqjh42nSgUOwlOeM53FN/AcY3xgYdvKgiuhDuHwv0k1ofQLQhiafu+Z4XmT82Yyy5gi7lSENYf1jQ06rhGeJbX2xQSwEAToP8o7kdyFIatYB3uE0BjVCpA0NQTgt1jRcAGKjyosrQ5706lhOLM6zGAwADqQHCAQjnAMtxgVFTDZa/952I762T/01W4/n0NF4UGF1ML4c3NN/JPfix7uHXcxy+nUPctKvbsvYQoSdXTQAAQ6NuBztoAQdUns9b2TPrtWng8IMEPnOIouxNXp1QhrK7SXmplsSFLwiWqGp58CYmwDLqz4mJH9Xunmq5SfcI9tq9unogx4YWGt7VciOhlbcfC+8j2CAAstlvteFaVC+pFzfe84kKE+aW8DvqHYH6ayIV4KvmWotM0dcvNuD0Z/bnckiOaCd2YoOxY0QHkBeTLpve0w+KttbkAADLSMQa5fPXd+K1ZbpNuFsra24KZp+El1vPAgAIhDSG66Kd7ZfHI2lrfabO2zTvYWkbemLdLh/9VNq5Vi8FNxI3d/T56/IoD3QE0WUDTofVGkE70kpdL3coc0CJy5BzK5hXnEALWJX6lW//ePNxv8VD/I//pQ2bqmBgC/JFs9KOMf/PfmlY7EYtmSbKNpIhHJ7T6aIztZQQc6IMknl6jBbKhJ7EDKKTO6ZeRLgRlKpRI3eU3kvOIdUU9Pi08zo5yhxCLK10icMEsgmpPHKrEV3la/KPLZnqkj0ZM66Ci1RsSS//4lI1a3Kby1/W9qqXyEpZq5P99pWrlxCV9y6ey8E6EaWsRwEAJCfgLZbeVYkQMS6guMU98FYuM7ZJdd0AY5lO0i464cLn1TuhrT5WOzCRm5jkUsMBfX2CfAyyyTfWnuiHax1KenK6n31feWgHyd7hlyUq9N6Y2/HwctyW0+U/ykd+pVhjYwsV3EDWhvvHqZUchBGur1mGE87MAD7rtVS5tdq8CwC4jfrM5Ufci1N0Nf3Wk3GoSjSzvVFJTHRNPABgeWf5SgPY/RluoBNp2P2uUWjWI9g0FN81iuINEgENzXeN5XYdfVNyPOu/ObuHUKTxwRGYRQpWBV7C1qCAiq2ViVskksMHxkUibVvhmZL9J4eaSNd8cZYkUrZqey503VNTJgAsCM7Qo15Id7YdgtSCZmh+m3h0zsrdOMYnXbOeEABwudyNIIvt47wFLe78zHqgZQ3PXh+0JBjETkGn2TazW1EyykGcXYIsd5Dn9ZAGaPHr9SZ3SvUtPBMk6zi/EmEq14WVG1SXD1KfWlhLqqWVFlIAAImNfN2mD/ZKcj+ZtoAmHxtGyKyluQFVGATEGi8AcJByoj7K0CB6X+J+4iVCTe4BAI3wdqYUyn6Ggn6EYs0V8DIyYOM9ovsgoN8JhruTnn4QzScCc4wQX9jF7gCZaU1kY4HbZQSuGUP7qDvG5jpQF8boCqh05ba7iMOaMgHALdB1HtVsuq6rGjQBTc0wlGHNdKZp+vJCmCYEAHpbRYMojtu/5EZYlmkWwA+SVfY6iFYRBlMmA1s6gQnfkxXycI67IX8Vua9IJ9OfM+p7fC2t93CAotRwQ6ylAACEVqk3DlGBhFSaO7CFQUBT4wUAGnPHRZuALSceZ7oaDwAItAIyKOEUoBwfpPZdARbwAqsFwLdRjrvYXcaebRBvmPnEvvgm3Zwi8Kiqi6gU2xpRKcYzsDVz2xUDD1fKBAAauIWglhGqNNgG1tugIHsz8Uuyt/E9NSzUH4rRgn/FPuyRrWxvCPdP6YEAka6kzR2APoUesHnRbnp+CfURiXIl/VdmhXUfxxXPqOGCUEsBAACNVi/oVCAgluYWTGGwIdd4AYACmxVNzfoBppy4oBbjAQARlP4RHmHNpkFvBHCxEajfD5K8Tuv8ObEY/u+GPyfr5930aHSAf3wx3B8H3BwM7+H37M653mx3IfIOOwN32p6UFXDKHKL1GhMAYA/Y6rJhG7PZhoPAwhIgN+wSCrZ7xc+FaFXpAxRA4xdSdZ3E37u59yf78gca2O7C1+gB8b8o/3aoLrafLHw6Y2ZHHWs8Ta6v1LiVtqnQGK4Ic9WKcB2RbbKWXBV2/6QuttWosyRqpgJM8EkVHNNOUra5kusgl2I13aUv5bBc19piQypX/n17GX2HWJJlHL13WVW+yb0ycneaAsX78hgfyD5XBdJ7SvT2Y+dg0/lx99GUMjr9g7NTLFmrgElFrZiwNoAy9SgAgKuA4brps930G2GOXUBrxuP/WhMV11y1HEcgdZWCqgLsginPysHOFnYCAAHN0TWPEx1UVFCTra5M9HjAXT3kWxcPAGwT68yfcytLSuy1m9vEU6Xx7jBMvjDTOu87xAf7nSU+uQIJ0TXzQpboUJ2IHNGSEyggWnE2RURrzqiYaLdyWxke2qwpEwCq6CqyqL08pmjlYB/d7l1C8ZNSNjAxy/WEAIAlIHATN50D9uRnrrxDGaa9As++WmgPxyCuC7oM28kCxr2R9g9bE8ZNlfNTAGIEeQMv6R6l/ubMuWnRxhc7MNbs6zn/7SpYm2k6JC1dYan2L4ukdSkAgAQMx02f7XoqCHPEAK1an8TvNDthsoYtzRGztwsywSlVXQBAYDOikz47g6h9iZtwqODcZiIeANjfvkdg5rKO7P1h/YQzdxo/g9RcfALOdhCt3wHMrucssFKL4pMTEVjg/CIRHN5FZv+yQoTUlkiVJbcdDpgayD3rhU2fnNnJneoXl1evuziR3GHLtnnmhtGoJxMA1CExHX/qCzfMWYfA2cGkGOCi6bRUK7uJbx+EpgkBgDndP4IYrjGFPgjyTDnHE6HzbCNsBmEE7JvzlHK9wud2wfhQ2xVEN5nMbxgeWpmH/ROjhgdzSykAgAJBqw/GTSADdWnOEGcGGYwWdQEAB0AXEbCcKLC1eABgu20fAVYBNRjZLLwjxwKl3w1awAdQCRwbAnvcRd6yWroieGsiGTZuzb8JTG5Mk97Hwmd6xW6k+jnNWLjT7PYO54rVMgGgQElq4X2K4Frh/Dm4DqNQJsdOL8upsJ/vfh3n8d6FlyVdCzyaldQpKDCJBwJEt5I29wT6vWkvBdcuVRHddk1kK+nTTuDxUVrv8VqB1bChraUAAAd1pt7sJAxIOeCKFRBQleYEUBg8iFVdAOBAZ0W997gAKCcSzGI8ADABo4AK8oFzAk6MiXf0u0AJuAHEf0mVbwKnAp6rLr04KrxW3vgrM8rv9KmNwIcpIwFgjhNo0lovGlb6LrFTopqHEBgmzsl3DCTK2vt5ak34R0MjuitGb89XJukAIsC+z7Pb/kxDCFMN2FDAVD59n0uahe+Xweq91OFfWNYDELQM6huqHjw16xdf3T++L0Sz1KLUOAZjeXvCT3wbNKHfG0wjBG3tWGsa+vAnE+ineXoqc/WwRhXWHbMxLsmcZLgWrfSi4px7J4G9CwVUh4pj/kFQ1ZUBwYjMnryGnmVYlhrsBpw/vmPBtwahipkgNos3AEADI2Hud92xuF40mq1BVZA/n9Qq6ywAwBgZ6ZLetrM+/8m3mp8GzpDMGw4IgyQhhq8LSftQwYkLDl2qrggcNcBij6STV9UbcRCEnGwaGtnTeIo5MhLHAQGxkUvUZZqAuEJavLXmtgUr1giKvDnZL8qpb56N0ZZ7T+M7uNuErQCQAAcPNHfmvvY3j813FLL39+Pf8Q6gXUx00L5fZNOC/uu0svqFs3VrZgq7WdIFAHpwakU0Z6CuBkmlxOk6t0RgbQ8A4IlvIqaUokq0KlOlzaMFY9480XQ1aJaNHaSdddgcGXh4CuZoxTtrfvc4mjO4wBaAQ1wv1hJyAMddocgCV7dUEHCnltoC7tZSY8C9uXg74JXXlgkALiCGVXWDmVo5aIDTCFWGeyRmzyWFAIB79izkcKzcYMsVTLuxl7m6E2M053+UveYfCS87fpQ9ZgyCcQgIXMXJpnkxTRewl8lhwSHL20BxCL6TtW/8GN9cWYg9AfxO5goAt/uaF+H8av+BlAU+8qpvO+6b82etewZ9qzipCwDoVIpo3jFhYLiA+xJLxusImNwDAE5VCjOldHlJRzsrrRBjntZ8eCqGh0+Mkj0Vk/tMQAfMJw2DTx8sATX/+8yO0CovLW8JHWGXE0XnntEEpHPvaTbSue80I+mMUnFbPDHAapkAIFbcEtVhzb3y4OAsjbJTwO3LCzxJCAA0eekHyRLXO0OAiCQye/qgfhDIsn0duAyiom2LwD1lbqk8HPo+2d1n6TM44v4XBkdhOnErACQUxAPNnTn21+RhlCWrwIK6NDeAhcGCVNUFAApQFxmwnGjObDUeAABY1UMwsgm8I8cGVXwYAPZe/7ojiFG8udgRPOWlpXehIzTlRNG5vZqAdO6JZiOde6MZSeeOi9vkidGqlgkAYsVpUR3WnJQHB2dqlF2FZy+H/Yy6+Tg9Y7Sma98xUfdM7AoAiU8xTc4BROGT+DwcVE/Kxrg1Ruh+y+pRBD4TugJAgmbc1zx//Hu0/2HUBDJQleYMYWaQwXBRFwBwAHSRAMqJ4sxU4wGABqN6AMybTb6hACfGwjvFB4MW8AUU/yJVGnmcIllu8PQP8B957CjZYnTcYH8M4Vxt1KHXN3Tu28m/2ZXfbAEoUsBB3vnXnPhFu/SPLn0fvPXw9G9u5ohnvMz6JXXNb0VNKo3W5zqAHh6orPfwLC+sYfOCBya7xVnfIiqexJGCeHOq0pvHIu9pHb1m9+y+yi1CZnNH5rFWzgkIAzoQOoYcR1vlE88QYTMXI2PE1/Zol4PT2pE+T0vcRMUQfEJnH4DG8kxFxlxGfUsLfaU8IHB6E54IVuvjPX/v/km1Yq4vDxUu8QKHLHjVbZd1/PBI6ILlCQRiRWFhEnzZEdv6MkOE6DlJ2SJE96c4y6bo30JKrQf+to6cCD6iMPrZVozIPUrx94XDykTJEeF/2vaBviJ3xHsDyhuvQLKStKHEGdBrlDiNqklGp3G+tDdFxQZIiDIcfnEvnkTv36na/tPpGbEF4ukHSgMsc6l+1Z7jqE6S98hjVXzcuCmqpEjSTYRGUUyzDhcZ+mWersPyK6eFjVZs29n0r8hrBBYqnm2zdja5CKwOaoQO7LO/xg+OL9G6kfLiR0VHYRdNan+4DnMg05EMR+zCT1pcIMWcD5jmYqmBPyxFn5JiiX/ECsCcxtAiD7EAcUI31bj8nXdSAYfk5+8AOifSoD9xmNT0cMIxFUWrlkMjSaA4bhYoZuVQo0R6MqNFGSNEKU5hExBb01ODY+6BpN5k8cADnEhEKC3glSq6ApHI6DB0/klAjJSptQPVXfb/CxBTc8QnN7el0RihbYlHj9AE/4BMZ8So8rFIiQwuwp+StPcTQIV9xJQvlqEpQDp1S1pIACrkuI73M0nuAu1xJ0FEvUn1yQJow8l1IohZvmd6J0oj9QxCGhxI3WJat8/hvofYz+cBJDH5ajBxxZVzhPxUjEaEJ1Zs1ZO4IVrpBKLMhjdG6ckqoW6ooH+s2J5XZy27/ImGDr2NOuOgK4Qf69HLUMInYmYos1pBxnTKglloi6W/jJpVQ5o7FoUxNluLusRHtANpv/NFOQyblFtB8l1gEPyUCZhde2EEiDNUHy5sPw9aKHd9VDDdIW7VgsXCaYqLxAESE9FE1re8Ik/sMI4Nq5PKjCCJivSg7Jc9yDm1OTT4JhhCykJL3qkRpHUJrG2QWxkEmfRfzoFYU8OGE0nasJL+jR/pEAorZVayDaGsNoOl9tE+3qvSR5Vr8SEz3NCDEYnOT7Ds2Na7qzHYcPjDKaTFswKH5Jb8JJyADZSoQsyokELokvtR61FpEJV1o9CHznINQunQKvtWcJLFxNmP7/ETul7qoUI6cs41/BoLQ4y/42C7szjsRBKHmkiviP6aHFLB1XR4qSaUXHFU/6I6K9asXdbourpwJjTHz2H5XyVE+4GujvDD3ETBFWjFOyEpaz1MwehYK08wTLWBr9M5v6sfNiHN7pvs3WnDYbIMGa5gu2+HyuLnnjTK3Pc+Ac0V21PdgKXApVwST3xurZaoQiIs25wjBCtr4YFuj+wu+lzqQzI0FQZxhMCNJNN3ebBG4IZPfbOLHZgRXrJD1F9gcPaoa/KbeRoIuafg9HVCZWB5UKwF2huA6NYtKIRYBG51PCwoBQyLrvXs4rkWSrfL+hi2AlpEx5TpnI0O2sAeGCtyg7WDm6McHtryHlDGYj+0bVa+gh/GzZ2V68dDoScBQBj6JNU5Dgv1Ppqde0j6z0igAzNGe7Mh0UYE0+AYsMqbeb8xw0tAapOOR/bjrkZ0o6LvIfmaC8yAJIHk/sP5ViZzm2WEFZCEDmCDBoC8HQ+T139OvGp//kX99efwx393TbWqerA1d93GA/0YijrKPVcB1f+RvWRgTjbP+/b3hsQHBGS1aajkoDf2Krt6O0ESC81H0yx5H9PIdszQbseJ7YUAHovrfZSaxw2XSHPZMkVlOGR5IsFA29ohMQ8q0ELGCwqg9Ewfhbw5F8YnpvQeKV4cGo3n5YLdw07GRN5llrmEJ9xyXm+5g4qjkcSxlC/bmV6XP1xvawNNfMV15+f8uOGMu2yWIpXfW5Of201x9ap75ZIDj83yLgjtF+W5wxYEyXMttxDESo7+lsxTSrohjXpBzU7tvbbbPYn3bN/lhnBc5GCeQFolS+fnYk55pTHgp5I1Qg4gL/MmwgVUmNdtr03qbD5nwV1FVKPMwAntwJL2uAkpFVGVpCeLyjQ77qp8GSMb8Rwzm/1gNta+zv18GSMiD0a8UsqnxXE0VVjT37iBmPGBSR5xmzB86F8fn42YqPk8S6kxTSbHosgrvAdJuJ74edaVA3UTWhTDYhOUpiVvcWK8CV5Ec3fITRLetGfOxJXc72aQ0LCJ//f3XtvfJDQw2m7SAUB13VyQBvwuUDvLllmusSKyoVdhffB6PGfyCpw/Yjixy4qMhoyEBtML8/t/Q1m83rlnb3M5TpbbAP9qD3AJT2/o1U0U+LFC4lBxP2yi9ooEXGt4ZqRB3KO/ITNsOHVe2Ir4WavvUID+DflyuTdff697949n4z1v8jh4/cw2/LzD43ftAMVJeHvlFUXvOV9mXnVdPn+B7ROJ5s9p2GD/2XIZNnN5bcHng08UUmq/SK5bFakojLlHPpw9Gu3z8ADl9r+FoDrvdIDy6t9HQDX3dB811xrNDdYX7IQ7Ma0CxYiOW6L03kDfCTgrhwaHsmi6k8KqYOyXQg7lSl5SUsCa+Vyxcut7qXv+V3k+//yL8lQHKAXfhLnr4UWTRAWIjOM260dWCuEVuSTMnRvxMmFGnly2FThj8KtYvMFGTh1S+bsDwLp/5xx0jT/jGeDVf/gMAAA9OB0Aa/27kuD6TuBzQPJfvITnYR04fqpCh7+vOueJICXZtnNxCuPxDUY1kZf3jy3fx9Oj9iurT2edphvUls4jOjXq0LbINhdtT09+NtB5Du4DCUWGXLokzYZg3pSkXxX2mnLPeQJUg/qV+uPLyl39Mx6q2/vZR5qeeLK6852OUft0eQVIK73Lz4B2/VsYcDCnGdCrf8sCjnh6APS1JFzCs88z4KL2gC+25WkG3Jw94IuldXJKYIZ54y+KlZq4Kn0IAZ9yFLjOKRyM3qlcBW5iI2yfmuIAxngDsyMZ+I8W5w6AYRPz2oRgfi7E8nvnUJ2SWwPF0nXnM4m7W+sKHZ68R4C0kaE0y10cVYEulkSZLQKRCzbCkhkDXaBGzq4Ule+iAqA/H7ilyEfchdrq2jwbbAnLwj84iwjJahU65Chr6H8z9kWBAO+1mzEh2Kb4TlbPrDkcW7bwLaI3tZ6lzfe/9Ni3GQtqJcbThXCbRlpMiBIt8BNxOqAxK3Q4fLyN1sE9a5auz1Oiy6/PtrzkZXNhAJ0cfofqK78iKfMJEoJK4W8ChoT87BRD4s9OYFPnN0hzCq6qPIDt7JFiTcAUljUotbJikRoZPehe7JVK3tvxWXZ0d7y1b14D4oxyHdcr9lx8apB25tMxZIm3fOMYGLsPZ64Ywmst6B23oR8bFhdUEJNnTjm5DWXfaAYkvfnuNA3ya9QT5dGsN9SOt4iymvZkIhIInMNF7zOUinYCjr7Zm00Tzxb5H+w49EYN080UCxCQ4Xkk7pXitbHyFOmpeYXoI0NlVn++HdFaYmq7lXkhfEsH2GBYG7GFC0yK1389vx69/erxnb1IX59kj7H8YsAg1qir2u/DBVCkrPdCSFkRfy2vK08i9rMi8FqosaHoathUDmbT7GRN1lkna5LRerJ8xuvJUkbsyezGbBzdMmI/mxHHWUFlobJDh16DqX9yOpP/5LjpfzJuA5iselvAZGabAIEhSAHPP/FZDJ0cEKYMlYC+EKa4Yo9skTeiYkoKLI4mklnhMBP0hNznGylue/O9XUWBO6kkxtViNOGwcwgOtrW1f0PzznEPWJUCglATWrZwjkNnASXbchH+GtrXsqIWi8JGdHNjPzBhvI8zIsO2o4PhBMq7Et14mRFv5a62xG/6kIUzGZQDodesQkyzS3O1XljIx9TZjsne8rFHQKC0GMqkuGdXcwJbmlFrIZ3HIWw7wVgbfiwdtYtXLuQjiSmGfuCAJCPcBysrYFIoXDUodXRgrNEctZWxP1Sk+NFDuq/KtgHZOiaCYzXHmQUe2Y8t7p6ZDjYs6ThTBuolZ16iN86ZHNo6fccFKMnX1CRZMLOlDiwssevRLMDdFV2dO94pOz+GqOBIoE02N1myscHJuRC9M7CSM/iG89Kt77jce+3cfniXTS1hDeko5piYkSP2ZXD/KKir7L1ptyu9YSI9qpyhK+ko5E5Ji345h0L50pJkgdQSufPVZzwrFDItyViwtGR7TtFbsuQiPhmRgpEjY1oznDaqsKx6LrAAhXJzo71Nyr60XDIWXU/Gom+7NKE4gycmwpSEohAzWatrro0ERSxnWkJlS0vGYmEpkhfVJBcLLSE9KFtR0BJjGdASOQZkLGiWjP9YrtEdK9ymWFORMZZUbFpZy8vJVsWKinQsqDiK+tE+vjGZeJO4QZ3YEG2JsbLEbAph/JaW+cL0vmlP3ZpvTVMVKpBu1mggBPBJRBQ4x2kqlHeRXb7tmdQybL4c2cXXQAXSy6bfPaWxS8wpvoZ505PkufEfygTpqrKErzgotUV/CZqaG6O4RL5ILbGOXzPmvF4XWZC/Y2c8VPjGL2hfYx0Jiby4MDV/PS15QFKUE0tEAQkKQlesiRc9IKAkeGxxwT8L8UsiMosHxmDNY3jOkD4/c0jdZ3dQcV7wqEx9LszB4osAVNM7aQzM5nC4UaQR5t0tXYQJv/Ep+0iNX+Rl8VkOvifhq6TmLfmDV+edAjMFr61buPAJCOUBXrc9vjEhuJub2RWavL7rNjyrF1ha97HzF9U8P/sSyCgWGvwmZyPPwS1G0UfjuW70cAWmdXFQpEXqINtMT8gtXya5opj3azgjP366pRC6NjpxLI97vf05NGvi8gpPszqIKVNSghKRIfoBJykRyqOU4DTPGIuAl2Q/bZD31OK0cuncrevBlzm/HGnxDW35zfiXs+vlEeUv11b2fkq7n9v3+pGOb6fHeNvPG9ePRvLe8MD1BYVYCqHvQk5DtpnLsK2qrEqlvDgjHhi/qctDi4xxcMqle3djAnBeFfi+cxBuJoVwSGcQULFz8AljlfwSaiEQoPTIUdYq+uUlEqASamKQhGqjVZ/iyqtROQjJ8PX5Q5HyKKgUCxkqqxY5vUng+t5uQmuuGii9pepE6eX33k8M+9aJ8YV7xA+JmEA400yiROFHhFKXGJ7A49iTJZppQCjlQI7LmZxEzbhAqaofem0o1Y79gjfGSiCWR/aesP/UqfjhDrcaH9aoDY+RoAJlFJCHmYzvy23YZDKNnEo5kOvkTK63dH0b90T9IUxDRXYSrsFqYiaz48yITIJQZYqr0VTR9WkosUc3MuUtIbuKZWbUfJnYoSEI1aG4ocRuurizvzRn6ROMDpFKXhve1QjyMmgyAwuE8hmi+OTYMAxcklWorKoMRW8SvHMJqlGMzI7jEgwEjEheIjcEo5lkSrUaff2Z1e5AjQz+XpiZIHNlMHlteMcQMMNGSRLHPdHwFtuWTGaq1dCAZT80DNav0Yu15hIHbHgZxMTPZTz7MECi0By1vn2lPuKd56MHJoXHB+PHKW9kQj70sOXR7Xjuqu5d/Av+5eRd7YH2DyqOxrJkhHhF5pxRtNWUyrlfXGt6f1nzqWQor5wUZHaVya8yeRig4uwk+eRTufJyIwSJZGRatbdfEuW+SbbWbJofGxVQ1VRDnayIBmquoU9GUP1qNByMDGo2lBQkK+8eJBtR7UGDZYeQUtMYOYSNjT88j/I/vPcMZC/F9tF8Sk78yCKddXq1WlRL+bxYvrbx+k1bLTLh3+WxbuF6s2wrE/KoNU8qjFHT338HJnaPe0P9It+d6VhNh3Ry02gw1CzZFTSd7dufW6UqnvbqpNohAxMrVA+rjPCXMX0ZOQfvUMdepdTyArsq5GFnhL+EVw/4czGwVymVkKYagjgtkxnk4Q6gMG34jRqqlGqDcsnDJBMTlJVdfvjbvL60cnOuOC9btVQ7zqoyFjnJiIwrzQALw/6q9NPA8wSmG+fz/+YTbJi2jN+46GSlYUqT/kKQdcvEXGn3AGEI9mrDRQo2+aHhoRlGC/dj4R3YQT8NpfKcrpsbB+blIJ8k74loaVtHyrykBz104Z0sOOPJjfRRJvgL8+XvW9yH/7dJALvaljl42WJ5mDLA/t3Ip52hxn0RMFg4P8lmtalOMfnJijNDOTVRSZyJnR0naxQ7YsLJuPoZlWdX1n4Ysx+Tbegl1xZsVp/8ystPVhtR89VLIkMlcSg3Wf3KsyvPjGsaK2RSXHZ2datfOaiM5mus8mR2JJvyZHZ2Mrv62RXE2cnsiBXhSiKcoDxUFELZTKN9n3rs7s5L7DlpuaHy6pWfUSH5oaTyKpcfQqLCZoyRPh+MmyvB5Gy/ZGTcbzRM0k6nUn6yNo/cXeUhTqL90BTcP7uJ7RZBscxnZgb1wTPHxWVb/T8EOt/DNQpVoBWYiJsqgH4XxeS3gb7ojiwFbWminE45nR6TkR8s/voPEb5o+pw7DsPUeoq88TIrQbSBL+OWxYj+okF0fedVt/mpvGYxn9BHtUj6gHKUEPZ5ciGPw+ZX+CEGDDo/YZCiGrVfpYI/pFYQPYgAogVJQDCI8iAy9oaGLuLgadWiQCqGrP+uypJZHdgiZhoQP11BsLci9g7reFnr9Xv5EvhvkWD/eU60/5NYuLL6hA6PlkUpkKUKycFr622QxQkr1Py48Mvj2s/5/9R9nU8P+hUD7pI7IcpquK9OsH55uJ3NyYhkw1ETQCaEhlxlbHTUxjTK/aMVbO4ertkbpYplNjkCSQAJh5I6DY+IzDQq/tEJeneIneY7H5GhBVIQxIDs8xd6adOs2h+1xLYXEvMtd+BkUyTuRV9kecmc7I7kXVTDkgtmm6RHwpMEyQdSCqQS5Opm905mtU+KDsr8Jsqkj1JnpfRkw6MGIHjVk1uPyVnMlY7msOTvZhbLcX1zYJLKXYPPnB8+G+WR3G70LdbiNwegS7tuqt2eA/Hi5aqHrgsrnm55CL3GIwBgES0ZXwrEvpc5IeM35TBt3Pridkwu8x2vGbsZ9fFePOmR9c8FT+7SetwN9dsfMH+Q3u7SP/iOf+BM0X/UYb167zEng9zviPpv7RvP//8dyUx7zqThG2mY6bQ9i4IUnBd8mViSKmz+8zMAQMVqeipdVHBJq5RptoczM0cgnfQ6nsvcPf29FD8ztNOtfn8/ltDNZm/HtD0mYki3Lw15gGUv4TvAI+4xtYDg1ArYGQbHd+123ttyu1ZQRfEX+eiQIlORvf7rOz7YpKiniDtawnh17HZ2aBJud3J9WyEQTWn2UvjgLau2DACToa986q64Fg0AUE6wNbx145NgkX8omysexebHZlpJhC5YR+btp7gSFLkN+T8nXYuAKfRw6lfQFBZzPIap3iEbX0+5ZvARDFePMHPd5ipDj4M+w05omuhajtSYbwv0r8XnV8JKrNcuO3BOofWrRbf8RhtJxIldFe7lN94wPlMbcwQ4DJTRH+Lr4XYjeJNxG0sLrm5dJRFwnVkn6HMu1d45/tF/Ojk5CP5+EJgi6WlZj4MFxhUlGDo5J/Uktt0d6Mauw6PN3ipfxXfnnBvTgKaydLEiBpeC9qIdMY6mijB2obLALrnxkifuieMGR+XdttryN2D0IlrK4zDvWZPwjAeO58Vmno3bKcldwBPhE6ddAze6W7nbsVFzTQx9p1/pAMtJghNM1CkKypYSkTNP2TfJi3kOkhERO6yNGIgqnZhEIqHeilDKFaZEv1Ij49kXK2azQomU2giF8Z0XobqRvSu29iKnq5qvDFZCn8BsoL4AoR3hy4MXVcs4Y8CPytq4ikyO3rYLFIOyfVB8jczptR2tk5JNCguIaAPzPkvbzPH10kMR7n7Ck4WeDePSsdKSYpofJUUZ1cGHscRxcKGsS+G8mNIA0jrCWRs80AayX7MStEnOFeDDQcgElyiUQzgrtxVz71qNdp33TnzwKjUprdzD69mWF5jigb/nqPE2mefZq55zbVPjggIhYT15XYUXlueAOfQ201YMySOmad59ApnVKdN5iNbXYvPJGRnEOuMS6IG56O1oQVy+bj35baIPhNT9RitFASxQAgh9F0Ln1FDP2fUn88xG00qasIwMNFBEByrzlF43ArMM4jVqKRHONjGI+yGRCJOmBbGRiLqbPMSDRKa3cUN2kcgQjSmyIfvDp0gTvFtxfzG5r2uKfUQyAmTtTrX1qQZW+dQaZO6jg8U0cTrWYnhMMy50bIMN+ypGapN0sPWNgekjN0uaxgZJZ787JU/h7oNwnfWNmXLRidNIoEA62QsOUUKLF7osKMU2HOe1IxWdmAG6Sg3kbgMaAKA6IQSHTYrneuP0CEbF4Ha31RsxR7TmTXahua0W9pSCmEu17aS2oZkkdJm7Mj2FhBoOIp4/qJLCbBNDyUgKSdNCKUiK3U0e5UJS7m3cqC0kZaIxpRYMRuMEHk7uFbmp6hvajZkNt7Czcmez3cvgGJRcYsqn0IC3FHA/xw464QanwIypb930wL2SLXSjFp+dRwaIJO6XoMmf08VL94AHNOhlaJsujOZX7mFtkbXOxpNP2d40piRrUQ4aKNPUtfaD3SlkzXrxEB6yheN+Br2r9yGJupUvbwBgnWvqnMHb+/JRSsuRqjkBCL6bYC4BhX9CAABfARTtIdYAApx/6ha4kR2qa2Kne3Eb4qGLHBDG2tGd40LXyL/mLjR2rG+HPLtflt+Q+fp4F3P5onz3+LplGUgdsOP74wJp6HLFJYNoc0NVsKuXjBDEjWxQK2T2nnPZIAh7b/eKj2gpvL3Pyx/UdLBy7TjOy6+vr3yA2Xu8K7NDsPeW/6I2AKCyZg2tbwZvBVZeMm/SicBP7wTmYbQAOtUHZ0Xfu8luVgR/MGas+cu5pZZd07EOGub0iirMLpd6lFVeJoRUr1Jkysub9qVGhANuI6UK20mqU0gWSsSuvDrlJCuvgKrpGXl5gohVCcTlpRWQRfUKK4GQ8sddZ9/u/LBaGZxlCSHeUT76Ogc283e/hTn9XW216C+gOWrWZDUayoYxvRFLeWt2ILmUeCrdtObSajdR+SX8SZ0d/BBXor5xB2C0I/AJINsajAugW1swNwAl5mFyBFuuXUoEi2ptYGA18b/EBOw/D5b7EfEgHhZ/+fpa5+n8Bw9y61Z49/oxGclF5SarSHnZ6JHytLzazPBMfT7w1uIlPzn4n2y6Pw0oKcqHxOTQ/daSkJyPOl5NzpEtAJuf3K6LXod+edQDb6RRwncIi2JwdRf0pDAJcoPcXVGDBtTqq3bqkd9L2OLmjgCgew5sH9/rM9izPx11BJ2jX/W7LSC9QtBqFt2rAZZr4O+t5It+jeVxmkn82yPvf2QK6cDS3nCmG5wSn+j9/9HJDoUDqf58n7jvuj7t0+f4UnYu+dfQt9OttEouf5UuGpEIHZeU+UTApfCqEGpYWlqG8ht1vpOr/og8sda7eHZaSBAB9Cke3zhCCbHu5cscccflUXEjVXjZiiEmLnay4WZK7F7fEQBsCXuK7/UtSnz3vHiUBniulfczwZmHu4a5tTNmdfrW9/QtIuk0cAlAj8djeM5jRntsyVPfBjQAgCfR4w3S16XgW6QBwbsc3vnsry3DdsY2mz1alv45O50Uo8Woke8iUlkFkZMimzClI3K9CELGU3I0Yyg2mvLQp/8xjb3u1eNWkW0y/vBIcpMz7d9740n3Q7ZDMuJsgi9SDCVrkwZG7Z2ydIQv6J+TQFvkPc6Xqx3PaOX59xho3QNUu5ircQaq0aEQZ2bnOVe7vdoQ5/ryn79m72VdtjqRHduVhtFbM2G0ceKuiLZX513RZeWCMI8V/EWmpiiQyMqdFbjTLCQ14AFeJgs6Zyn4ty6squPMzbwRLuGh9DFYtfiD0k9lAfNi2eGb9eddjUoVSZY6OlKpyG4bqtYNSxFQXNl6ByZ9SSzz7jMxmBJoZfFqchwxIAAuTk0m86oe9KyZNUkVGyU9vcloQEmqec/dNfx5qvNcPNrx3P5J+T7A26Odz+uvZPFzcTbMNJCehaNdF81vivxJyz+BFs/Kp+1+/1RQZtMeBtFTd7R9NO/4Ji99CgFMaz9e5ZM5Aoz+8WhQpkiS88E4Zncr6Y9074Ayv/mwwV5b2DTvtNb2tJoaVuCqvcKVMF/bszAMzxNUt81Zt9LSMwpqKoy6ag4qUHVoYCyZY0hUG8aWB0sXSKjQ4bm6Aqk8G8EAALXRHhNYbK4sbXUCFYWaHi/YYEkX7raVJjGBq/NSC02GFexpISbHyp30QNu3wcty7hi3m4VcCO7Cy8QBr+RdEgPX0+S5avmCC82KhTpGk66LQaxBs2/zGsV/cZcSQ+MgN2yqO7UKFasrnAZHLLYxcbaZt1qnUJEvPOSJkA4dErrO5KsahSIzeOB7NjyX0UDbwYN+dcVx3S+CFpwH4hpirJF7g661zu7JxTjCrJs/5A7C3Tb1RIk0LFy6WfDOj7YxyWtKvIvrSLZ2UllCwdx5iUnr5Mgm5k9HlH3BzDLOyo3a++wyjm3Sf+rBlB2M/0BsKs3AZuNw3FhLPEor4aIvC3k7psMEVjZU/nQ0LgqWtK+qoaKA/aOArozwgobS1azWMlSu7L35YQCD7/c8EW3T4syWooXKlYbFwcB8bCfA9Vb+ZQKc3UbdpWaqonPrtpiuIdQF/kRCN+iF399p4K4DEtY2EKGxYXOBrBoX9hLITZPHPvMFdrrVfoJMF20L7NltF26zh2ejp2ehV79XE/VpoJqlvK42e1R/quyVCZ4e5ifZ3lhVt+SjfnpppB7VyMXLiBjUG/W1GXSXISlV4F0lnbqj4I5YUHahFOaqEmhIghzncYckuv4pdcsQlG11wgIkcE+LEnbMnOCKDCPMXLCHcCGseRVi4ZCpHv4LmBLj0t3P4D87fxsm9FQADHHJt/URRrD0wMVJDt397PzWMmG9Vx2Wj+diGkj2XlV0Dqfp/hWkqX7gKkXGGoVAoN2VFb7mKIojoF64oICzT7LGhil3DuAIoLN83GNCaVD1i2WKq2zwHhKMf6l2uOruyBOHfVaiIwDYgAfG5wZnf+EI2Lefj+ZutpeOHn+jvklei70xnS/zhB8Pi+Ik8nHFINY14fkaBa3VG8EAgPUwYa097m6aK+7RV75CT7czCHVwMkiMhTZ4feRxSAb1H7n6Bw==\",\"base64\")).toString()),EO}var Vae=new Map([[P.makeIdent(null,\"fsevents\").identHash,Jae],[P.makeIdent(null,\"resolve\").identHash,Wae],[P.makeIdent(null,\"typescript\").identHash,zae]]),l4e={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of dO)e(P.parseDescriptor(t,!0),i)},getBuiltinPatch:async(r,e)=>{var s;let t=\"compat/\";if(!e.startsWith(t))return;let i=P.parseIdent(e.slice(t.length)),n=(s=Vae.get(i.identHash))==null?void 0:s();return typeof n<\"u\"?n:null},reduceDependency:async(r,e,t,i)=>typeof Vae.get(r.identHash)>\"u\"?r:P.makeDescriptor(r,P.makeRange({protocol:\"patch:\",source:P.stringifyDescriptor(r),selector:`~builtin<compat/${P.stringifyIdent(r)}>`,params:null}))}},c4e=l4e;var yO={};ut(yO,{default:()=>g4e});var tp=class extends De{constructor(){super(...arguments);this.pkg=z.String(\"-p,--package\",{description:\"The package to run the provided command from\"});this.quiet=z.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=z.String();this.args=z.Proxy()}async execute(){let t=[];this.pkg&&t.push(\"--package\",this.pkg),this.quiet&&t.push(\"--quiet\");let i=P.parseDescriptor(this.command),n;i.scope?n=P.makeIdent(i.scope,`create-${i.name}`):i.name.startsWith(\"@\")?n=P.makeIdent(i.name.substring(1),\"create\"):n=P.makeIdent(null,`create-${i.name}`);let s=P.stringifyIdent(n);return i.range!==\"unknown\"&&(s+=`@${i.range}`),this.cli.run([\"dlx\",...t,s,...this.args])}};tp.paths=[[\"create\"]];var Uu=class extends De{constructor(){super(...arguments);this.packages=z.Array(\"-p,--package\",{description:\"The package(s) to install before running the command\"});this.quiet=z.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=z.String();this.args=z.Proxy()}async execute(){return ye.telemetry=null,await M.mktempPromise(async t=>{var C;let i=x.join(t,`dlx-${process.pid}`);await M.mkdirPromise(i),await M.writeFilePromise(x.join(i,\"package.json\"),`{}\n`),await M.writeFilePromise(x.join(i,\"yarn.lock\"),\"\");let n=x.join(i,\".yarnrc.yml\"),s=await ye.findProjectCwd(this.context.cwd,xt.lockfile),o=!(await ye.find(this.context.cwd,null,{strict:!1})).get(\"enableGlobalCache\"),a=s!==null?x.join(s,\".yarnrc.yml\"):null;a!==null&&M.existsSync(a)?(await M.copyFilePromise(a,n),await ye.updateConfiguration(i,y=>{let B={...y,enableGlobalCache:o,enableTelemetry:!1};return Array.isArray(y.plugins)&&(B.plugins=y.plugins.map(v=>{let D=typeof v==\"string\"?v:v.path,L=U.isAbsolute(D)?D:U.resolve(U.fromPortablePath(s),D);return typeof v==\"string\"?L:{path:L,spec:v.spec}})),B})):await M.writeFilePromise(n,`enableGlobalCache: ${o}\nenableTelemetry: false\n`);let l=(C=this.packages)!=null?C:[this.command],c=P.parseDescriptor(this.command).name,u=await this.cli.run([\"add\",\"--\",...l],{cwd:i,quiet:this.quiet});if(u!==0)return u;this.quiet||this.context.stdout.write(`\n`);let g=await ye.find(i,this.context.plugins),{project:f,workspace:h}=await je.find(g,i);if(h===null)throw new ct(f.cwd,i);await f.restoreInstallState();let p=await Wt.getWorkspaceAccessibleBinaries(h);return p.has(c)===!1&&p.size===1&&typeof this.packages>\"u\"&&(c=Array.from(p)[0][0]),await Wt.executeWorkspaceAccessibleBinary(h,c,this.args,{packageAccessibleBinaries:p,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Uu.paths=[[\"dlx\"]],Uu.usage=ve.Usage({description:\"run a package in a temporary environment\",details:\"\\n      This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\\n\\n      By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\\n\\n      Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\\n    \",examples:[[\"Use create-react-app to create a new React app\",\"yarn dlx create-react-app ./my-app\"],[\"Install multiple packages for a single command\",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e \"console.log('hello!')\"`]]});var u4e={commands:[tp,Uu]},g4e=u4e;var bO={};ut(bO,{default:()=>p4e,fileUtils:()=>Zm});var rp=/^(?:[a-zA-Z]:[\\\\/]|\\.{0,2}\\/)/,Xm=/^[^?]*\\.(?:tar\\.gz|tgz)(?:::.*)?$/,qr=\"file:\";var Zm={};ut(Zm,{makeArchiveFromLocator:()=>UQ,makeBufferFromLocator:()=>QO,makeLocator:()=>BO,makeSpec:()=>Xae,parseSpec:()=>wO});function wO(r){let{params:e,selector:t}=P.parseRange(r),i=U.toPortablePath(t);return{parentLocator:e&&typeof e.locator==\"string\"?P.parseLocator(e.locator):null,path:i}}function Xae({parentLocator:r,path:e,folderHash:t,protocol:i}){let n=r!==null?{locator:P.stringifyLocator(r)}:{},s=typeof t<\"u\"?{hash:t}:{};return P.makeRange({protocol:i,source:e,selector:e,params:{...s,...n}})}function BO(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,Xae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function UQ(r,{protocol:e,fetchOptions:t,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(r.reference,{protocol:e}),o=x.isAbsolute(s)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(n,t),a=o.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=x.join(a.prefixPath,s);return await Ie.releaseAfterUseAsync(async()=>await mi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(r),compressionLevel:t.project.configuration.get(\"compressionLevel\"),inMemory:i}),a.releaseFs)}async function QO(r,{protocol:e,fetchOptions:t}){return(await UQ(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var KQ=class{supports(e,t){return!!e.reference.startsWith(qr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:qr});if(x.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:x.resolve(s,n)}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async fetchFromDisk(e,t){return UQ(e,{protocol:qr,fetchOptions:t})}};var f4e=2,HQ=class{supportsDescriptor(e,t){return e.range.match(rp)?!0:!!e.range.startsWith(qr)}supportsLocator(e,t){return!!e.reference.startsWith(qr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return rp.test(e.range)&&(e=P.makeDescriptor(e,`${qr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:n,parentLocator:s}=wO(e.range);if(s===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let o=await QO(P.makeLocator(e,P.makeRange({protocol:qr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:qr,fetchOptions:i.fetchOptions}),a=li.makeHash(`${f4e}`,o).slice(0,6);return[BO(e,{parentLocator:s,path:n,folderHash:a,protocol:qr})]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var GQ=class{supports(e,t){return Xm.test(e.reference)?!!e.reference.startsWith(qr):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:qr}),s=x.isAbsolute(n)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.join(o.prefixPath,n),c=await a.readFilePromise(l);return await Ie.releaseAfterUseAsync(async()=>await mi.convertToZip(c,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var YQ=class{supportsDescriptor(e,t){return Xm.test(e.range)?!!(e.range.startsWith(qr)||rp.test(e.range)):!1}supportsLocator(e,t){return Xm.test(e.reference)?!!e.reference.startsWith(qr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return rp.test(e.range)&&(e=P.makeDescriptor(e,`${qr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range;return n.startsWith(qr)&&(n=n.slice(qr.length)),[P.makeLocator(e,`${qr}${U.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var h4e={fetchers:[GQ,KQ],resolvers:[YQ,HQ]},p4e=h4e;var SO={};ut(SO,{default:()=>E4e});var Zae=Pe(J(\"querystring\")),_ae=[/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+)\\/tarball\\/([^/#]+)(?:#(.*))?$/,/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+?)(?:\\.git)?(?:#(.*))?$/];function $ae(r){return r?_ae.some(e=>!!r.match(e)):!1}function eAe(r){let e;for(let a of _ae)if(e=r.match(a),e)break;if(!e)throw new Error(d4e(r));let[,t,i,n,s=\"master\"]=e,{commit:o}=Zae.default.parse(s);return s=o||s.replace(/[^:]*:/,\"\"),{auth:t,username:i,reponame:n,treeish:s}}function d4e(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var jQ=class{supports(e,t){return!!$ae(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await Xt.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await M.mktempPromise(async n=>{let s=new qt(n);await mi.extractArchiveTo(i,s,{stripComponents:1});let o=AA.splitRepoUrl(e.reference),a=x.join(n,\"package.tgz\");await Wt.prepareExternalProject(n,a,{configuration:t.project.configuration,report:t.report,workspace:o.extra.workspace,locator:e});let l=await M.readFilePromise(a);return await mi.convertToZip(l,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){let{auth:i,username:n,reponame:s,treeish:o}=eAe(e.reference);return`https://${i?`${i}@`:\"\"}github.com/${n}/${s}/archive/${o}.tar.gz`}};var m4e={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new jQ;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch{return null}}}},E4e=m4e;var vO={};ut(vO,{default:()=>y4e});var _m=/^[^?]*\\.(?:tar\\.gz|tgz)(?:\\?.*)?$/,$m=/^https?:/;var qQ=class{supports(e,t){return _m.test(e.reference)?!!$m.test(e.reference):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await Xt.get(e.reference,{configuration:t.project.configuration});return await mi.convertToZip(i,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var JQ=class{supportsDescriptor(e,t){return _m.test(e.range)?!!$m.test(e.range):!1}supportsLocator(e,t){return _m.test(e.reference)?!!$m.test(e.reference):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var I4e={fetchers:[qQ],resolvers:[JQ]},y4e=I4e;var kO={};ut(kO,{default:()=>wWe});var vAe=Pe(SAe()),DO=J(\"util\"),Ku=class extends De{constructor(){super(...arguments);this.private=z.Boolean(\"-p,--private\",!1,{description:\"Initialize a private package\"});this.workspace=z.Boolean(\"-w,--workspace\",!1,{description:\"Initialize a workspace root with a `packages/` directory\"});this.install=z.String(\"-i,--install\",!1,{tolerateBoolean:!0,description:\"Initialize a package with a specific bundle that will be locked in the project\"});this.usev2=z.Boolean(\"-2\",!1,{hidden:!0});this.yes=z.Boolean(\"-y,--yes\",{hidden:!0});this.assumeFreshProject=z.Boolean(\"--assume-fresh-project\",!1,{hidden:!0})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=typeof this.install==\"string\"?this.install:this.usev2||this.install===!0?\"latest\":null;return i!==null?await this.executeProxy(t,i):await this.executeRegular(t)}async executeProxy(t,i){if(t.projectCwd!==null&&t.projectCwd!==this.context.cwd)throw new be(\"Cannot use the --install flag from within a project subdirectory\");M.existsSync(this.context.cwd)||await M.mkdirPromise(this.context.cwd,{recursive:!0});let n=x.join(this.context.cwd,t.get(\"lockfileFilename\"));M.existsSync(n)||await M.writeFilePromise(n,\"\");let s=await this.cli.run([\"set\",\"version\",i],{quiet:!0});if(s!==0)return s;let o=[];return this.private&&o.push(\"-p\"),this.workspace&&o.push(\"-w\"),this.yes&&o.push(\"-y\"),await M.mktempPromise(async a=>{let{code:l}=await Cr.pipevp(\"yarn\",[\"init\",...o],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Wt.makeScriptEnv({binFolder:a})});return l})}async executeRegular(t){var c;let i=null;try{i=(await je.find(t,this.context.cwd)).project}catch{i=null}M.existsSync(this.context.cwd)||await M.mkdirPromise(this.context.cwd,{recursive:!0});let n=await ot.tryFind(this.context.cwd)||new ot,s=Object.fromEntries(t.get(\"initFields\").entries());n.load(s),n.name=(c=n.name)!=null?c:P.makeIdent(t.get(\"initScope\"),x.basename(this.context.cwd)),n.packageManager=Lr&&Ie.isTaggedYarnVersion(Lr)?`yarn@${Lr}`:null,typeof n.raw.private>\"u\"&&(this.private||this.workspace&&n.workspaceDefinitions.length===0)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await M.mkdirPromise(x.join(this.context.cwd,\"packages\"),{recursive:!0}),n.workspaceDefinitions=[{pattern:\"packages/*\"}]);let o={};n.exportTo(o),DO.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,DO.inspect)(o,{depth:1/0,colors:!0,compact:!1})}\n`);let a=x.join(this.context.cwd,ot.fileName);await M.changeFilePromise(a,`${JSON.stringify(o,null,2)}\n`,{automaticNewlines:!0});let l=x.join(this.context.cwd,\"README.md\");if(M.existsSync(l)||await M.writeFilePromise(l,`# ${P.stringifyIdent(n.name)}\n`),!i||i.cwd===this.context.cwd){let u=x.join(this.context.cwd,xt.lockfile);M.existsSync(u)||await M.writeFilePromise(u,\"\");let f=[\".yarn/*\",\"!.yarn/patches\",\"!.yarn/plugins\",\"!.yarn/releases\",\"!.yarn/sdks\",\"!.yarn/versions\",\"\",\"# Swap the comments on the following lines if you don't wish to use zero-installs\",\"# Documentation here: https://yarnpkg.com/features/zero-installs\",\"!.yarn/cache\",\"#.pnp.*\"].map(L=>`${L}\n`).join(\"\"),h=x.join(this.context.cwd,\".gitignore\");M.existsSync(h)||await M.writeFilePromise(h,f);let C=[\"/.yarn/**            linguist-vendored\",\"/.yarn/releases/*    binary\",\"/.yarn/plugins/**/*  binary\",\"/.pnp.*              binary linguist-generated\"].map(L=>`${L}\n`).join(\"\"),y=x.join(this.context.cwd,\".gitattributes\");M.existsSync(y)||await M.writeFilePromise(y,C);let B={[\"*\"]:{endOfLine:\"lf\",insertFinalNewline:!0},[\"*.{js,json,yml}\"]:{charset:\"utf-8\",indentStyle:\"space\",indentSize:2}};(0,vAe.default)(B,t.get(\"initEditorConfig\"));let v=`root = true\n`;for(let[L,H]of Object.entries(B)){v+=`\n[${L}]\n`;for(let[j,$]of Object.entries(H)){let V=j.replace(/[A-Z]/g,W=>`_${W.toLowerCase()}`);v+=`${V} = ${$}\n`}}let D=x.join(this.context.cwd,\".editorconfig\");M.existsSync(D)||await M.writeFilePromise(D,v),M.existsSync(x.join(this.context.cwd,\".git\"))||await Cr.execvp(\"git\",[\"init\"],{cwd:this.context.cwd})}}};Ku.paths=[[\"init\"]],Ku.usage=ve.Usage({description:\"create a new package\",details:\"\\n      This command will setup a new package in your local directory.\\n\\n      If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\\n\\n      If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\\n\\n      If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\\n\\n      The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\\n    \",examples:[[\"Create a new package in the local directory\",\"yarn init\"],[\"Create a new private package in the local directory\",\"yarn init -p\"],[\"Create a new package and store the Yarn release inside\",\"yarn init -i=latest\"],[\"Create a new private package and defines it as a workspace root\",\"yarn init -w\"]]});var yWe={configuration:{initScope:{description:\"Scope used when creating packages via the init command\",type:\"STRING\",default:null},initFields:{description:\"Additional fields to set when creating packages via the init command\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}},initEditorConfig:{description:\"Extra rules to define in the generator editorconfig\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}}},commands:[Ku]},wWe=yWe;var RO={};ut(RO,{default:()=>QWe});var lA=\"portal:\",cA=\"link:\";var WQ=class{supports(e,t){return!!e.reference.startsWith(lA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:lA});if(x.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:x.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:lA}),s=x.isAbsolute(n)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,s.localPath),localPath:Oe.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new qt(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,localPath:l}:{packageFs:new So(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot}}};var zQ=class{supportsDescriptor(e,t){return!!e.range.startsWith(lA)}supportsLocator(e,t){return!!e.reference.startsWith(lA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(lA.length);return[P.makeLocator(e,`${lA}${U.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var VQ=class{supports(e,t){return!!e.reference.startsWith(cA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:cA});if(x.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:x.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:cA}),s=x.isAbsolute(n)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,s.localPath),localPath:Oe.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new qt(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,discardFromLookup:!0,localPath:l}:{packageFs:new So(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,discardFromLookup:!0}}};var XQ=class{supportsDescriptor(e,t){return!!e.range.startsWith(cA)}supportsLocator(e,t){return!!e.reference.startsWith(cA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(cA.length);return[P.makeLocator(e,`${cA}${U.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){return{...e,version:\"0.0.0\",languageName:t.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};var BWe={fetchers:[VQ,WQ],resolvers:[XQ,zQ]},QWe=BWe;var hM={};ut(hM,{default:()=>Hze});var NO=(r,e)=>`${r}@${e}`,xAe=(r,e)=>{let t=e.indexOf(\"#\"),i=t>=0?e.substring(t+1):e;return NO(r,i)};var kAe=(r,e={})=>{let t=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||t>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:t,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=kWe(r,s),l=!1,c=0;do l=LO(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=eE(a);if(LO(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree:\n${u}, next tree:\n${eE(a)}`);let f=RAe(a);if(f)throw new Error(`${f}, after hoisting finished:\n${eE(a)}`)}return s.debugLevel>=2&&console.log(eE(a)),RWe(a)},bWe=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())t.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),t},SWe=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of r)u=g.dependencies.get(c.name),u&&t.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),t},PAe=(r,e)=>{if(e.decoupled)return e;let{name:t,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:C}=e,y={name:t,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(C)},B=y.dependencies.get(t);return B&&B.ident==y.ident&&y.dependencies.set(t,y),r.dependencies.set(y.name,y),y},vWe=(r,e)=>{let t=new Map([[r.name,[r.ident]]]);for(let n of r.dependencies.values())r.peerNames.has(n.name)||t.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf(\"@\",1)),o=n.substring(s.length+1);if(!r.peerNames.has(s)){let a=t.get(s);a||(a=[],t.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return t},FO=r=>{let e=new Set,t=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!r.peerNames.has(s)){let o=r.dependencies.get(s);o&&!e.has(o)&&t(o,n)}e.add(i)}};for(let i of r.dependencies.values())r.peerNames.has(i.name)||t(i);return e},LO=(r,e,t,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=FWe(o),l=vWe(o,a),c=r==o?new Map:n.fastLookupPossible?bWe(e):SWe(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([C,y])=>[C,y[0]])),p=new Map;do{let C=DWe(r,e,t,c,h,l,i,p,n);C.isGraphChanged&&(f=!0),C.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,B]of l)B.length>1&&!o.dependencies.has(y)&&(h.delete(y),B.shift(),h.set(y,B[0]),u=!0)}while(u);for(let C of o.dependencies.values())if(!o.peerNames.has(C.name)&&!t.has(C.locator)){t.add(C.locator);let y=LO(r,[...e,C],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(C.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},xWe=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},PWe=(r,e,t,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>ki(y)).join(\"\\u2192\")}`);let h=t[t.length-1],C=!(i.ident===h.ident);if(l&&!C&&(g=\"- self-reference\"),C&&(C=i.dependencyKind!==1,l&&!C&&(g=\"- workspace\")),C&&i.dependencyKind===2&&(C=!xWe(i),l&&!C&&(g=\"- external soft link with unhoisted dependencies\")),C&&(C=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!C&&(g=h.reasons.get(i.name))),C&&(C=!r.peerNames.has(i.name),l&&!C&&(g=`- cannot shadow peer: ${ki(r.originalDependencies.get(i.name).locator)} at ${u}`)),C){let y=!1,B=n.get(i.name);if(y=!B||B.ident===i.ident,l&&!y&&(g=`- filled by: ${ki(B.locator)} at ${u}`),y)for(let v=t.length-1;v>=1;v--){let L=t[v].dependencies.get(i.name);if(L&&L.ident!==i.ident){y=!1;let H=a.get(h);H||(H=new Set,a.set(h,H)),H.add(i.name),l&&(g=`- filled by ${ki(L.locator)} at ${t.slice(0,v).map(j=>ki(j.locator)).join(\"\\u2192\")}`);break}}C=y}if(C&&(C=s.get(i.name)===i.ident,l&&!C&&(g=`- filled by: ${ki(o.get(i.name)[0])} at ${u}`)),C){let y=!0,B=new Set(i.peerNames);for(let v=t.length-1;v>=1;v--){let D=t[v];for(let L of B){if(D.peerNames.has(L)&&D.originalDependencies.has(L))continue;let H=D.dependencies.get(L);H&&r.dependencies.get(L)!==H&&(v===t.length-1?f.add(H):(f=null,y=!1,l&&(g=`- peer dependency ${ki(H.locator)} from parent ${ki(D.locator)} was not hoisted to ${u}`))),B.delete(L)}if(!y)break}C=y}if(C&&!c)for(let y of i.hoistedDependencies.values()){let B=n.get(y.name)||r.dependencies.get(y.name);if(!B||y.ident!==B.ident){C=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${ki(y.locator)}, available: ${ki(B==null?void 0:B.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:C?0:1,reason:g}},ZQ=r=>`${r.name}@${r.locator}`,DWe=(r,e,t,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(B,v,D,L,H)=>{if(u.has(L))return;let j=[...v,ZQ(L)],$=[...D,ZQ(L)],V=new Map,W=new Map;for(let re of FO(L)){let O=PWe(c,t,[c,...B,L],re,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(W.set(re,O),O.isHoistable===2)for(let F of O.dependsOn){let ue=V.get(F.name)||new Set;ue.add(re.name),V.set(F.name,ue)}}let _=new Set,A=(re,O,F)=>{if(!_.has(re)){_.add(re),W.set(re,{isHoistable:1,reason:F});for(let ue of V.get(re.name)||[])A(L.dependencies.get(ue),O,l.debugLevel>=2?`- peer dependency ${ki(re.locator)} from parent ${ki(L.locator)} was not hoisted`:\"\")}};for(let[re,O]of W)O.isHoistable===1&&A(re,O,O.reason);let Ae=!1;for(let re of W.keys())if(!_.has(re)){f=!0;let O=o.get(L);O&&O.has(re.name)&&(g=!0),Ae=!0,L.dependencies.delete(re.name),L.hoistedDependencies.set(re.name,re),L.reasons.delete(re.name);let F=c.dependencies.get(re.name);if(l.debugLevel>=2){let ue=Array.from(v).concat([L.locator]).map(ke=>ki(ke)).join(\"\\u2192\"),pe=c.hoistedFrom.get(re.name);pe||(pe=[],c.hoistedFrom.set(re.name,pe)),pe.push(ue),L.hoistedTo.set(re.name,Array.from(e).map(ke=>ki(ke.locator)).join(\"\\u2192\"))}if(!F)c.ident!==re.ident&&(c.dependencies.set(re.name,re),H.add(re));else for(let ue of re.references)F.references.add(ue)}if(L.dependencyKind===2&&Ae&&(g=!0),l.check){let re=RAe(r);if(re)throw new Error(`${re}, after hoisting dependencies of ${[c,...B,L].map(O=>ki(O.locator)).join(\"\\u2192\")}:\n${eE(r)}`)}let ge=FO(L);for(let re of ge)if(_.has(re)){let O=W.get(re);if((n.get(re.name)===re.ident||!L.reasons.has(re.name))&&O.isHoistable!==0&&L.reasons.set(re.name,O.reason),!re.isHoistBorder&&$.indexOf(ZQ(re))<0){u.add(L);let ue=PAe(L,re);h([...B,L],j,$,ue,C),u.delete(L)}}},p,C=new Set(FO(c)),y=Array.from(e).map(B=>ZQ(B));do{p=C,C=new Set;for(let B of p){if(B.locator===c.locator||B.isHoistBorder)continue;let v=PAe(c,B);h([],Array.from(t),y,v,C)}}while(C.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},RAe=r=>{let e=[],t=new Set,i=new Set,n=(s,o,a)=>{if(t.has(s)||(t.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>ki(f.locator)).join(\"\\u2192\")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(\", \")}`:\"\"}`,C=`${h?` hoisted to ${h}`:\"\"}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${C}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${C} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(r,r.dependencies,r),e.join(`\n`)},kWe=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:NO(t,n),ident:xAe(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[r,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:C,peerNames:y,hoistPriority:B,dependencyKind:v}=c,D=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([C]),locator:NO(p,C),ident:xAe(p,C),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:D?D.has(h):!1,hoistPriority:B||0,dependencyKind:v||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=C=>{if(!h.has(C)){h.add(C),C.decoupled=!1;for(let y of C.dependencies.values())C.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of r.dependencies)l(c,o);return o},TO=r=>r.substring(0,r.indexOf(\"@\",1)),RWe=r=>{let e={name:r.name,identName:TO(r.locator),references:new Set(r.references),dependencies:new Set},t=new Set([r]),i=(n,s,o)=>{let a=t.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:TO(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){t.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);t.delete(n)}};for(let n of r.dependencies.values())i(n,r,e);return e},FWe=r=>{let e=new Map,t=new Set([r]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!t.has(a);if(n(a).dependents.add(o.ident),!l){t.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of r.dependencies.values())r.peerNames.has(o.name)||s(r,o);return e},ki=r=>{if(!r)return\"none\";let e=r.indexOf(\"@\",1),t=r.substring(0,e);t.endsWith(\"$wsroot$\")&&(t=`wh:${t.replace(\"$wsroot$\",\"\")}`);let i=r.substring(e+1);if(i===\"workspace:.\")return\".\";if(i){let n=(i.indexOf(\"#\")>0?i.split(\"#\")[1]:i).replace(\"npm:\",\"\");return i.startsWith(\"virtual\")&&(t=`v:${t}`),n.startsWith(\"workspace\")&&(t=`w:${t}`,n=\"\"),`${t}${n?`@${n}`:\"\"}`}else return`${t}`},DAe=5e4,eE=r=>{let e=0,t=(n,s,o=\"\")=>{if(e>DAe||s.has(n))return\"\";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l=\"\";s.add(n);for(let c=0;c<a.length;c++){let u=a[c];if(!n.peerNames.has(u.name)&&u!==n){let g=n.reasons.get(u.name),f=TO(u.locator);l+=`${o}${c<a.length-1?\"\\u251C\\u2500\":\"\\u2514\\u2500\"}${(s.has(u)?\">\":\"\")+(f!==u.name?`a:${u.name}:`:\"\")+ki(u.locator)+(g?` ${g}`:\"\")}\n`,l+=t(u,s,`${o}${c<a.length-1?\"\\u2502 \":\"  \"}`)}}return s.delete(n),l};return t(r,new Set)+(e>DAe?`\nTree is too large, part of the tree has been dunped\n`:\"\")};var tE=(i=>(i.WORKSPACES=\"workspaces\",i.DEPENDENCIES=\"dependencies\",i.NONE=\"none\",i))(tE||{}),FAe=\"node_modules\",Hu=\"$wsroot$\";var rE=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=LWe(r,e),o=null;if(n.length===0){let a=kAe(t,{hoistingLimits:i});o=OWe(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},sa=r=>`${r.name}@${r.reference}`,MO=r=>{let e=new Map;for(let[t,i]of r.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(t)}for(let t of e.values())t.locations=t.locations.sort((i,n)=>{let s=i.split(x.delimiter).length,o=n.split(x.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},NAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},OO=(r,e,t,i)=>{if(r.linkType!==\"SOFT\")return!1;let n=U.toPortablePath(t.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?t.resolveVirtual(r.packageLocation):r.packageLocation);return x.contains(i,n)===null},NWe=r=>{let e=r.getPackageInformation(r.topLevel);if(e===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");if(r.findPackageLocator(e.packageLocation)===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let i=U.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=r.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=sa(f);if(l.has(p))return;l.add(p);let C=r.getPackageInformation(f);if(C){let y=h?sa(h):\"\";if(sa(f)!==y&&C.linkType===\"SOFT\"&&!OO(C,f,r,i)){let B=LAe(C,f,r);(!a.get(B)||f.reference.startsWith(\"workspace:\"))&&a.set(B,f)}for(let[B,v]of C.packageDependencies)v!==null&&(C.packagePeers.has(B)||c(r.getLocator(B,v),f))}};for(let f of o)c(f,null);let u=i.split(x.sep);for(let f of a.values()){let h=r.getPackageInformation(f),C=U.toPortablePath(h.packageLocation.slice(0,-1)).split(x.sep).slice(u.length),y=s;for(let B of C){let v=y.children.get(B);v||(v={children:new Map},y.children.set(B,v)),y=v}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=sa(h),C=n.get(p);C||(C=new Set,n.set(p,C)),C.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},LWe=(r,e)=>{let t=[],i=!1,n=new Map,s=NWe(r),o=r.getPackageInformation(r.topLevel);if(o===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");let a=r.findPackageLocator(o.packageLocation);if(a===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let l=U.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:1},u=new Map,g=(h,p)=>`${sa(p)}:${h}`,f=(h,p,C,y,B,v,D,L)=>{var re,O;let H=g(h,C),j=u.get(H),$=!!j;!$&&C.name===a.name&&C.reference===a.reference&&(j=c,u.set(H,c));let V=OO(p,C,r,l);if(!j){let F=0;V?F=2:p.linkType===\"SOFT\"&&C.name.endsWith(Hu)&&(F=1),j={name:h,identName:C.name,reference:C.reference,dependencies:new Set,peerNames:F===1?new Set:p.packagePeers,dependencyKind:F},u.set(H,j)}let W;if(V?W=2:B.linkType===\"SOFT\"?W=1:W=0,j.hoistPriority=Math.max(j.hoistPriority||0,W),L&&!V){let F=sa({name:y.identName,reference:y.reference}),ue=n.get(F)||new Set;n.set(F,ue),ue.add(j.name)}let _=new Map(p.packageDependencies);if(e.project){let F=e.project.workspacesByCwd.get(U.toPortablePath(p.packageLocation.slice(0,-1)));if(F){let ue=new Set([...Array.from(F.manifest.peerDependencies.values(),pe=>P.stringifyIdent(pe)),...Array.from(F.manifest.peerDependenciesMeta.keys())]);for(let pe of ue)_.has(pe)||(_.set(pe,v.get(pe)||null),j.peerNames.add(pe))}}let A=sa({name:C.name.replace(Hu,\"\"),reference:C.reference}),Ae=s.get(A);if(Ae)for(let F of Ae)_.set(`${F.name}${Hu}`,F.reference);(p!==B||p.linkType!==\"SOFT\"||!V&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(D)))&&y.dependencies.add(j);let ge=C!==a&&p.linkType===\"SOFT\"&&!C.name.endsWith(Hu)&&!V;if(!$&&!ge){let F=new Map;for(let[ue,pe]of _)if(pe!==null){let ke=r.getLocator(ue,pe),Fe=r.getLocator(ue.replace(Hu,\"\"),pe),Ne=r.getPackageInformation(Fe);if(Ne===null)throw new Error(\"Assertion failed: Expected the package to have been registered\");let oe=OO(Ne,ke,r,l);if(e.validateExternalSoftLinks&&e.project&&oe){Ne.packageDependencies.size>0&&(i=!0);for(let[qe,ne]of Ne.packageDependencies)if(ne!==null){let Y=P.parseLocator(Array.isArray(ne)?`${ne[0]}@${ne[1]}`:`${qe}@${ne}`);if(sa(Y)!==sa(ke)){let he=_.get(qe);if(he){let ie=P.parseLocator(Array.isArray(he)?`${he[0]}@${he[1]}`:`${qe}@${he}`);NAe(ie,Y)||t.push({messageName:71,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(ke.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${C.name}@${C.reference}`))} dependency ${P.prettyLocator(e.project.configuration,Y)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,ie)}`})}else{let ie=F.get(qe);if(ie){let de=ie.target,_e=P.parseLocator(Array.isArray(de)?`${de[0]}@${de[1]}`:`${qe}@${de}`);NAe(_e,Y)||t.push({messageName:71,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(ke.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${C.name}@${C.reference}`))} dependency ${P.prettyLocator(e.project.configuration,Y)} conflicts with dependency ${P.prettyLocator(e.project.configuration,_e)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(ie.portal.name))}`})}else F.set(qe,{target:Y.reference,portal:ke})}}}}let le=(re=e.hoistingLimitsByCwd)==null?void 0:re.get(D),Be=oe?D:x.relative(l,U.toPortablePath(Ne.packageLocation))||Oe.dot,fe=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Be);f(ue,Ne,ke,j,p,_,Be,le===\"dependencies\"||fe===\"dependencies\"||fe===\"workspaces\")}}};return f(a.name,o,a,c,o,o.packageDependencies,Oe.dot,!1),{packageTree:c,hoistingLimits:n,errors:t,preserveSymlinksRequired:i}};function LAe(r,e,t){let i=t.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?t.resolveVirtual(r.packageLocation):r.packageLocation;return U.toPortablePath(i||r.packageLocation)}function TWe(r,e,t){let i=e.getLocator(r.name.replace(Hu,\"\"),r.reference),n=e.getPackageInformation(i);if(n===null)throw new Error(\"Assertion failed: Expected the package to be registered\");let s,o;return t.pnpifyFs?(o=U.toPortablePath(n.packageLocation),s=\"SOFT\"):(o=LAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var OWe=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=TWe(u,r,t);return{locator:sa(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split(\"/\");return f?{scope:Kr(g),name:Kr(f)}:{scope:null,name:Kr(g)}},o=new Set,a=(u,g,f)=>{if(o.has(u))return;o.add(u);let h=Array.from(u.references).sort().join(\"#\");for(let p of u.dependencies){let C=Array.from(p.references).sort().join(\"#\");if(p.identName===u.identName&&C===h)continue;let y=Array.from(p.references).sort(),B={name:p.identName,reference:y[0]},{name:v,scope:D}=s(p.name),L=D?[D,v]:[v],H=x.join(g,FAe),j=x.join(H,...L),$=`${f}/${B.name}`,V=n(B,f,y.slice(1)),W=!1;if(V.linkType===\"SOFT\"&&t.project){let A=t.project.workspacesByCwd.get(V.target.slice(0,-1));W=!!(A&&!A.manifest.name)}let _=V.linkType===\"SOFT\"&&j.startsWith(V.target);if(!p.name.endsWith(Hu)&&!W&&!_){let A=i.get(j);if(A){if(A.dirList)throw new Error(`Assertion failed: ${j} cannot merge dir node with leaf node`);{let O=P.parseLocator(A.locator),F=P.parseLocator(V.locator);if(A.linkType!==V.linkType)throw new Error(`Assertion failed: ${j} cannot merge nodes with different link types ${A.nodePath}/${P.stringifyLocator(O)} and ${f}/${P.stringifyLocator(F)}`);if(O.identHash!==F.identHash)throw new Error(`Assertion failed: ${j} cannot merge nodes with different idents ${A.nodePath}/${P.stringifyLocator(O)} and ${f}/s${P.stringifyLocator(F)}`);V.aliases=[...V.aliases,...A.aliases,P.parseLocator(A.locator).reference]}}i.set(j,V);let Ae=j.split(\"/\"),ge=Ae.indexOf(FAe),re=Ae.length-1;for(;ge>=0&&re>ge;){let O=U.toPortablePath(Ae.slice(0,re).join(x.sep)),F=Kr(Ae[re]),ue=i.get(O);if(!ue)i.set(O,{dirList:new Set([F])});else if(ue.dirList){if(ue.dirList.has(F))break;ue.dirList.add(F)}re--}}a(p,V.linkType===\"SOFT\"?V.target:j,$)}},l=n({name:e.name,reference:Array.from(e.references)[0]},\"\",[]),c=l.target;return i.set(c,l),a(e,c,\"\"),i};var iM={};ut(iM,{PnpInstaller:()=>Yu,PnpLinker:()=>wl,default:()=>hze,getPnpPath:()=>Bl,jsInstallUtils:()=>po,pnpUtils:()=>hE,quotePathIfNeeded:()=>Qle});var wle=Pe(Xr()),Ble=J(\"url\");var TAe={[\"DEFAULT\"]:{collapsed:!1,next:{[\"*\"]:\"DEFAULT\"}},[\"TOP_LEVEL\"]:{collapsed:!1,next:{fallbackExclusionList:\"FALLBACK_EXCLUSION_LIST\",packageRegistryData:\"PACKAGE_REGISTRY_DATA\",[\"*\"]:\"DEFAULT\"}},[\"FALLBACK_EXCLUSION_LIST\"]:{collapsed:!1,next:{[\"*\"]:\"FALLBACK_EXCLUSION_ENTRIES\"}},[\"FALLBACK_EXCLUSION_ENTRIES\"]:{collapsed:!0,next:{[\"*\"]:\"FALLBACK_EXCLUSION_DATA\"}},[\"FALLBACK_EXCLUSION_DATA\"]:{collapsed:!0,next:{[\"*\"]:\"DEFAULT\"}},[\"PACKAGE_REGISTRY_DATA\"]:{collapsed:!1,next:{[\"*\"]:\"PACKAGE_REGISTRY_ENTRIES\"}},[\"PACKAGE_REGISTRY_ENTRIES\"]:{collapsed:!0,next:{[\"*\"]:\"PACKAGE_STORE_DATA\"}},[\"PACKAGE_STORE_DATA\"]:{collapsed:!1,next:{[\"*\"]:\"PACKAGE_STORE_ENTRIES\"}},[\"PACKAGE_STORE_ENTRIES\"]:{collapsed:!0,next:{[\"*\"]:\"PACKAGE_INFORMATION_DATA\"}},[\"PACKAGE_INFORMATION_DATA\"]:{collapsed:!1,next:{packageDependencies:\"PACKAGE_DEPENDENCIES\",[\"*\"]:\"DEFAULT\"}},[\"PACKAGE_DEPENDENCIES\"]:{collapsed:!1,next:{[\"*\"]:\"PACKAGE_DEPENDENCY\"}},[\"PACKAGE_DEPENDENCY\"]:{collapsed:!0,next:{[\"*\"]:\"DEFAULT\"}}};function MWe(r,e,t){let i=\"\";i+=\"[\";for(let n=0,s=r.length;n<s;++n)i+=_Q(String(n),r[n],e,t).replace(/^ +/g,\"\"),n+1<s&&(i+=\", \");return i+=\"]\",i}function UWe(r,e,t){let i=`${t}  `,n=\"\";n+=t,n+=`[\n`;for(let s=0,o=r.length;s<o;++s)n+=i+_Q(String(s),r[s],e,i).replace(/^ +/,\"\"),s+1<o&&(n+=\",\"),n+=`\n`;return n+=t,n+=\"]\",n}function KWe(r,e,t){let i=Object.keys(r),n=\"\";n+=\"{\";for(let s=0,o=i.length,a=0;s<o;++s){let l=i[s],c=r[l];typeof c>\"u\"||(a!==0&&(n+=\", \"),n+=JSON.stringify(l),n+=\": \",n+=_Q(l,c,e,t).replace(/^ +/g,\"\"),a+=1)}return n+=\"}\",n}function HWe(r,e,t){let i=Object.keys(r),n=`${t}  `,s=\"\";s+=t,s+=`{\n`;let o=0;for(let a=0,l=i.length;a<l;++a){let c=i[a],u=r[c];typeof u>\"u\"||(o!==0&&(s+=\",\",s+=`\n`),s+=n,s+=JSON.stringify(c),s+=\": \",s+=_Q(c,u,e,n).replace(/^ +/g,\"\"),o+=1)}return o!==0&&(s+=`\n`),s+=t,s+=\"}\",s}function _Q(r,e,t,i){let{next:n}=TAe[t],s=n[r]||n[\"*\"];return OAe(e,s,i)}function OAe(r,e,t){let{collapsed:i}=TAe[e];return Array.isArray(r)?i?MWe(r,e,t):UWe(r,e,t):typeof r==\"object\"&&r!==null?i?KWe(r,e,t):HWe(r,e,t):JSON.stringify(r)}function MAe(r){return OAe(r,\"TOP_LEVEL\",\"\")}function iE(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]<a[o]?-1:a[s]>a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function GWe(r){let e=new Map,t=iE(r.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of t){let s=e.get(i);typeof s>\"u\"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function YWe(r){return iE(r.fallbackPool||[],([e])=>e)}function jWe(r){let e=[];for(let[t,i]of iE(r.packageRegistry,([n])=>n===null?\"0\":`1${n}`)){let n=[];e.push([t,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of iE(i,([g])=>g===null?\"0\":`1${g}`)){let g=[];t!==null&&s!==null&&!a.has(t)&&g.push([t,s]);for(let[p,C]of iE(a.entries(),([y])=>y))g.push([p,C]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function nE(r){return{__info:[\"This file is automatically generated. Do not touch it, or risk\",\"your modifications being lost. We also recommend you not to read\",\"it either without using the @yarnpkg/pnp package, as the data layout\",\"is entirely unspecified and WILL change from a version to another.\"],dependencyTreeRoots:r.dependencyTreeRoots,enableTopLevelFallback:r.enableTopLevelFallback||!1,ignorePatternData:r.ignorePattern||null,fallbackExclusionList:GWe(r),fallbackPool:YWe(r),packageRegistryData:jWe(r)}}var HAe=Pe(KAe());function GAe(r,e){return[r?`${r}\n`:\"\",`/* eslint-disable */\n`,`\"use strict\";\n`,`\n`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,e.replace(/^/gm,\"  \"),`}\n`,`\n`,(0,HAe.default)()].join(\"\")}function qWe(r){return JSON.stringify(r,null,2)}function JWe(r){return`'${r.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\n/g,`\\\\\n`)}'`}function WWe(r){return[`return hydrateRuntimeState(JSON.parse(${JWe(MAe(r))}), {basePath: basePath || __dirname});\n`].join(\"\")}function zWe(r){return[`var path = require('path');\n`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(r)});\n`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)});\n`].join(\"\")}function YAe(r){let e=nE(r),t=WWe(e);return GAe(r.shebang,t)}function jAe(r){let e=nE(r),t=zWe(r.dataLocation),i=GAe(r.shebang,t);return{dataFile:qWe(e),loaderFile:i}}var hle=J(\"fs\");var ple=J(\"util\");function KO(r,{basePath:e}){let t=U.toPortablePath(e),i=x.resolve(t),n=r.ignorePatternData!==null?new RegExp(r.ignorePatternData):null,s=new Map,o=new Map(r.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var D;if(g===null!=(h===null))throw new Error(\"Assertion failed: The name and reference should be null, or neither should\");let C=(D=p.discardFromLookup)!=null?D:!1,y={name:g,reference:h},B=s.get(p.packageLocation);B?(B.discardFromLookup=B.discardFromLookup&&C,C||(B.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:C});let v=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:C,get packageLocation(){return v||(v=x.join(i,p.packageLocation))}}]}))])),a=new Map(r.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(r.fallbackPool),c=r.dependencyTreeRoots,u=r.enableTopLevelFallback;return{basePath:t,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var gE=J(\"module\"),uA=J(\"url\"),XO=J(\"util\");var qi=J(\"url\");var zAe=Pe(J(\"assert\"));var HO=Array.isArray,sE=JSON.stringify,oE=Object.getOwnPropertyNames,Gu=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),GO=(r,e)=>RegExp.prototype.exec.call(r,e),YO=(r,...e)=>RegExp.prototype[Symbol.replace].apply(r,e),El=(r,...e)=>String.prototype.endsWith.apply(r,e),jO=(r,...e)=>String.prototype.includes.apply(r,e),qO=(r,...e)=>String.prototype.lastIndexOf.apply(r,e),aE=(r,...e)=>String.prototype.indexOf.apply(r,e),qAe=(r,...e)=>String.prototype.replace.apply(r,e),Il=(r,...e)=>String.prototype.slice.apply(r,e),oa=(r,...e)=>String.prototype.startsWith.apply(r,e),JAe=Map,WAe=JSON.parse;function AE(r,e,t){return class extends t{constructor(...i){super(e(...i)),this.code=r,this.name=`${t.name} [${r}]`}}}var VAe=AE(\"ERR_PACKAGE_IMPORT_NOT_DEFINED\",(r,e,t)=>`Package import specifier \"${r}\" is not defined${e?` in package ${e}package.json`:\"\"} imported from ${t}`,TypeError),JO=AE(\"ERR_INVALID_MODULE_SPECIFIER\",(r,e,t=void 0)=>`Invalid module \"${r}\" ${e}${t?` imported from ${t}`:\"\"}`,TypeError),XAe=AE(\"ERR_INVALID_PACKAGE_TARGET\",(r,e,t,i=!1,n=void 0)=>{let s=typeof t==\"string\"&&!i&&t.length&&!oa(t,\"./\");return e===\".\"?((0,zAe.default)(i===!1),`Invalid \"exports\" main target ${sE(t)} defined in the package config ${r}package.json${n?` imported from ${n}`:\"\"}${s?'; targets must start with \"./\"':\"\"}`):`Invalid \"${i?\"imports\":\"exports\"}\" target ${sE(t)} defined for '${e}' in the package config ${r}package.json${n?` imported from ${n}`:\"\"}${s?'; targets must start with \"./\"':\"\"}`},Error),lE=AE(\"ERR_INVALID_PACKAGE_CONFIG\",(r,e,t)=>`Invalid package config ${r}${e?` while importing ${e}`:\"\"}${t?`. ${t}`:\"\"}`,Error),ZAe=AE(\"ERR_PACKAGE_PATH_NOT_EXPORTED\",(r,e,t=void 0)=>e===\".\"?`No \"exports\" main defined in ${r}package.json${t?` imported from ${t}`:\"\"}`:`Package subpath '${e}' is not defined by \"exports\" in ${r}package.json${t?` imported from ${t}`:\"\"}`,Error);var eb=J(\"url\");function _Ae(r,e){let t=Object.create(null);for(let i=0;i<e.length;i++){let n=e[i];Gu(r,n)&&(t[n]=r[n])}return t}var $Q=new JAe;function VWe(r,e,t,i){let n=$Q.get(r);if(n!==void 0)return n;let s=i(r);if(s===void 0){let h={pjsonPath:r,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return $Q.set(r,h),h}let o;try{o=WAe(s)}catch(h){throw new lE(r,(t?`\"${e}\" from `:\"\")+(0,eb.fileURLToPath)(t||e),h.message)}let{imports:a,main:l,name:c,type:u}=_Ae(o,[\"imports\",\"main\",\"name\",\"type\"]),g=Gu(o,\"exports\")?o.exports:void 0;(typeof a!=\"object\"||a===null)&&(a=void 0),typeof l!=\"string\"&&(l=void 0),typeof c!=\"string\"&&(c=void 0),u!==\"module\"&&u!==\"commonjs\"&&(u=\"none\");let f={pjsonPath:r,exists:!0,main:l,name:c,type:u,exports:g,imports:a};return $Q.set(r,f),f}function $Ae(r,e){let t=new URL(\"./package.json\",r);for(;;){let s=t.pathname;if(El(s,\"node_modules/package.json\"))break;let o=VWe((0,eb.fileURLToPath)(t),r,void 0,e);if(o.exists)return o;let a=t;if(t=new URL(\"../package.json\",t),t.pathname===a.pathname)break}let i=(0,eb.fileURLToPath)(t),n={pjsonPath:i,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return $Q.set(i,n),n}function XWe(r,e,t){throw new VAe(r,e&&(0,qi.fileURLToPath)(new URL(\".\",e)),(0,qi.fileURLToPath)(t))}function ZWe(r,e,t,i){let n=`request is not a valid subpath for the \"${t?\"imports\":\"exports\"}\" resolution of ${(0,qi.fileURLToPath)(e)}`;throw new JO(r,n,i&&(0,qi.fileURLToPath)(i))}function cE(r,e,t,i,n){throw typeof e==\"object\"&&e!==null?e=sE(e,null,\"\"):e=`${e}`,new XAe((0,qi.fileURLToPath)(new URL(\".\",t)),r,e,i,n&&(0,qi.fileURLToPath)(n))}var ele=/(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\\\|\\/|$)/i,tle=/\\*/g;function _We(r,e,t,i,n,s,o,a){if(e!==\"\"&&!s&&r[r.length-1]!==\"/\"&&cE(t,r,i,o,n),!oa(r,\"./\")){if(o&&!oa(r,\"../\")&&!oa(r,\"/\")){let g=!1;try{new URL(r),g=!0}catch{}if(!g)return s?YO(tle,r,()=>e):r+e}cE(t,r,i,o,n)}GO(ele,Il(r,2))!==null&&cE(t,r,i,o,n);let l=new URL(r,i),c=l.pathname,u=new URL(\".\",i).pathname;if(oa(c,u)||cE(t,r,i,o,n),e===\"\")return l;if(GO(ele,e)!==null){let g=s?qAe(t,\"*\",()=>e):t+e;ZWe(g,i,o,n)}return s?new URL(YO(tle,l.href,()=>e)):new URL(e,l)}function $We(r){let e=+r;return`${e}`!==r?!1:e>=0&&e<4294967295}function ip(r,e,t,i,n,s,o,a){if(typeof e==\"string\")return _We(e,t,i,r,n,s,o,a);if(HO(e)){if(e.length===0)return null;let l;for(let c=0;c<e.length;c++){let u=e[c],g;try{g=ip(r,u,t,i,n,s,o,a)}catch(f){if(l=f,f.code===\"ERR_INVALID_PACKAGE_TARGET\")continue;throw f}if(g!==void 0){if(g===null){l=null;continue}return g}}if(l==null)return l;throw l}else if(typeof e==\"object\"&&e!==null){let l=oE(e);for(let c=0;c<l.length;c++){let u=l[c];if($We(u))throw new lE((0,qi.fileURLToPath)(r),n,'\"exports\" cannot contain numeric property keys.')}for(let c=0;c<l.length;c++){let u=l[c];if(u===\"default\"||a.has(u)){let g=e[u],f=ip(r,g,t,i,n,s,o,a);if(f===void 0)continue;return f}}return}else if(e===null)return null;cE(i,e,r,o,n)}function ile(r,e){let t=aE(r,\"*\"),i=aE(e,\"*\"),n=t===-1?r.length:t+1,s=i===-1?e.length:i+1;return n>s?-1:s>n||t===-1?1:i===-1||r.length>e.length?-1:e.length>r.length?1:0}function eze(r,e,t){if(typeof r==\"string\"||HO(r))return!0;if(typeof r!=\"object\"||r===null)return!1;let i=oE(r),n=!1,s=0;for(let o=0;o<i.length;o++){let a=i[o],l=a===\"\"||a[0]!==\".\";if(s++===0)n=l;else if(n!==l)throw new lE((0,qi.fileURLToPath)(e),t,`\"exports\" cannot contain some keys starting with '.' and some not. The exports object must either be an object of package subpath keys or an object of main entry condition name keys only.`)}return n}function WO(r,e,t){throw new ZAe((0,qi.fileURLToPath)(new URL(\".\",e)),r,t&&(0,qi.fileURLToPath)(t))}var rle=new Set;function tze(r,e,t){let i=(0,qi.fileURLToPath)(e);rle.has(i+\"|\"+r)||(rle.add(i+\"|\"+r),process.emitWarning(`Use of deprecated trailing slash pattern mapping \"${r}\" in the \"exports\" field module resolution of the package at ${i}${t?` imported from ${(0,qi.fileURLToPath)(t)}`:\"\"}. Mapping specifiers ending in \"/\" is no longer supported.`,\"DeprecationWarning\",\"DEP0155\"))}function nle({packageJSONUrl:r,packageSubpath:e,exports:t,base:i,conditions:n}){if(eze(t,r,i)&&(t={\".\":t}),Gu(t,e)&&!jO(e,\"*\")&&!El(e,\"/\")){let l=t[e],c=ip(r,l,\"\",e,i,!1,!1,n);return c==null&&WO(e,r,i),c}let s=\"\",o,a=oE(t);for(let l=0;l<a.length;l++){let c=a[l],u=aE(c,\"*\");if(u!==-1&&oa(e,Il(c,0,u))){El(e,\"/\")&&tze(e,r,i);let g=Il(c,u+1);e.length>=c.length&&El(e,g)&&ile(s,c)===1&&qO(c,\"*\")===u&&(s=c,o=Il(e,u,e.length-g.length))}}if(s){let l=t[s],c=ip(r,l,o,s,i,!0,!1,n);return c==null&&WO(e,r,i),c}WO(e,r,i)}function sle({name:r,base:e,conditions:t,readFileSyncFn:i}){if(r===\"#\"||oa(r,\"#/\")||El(r,\"/\")){let o=\"is not a valid internal imports specifier name\";throw new JO(r,o,(0,qi.fileURLToPath)(e))}let n,s=$Ae(e,i);if(s.exists){n=(0,qi.pathToFileURL)(s.pjsonPath);let o=s.imports;if(o)if(Gu(o,r)&&!jO(r,\"*\")){let a=ip(n,o[r],\"\",r,e,!1,!0,t);if(a!=null)return a}else{let a=\"\",l,c=oE(o);for(let u=0;u<c.length;u++){let g=c[u],f=aE(g,\"*\");if(f!==-1&&oa(r,Il(g,0,f))){let h=Il(g,f+1);r.length>=g.length&&El(r,h)&&ile(a,g)===1&&qO(g,\"*\")===f&&(a=g,l=Il(r,f,r.length-h.length))}}if(a){let u=o[a],g=ip(n,u,l,a,e,!0,!0,t);if(g!=null)return g}}}XWe(r,n,e)}var rze=new Set([\"BUILTIN_NODE_RESOLUTION_FAILED\",\"MISSING_DEPENDENCY\",\"MISSING_PEER_DEPENDENCY\",\"QUALIFIED_PATH_RESOLUTION_FAILED\",\"UNDECLARED_DEPENDENCY\"]);function ri(r,e,t={},i){i!=null||(i=rze.has(r)?\"MODULE_NOT_FOUND\":r);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...n,value:i},pnpCode:{...n,value:r},data:{...n,value:t}})}function ho(r){return U.normalize(U.fromPortablePath(r))}var lle=Pe(ale());function cle(r){return ize(),VO[r]}var VO;function ize(){VO||(VO={\"--conditions\":[],...Ale(nze()),...Ale(process.execArgv)})}function Ale(r){return(0,lle.default)({\"--conditions\":[String],\"-C\":\"--conditions\"},{argv:r,permissive:!0})}function nze(){let r=[],e=sze(process.env.NODE_OPTIONS||\"\",r);return r.length,e}function sze(r,e){let t=[],i=!1,n=!0;for(let s=0;s<r.length;++s){let o=r[s];if(o===\"\\\\\"&&i){if(s+1===r.length)return e.push(`invalid value for NODE_OPTIONS (invalid escape)\n`),t;o=r[++s]}else if(o===\" \"&&!i){n=!0;continue}else if(o==='\"'){i=!i;continue}n?(t.push(o),n=!1):t[t.length-1]+=o}return i&&e.push(`invalid value for NODE_OPTIONS (unterminated string)\n`),t}var gle=J(\"module\");var[ts,yl]=process.versions.node.split(\".\").map(r=>parseInt(r,10)),iBt=ts>16||ts===16&&yl>=12,nBt=ts>17||ts===17&&yl>=5||ts===16&&yl>=15,sBt=ts>17||ts===17&&yl>=1||ts===16&&yl>14,ule=ts>19||ts===19&&yl>=2||ts===18&&yl>=13,oBt=ts>19||ts===19&&yl>=3;var oze=new Set(gle.Module.builtinModules||Object.keys(process.binding(\"natives\"))),tb=r=>r.startsWith(\"node:\")||oze.has(r);function fle(r){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(r=r.map(e=>U.fromPortablePath(Br.resolveVirtual(U.toPortablePath(e)))),ule)process.send({\"watch:require\":r});else for(let e of r)process.send({\"watch:require\":e})}function ZO(r,e){let t=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\\\/]|\\\\\\\\|\\.{0,2}(?:\\/|$))((?:node:)?(?:@[^/]+\\/)?[^/]+)\\/*(.*|)$/,s=/^(\\/|\\.{1,2}(\\/|$))/,o=/\\/$/,a=/^\\.{0,2}\\//,l={name:null,reference:null},c=[],u=new Set;if(r.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let oe of[\"react-scripts\",\"gatsby\"]){let le=r.packageRegistry.get(oe);if(le)for(let Be of le.keys()){if(Be===null)throw new Error(\"Assertion failed: This reference shouldn't be null\");c.push({name:oe,reference:Be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=r;function p(oe,le){return{fn:oe,args:le,error:null,result:null}}function C(oe){var qe,ne,Y,he,ie,de;let le=(Y=(ne=(qe=process.stderr)==null?void 0:qe.hasColors)==null?void 0:ne.call(qe))!=null?Y:process.stdout.isTTY,Be=(_e,Pt)=>`\\x1B[${_e}m${Pt}\\x1B[0m`,fe=oe.error;console.error(fe?Be(\"31;1\",`\\u2716 ${(he=oe.error)==null?void 0:he.message.replace(/\\n.*/s,\"\")}`):Be(\"33;1\",\"\\u203C Resolution\")),oe.args.length>0&&console.error();for(let _e of oe.args)console.error(`  ${Be(\"37;1\",\"In \\u2190\")} ${(0,XO.inspect)(_e,{colors:le,compact:!0})}`);oe.result&&(console.error(),console.error(`  ${Be(\"37;1\",\"Out \\u2192\")} ${(0,XO.inspect)(oe.result,{colors:le,compact:!0})}`));let ae=(de=(ie=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:ie.slice(2))!=null?de:[];if(ae.length>0){console.error();for(let _e of ae)console.error(`  ${Be(\"38;5;244\",_e)}`)}console.error()}function y(oe,le){if(e.allowDebug===!1)return le;if(Number.isFinite(i)){if(i>=2)return(...Be)=>{let fe=p(oe,Be);try{return fe.result=le(...Be)}catch(ae){throw fe.error=ae}finally{C(fe)}};if(i>=1)return(...Be)=>{try{return le(...Be)}catch(fe){let ae=p(oe,Be);throw ae.error=fe,C(ae),fe}}}return le}function B(oe){let le=A(oe);if(!le)throw ri(\"INTERNAL\",\"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)\");return le}function v(oe){if(oe.name===null)return!0;for(let le of r.dependencyTreeRoots)if(le.name===oe.name&&le.reference===oe.reference)return!0;return!1}let D=new Set([\"node\",\"require\",...cle(\"--conditions\")]);function L(oe,le=D,Be){let fe=re(x.join(oe,\"internal.js\"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(fe===null)throw ri(\"INTERNAL\",`The locator that owns the \"${oe}\" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ae}=B(fe),qe=x.join(ae,xt.manifest);if(!e.fakeFs.existsSync(qe))return null;let ne=JSON.parse(e.fakeFs.readFileSync(qe,\"utf8\"));if(ne.exports==null)return null;let Y=x.contains(ae,oe);if(Y===null)throw ri(\"INTERNAL\",\"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)\");Y!==\".\"&&!a.test(Y)&&(Y=`./${Y}`);try{let he=nle({packageJSONUrl:(0,uA.pathToFileURL)(U.fromPortablePath(qe)),packageSubpath:Y,exports:ne.exports,base:Be?(0,uA.pathToFileURL)(U.fromPortablePath(Be)):null,conditions:le});return U.toPortablePath((0,uA.fileURLToPath)(he))}catch(he){throw ri(\"EXPORTS_RESOLUTION_FAILED\",he.message,{unqualifiedPath:ho(oe),locator:fe,pkgJson:ne,subpath:ho(Y),conditions:le},he.code)}}function H(oe,le,{extensions:Be}){let fe;try{le.push(oe),fe=e.fakeFs.statSync(oe)}catch{}if(fe&&!fe.isDirectory())return e.fakeFs.realpathSync(oe);if(fe&&fe.isDirectory()){let ae;try{ae=JSON.parse(e.fakeFs.readFileSync(x.join(oe,xt.manifest),\"utf8\"))}catch{}let qe;if(ae&&ae.main&&(qe=x.resolve(oe,ae.main)),qe&&qe!==oe){let ne=H(qe,le,{extensions:Be});if(ne!==null)return ne}}for(let ae=0,qe=Be.length;ae<qe;ae++){let ne=`${oe}${Be[ae]}`;if(le.push(ne),e.fakeFs.existsSync(ne))return ne}if(fe&&fe.isDirectory())for(let ae=0,qe=Be.length;ae<qe;ae++){let ne=x.format({dir:oe,name:\"index\",ext:Be[ae]});if(le.push(ne),e.fakeFs.existsSync(ne))return ne}return null}function j(oe){let le=new gE.Module(oe,null);return le.filename=oe,le.paths=gE.Module._nodeModulePaths(oe),le}function $(oe,le){return le.endsWith(\"/\")&&(le=x.join(le,\"internal.js\")),gE.Module._resolveFilename(U.fromPortablePath(oe),j(U.fromPortablePath(le)),!1,{plugnplay:!1})}function V(oe){if(g===null)return!1;let le=x.contains(r.basePath,oe);return le===null?!1:!!g.test(le.replace(/\\/$/,\"\"))}let W={std:3,resolveVirtual:1,getAllLocators:1},_=l;function A({name:oe,reference:le}){let Be=f.get(oe);if(!Be)return null;let fe=Be.get(le);return fe||null}function Ae({name:oe,reference:le}){let Be=[];for(let[fe,ae]of f)if(fe!==null)for(let[qe,ne]of ae)qe===null||ne.packageDependencies.get(oe)!==le||fe===oe&&qe===le||Be.push({name:fe,reference:qe});return Be}function ge(oe,le){let Be=new Map,fe=new Set,ae=ne=>{let Y=JSON.stringify(ne.name);if(fe.has(Y))return;fe.add(Y);let he=Ae(ne);for(let ie of he)if(B(ie).packagePeers.has(oe))ae(ie);else{let _e=Be.get(ie.name);typeof _e>\"u\"&&Be.set(ie.name,_e=new Set),_e.add(ie.reference)}};ae(le);let qe=[];for(let ne of[...Be.keys()].sort())for(let Y of[...Be.get(ne)].sort())qe.push({name:ne,reference:Y});return qe}function re(oe,{resolveIgnored:le=!1,includeDiscardFromLookup:Be=!1}={}){if(V(oe)&&!le)return null;let fe=x.relative(r.basePath,oe);fe.match(s)||(fe=`./${fe}`),fe.endsWith(\"/\")||(fe=`${fe}/`);do{let ae=h.get(fe);if(typeof ae>\"u\"||ae.discardFromLookup&&!Be){fe=fe.substring(0,fe.lastIndexOf(\"/\",fe.length-2)+1);continue}return ae.locator}while(fe!==\"\");return null}function O(oe){try{return e.fakeFs.readFileSync(U.toPortablePath(oe),\"utf8\")}catch(le){if(le.code===\"ENOENT\")return;throw le}}function F(oe,le,{considerBuiltins:Be=!0}={}){if(oe.startsWith(\"#\"))throw new Error(\"resolveToUnqualified can not handle private import mappings\");if(oe===\"pnpapi\")return U.toPortablePath(e.pnpapiResolution);if(Be&&tb(oe))return null;let fe=ho(oe),ae=le&&ho(le);if(le&&V(le)&&(!x.isAbsolute(oe)||re(oe)===null)){let Y=$(oe,le);if(Y===!1)throw ri(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp)\n\nRequire request: \"${fe}\"\nRequired by: ${ae}\n`,{request:fe,issuer:ae});return U.toPortablePath(Y)}let qe,ne=oe.match(n);if(ne){if(!le)throw ri(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:fe,issuer:ae});let[,Y,he]=ne,ie=re(le);if(!ie){let hr=$(oe,le);if(hr===!1)throw ri(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree).\n\nRequire path: \"${fe}\"\nRequired by: ${ae}\n`,{request:fe,issuer:ae});return U.toPortablePath(hr)}let _e=B(ie).packageDependencies.get(Y),Pt=null;if(_e==null&&ie.name!==null){let hr=r.fallbackExclusionList.get(ie.name);if(!hr||!hr.has(ie.reference)){for(let ni=0,Us=c.length;ni<Us;++ni){let Ii=B(c[ni]).packageDependencies.get(Y);if(Ii!=null){t?Pt=Ii:_e=Ii;break}}if(r.enableTopLevelFallback&&_e==null&&Pt===null){let ni=r.fallbackPool.get(Y);ni!=null&&(Pt=ni)}}}let It=null;if(_e===null)if(v(ie))It=ri(\"MISSING_PEER_DEPENDENCY\",`Your application tried to access ${Y} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,dependencyName:Y});else{let hr=ge(Y,ie);hr.every(fi=>v(fi))?It=ri(\"MISSING_PEER_DEPENDENCY\",`${ie.name} tried to access ${Y} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n${hr.map(fi=>`Ancestor breaking the chain: ${fi.name}@${fi.reference}\n`).join(\"\")}\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y,brokenAncestors:hr}):It=ri(\"MISSING_PEER_DEPENDENCY\",`${ie.name} tried to access ${Y} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n\n${hr.map(fi=>`Ancestor breaking the chain: ${fi.name}@${fi.reference}\n`).join(\"\")}\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y,brokenAncestors:hr})}else _e===void 0&&(!Be&&tb(oe)?v(ie)?It=ri(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${Y}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Y} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,dependencyName:Y}):It=ri(\"UNDECLARED_DEPENDENCY\",`${ie.name} tried to access ${Y}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Y} isn't otherwise declared in ${ie.name}'s dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y}):v(ie)?It=ri(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${Y}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,dependencyName:Y}):It=ri(\"UNDECLARED_DEPENDENCY\",`${ie.name} tried to access ${Y}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y}));if(_e==null){if(Pt===null||It===null)throw It||new Error(\"Assertion failed: Expected an error to have been set\");_e=Pt;let hr=It.message.replace(/\\n.*/g,\"\");It.message=hr,!u.has(hr)&&i!==0&&(u.add(hr),process.emitWarning(It))}let Or=Array.isArray(_e)?{name:_e[0],reference:_e[1]}:{name:Y,reference:_e},ii=B(Or);if(!ii.packageLocation)throw ri(\"MISSING_DEPENDENCY\",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod.\n\nRequired package: ${Or.name}@${Or.reference}${Or.name!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n`,{request:fe,issuer:ae,dependencyLocator:Object.assign({},Or)});let gi=ii.packageLocation;he?qe=x.join(gi,he):qe=gi}else if(x.isAbsolute(oe))qe=x.normalize(oe);else{if(!le)throw ri(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:fe,issuer:ae});let Y=x.resolve(le);le.match(o)?qe=x.normalize(x.join(Y,oe)):qe=x.normalize(x.join(x.dirname(Y),oe))}return x.normalize(qe)}function ue(oe,le,Be=D,fe){if(s.test(oe))return le;let ae=L(le,Be,fe);return ae?x.normalize(ae):le}function pe(oe,{extensions:le=Object.keys(gE.Module._extensions)}={}){var ae,qe;let Be=[],fe=H(oe,Be,{extensions:le});if(fe)return x.normalize(fe);{fle(Be.map(he=>U.fromPortablePath(he)));let ne=ho(oe),Y=re(oe);if(Y){let{packageLocation:he}=B(Y),ie=!0;try{e.fakeFs.accessSync(he)}catch(de){if((de==null?void 0:de.code)===\"ENOENT\")ie=!1;else{let _e=((qe=(ae=de==null?void 0:de.message)!=null?ae:de)!=null?qe:\"empty exception thrown\").replace(/^[A-Z]/,Pt=>Pt.toLowerCase());throw ri(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Required package exists but could not be accessed (${_e}).\n\nMissing package: ${Y.name}@${Y.reference}\nExpected package location: ${ho(he)}\n`,{unqualifiedPath:ne,extensions:le})}}if(!ie){let de=he.includes(\"/unplugged/\")?\"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).\":\"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.\";throw ri(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`${de}\n\nMissing package: ${Y.name}@${Y.reference}\nExpected package location: ${ho(he)}\n`,{unqualifiedPath:ne,extensions:le})}}throw ri(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Qualified path resolution failed: we looked for the following paths, but none could be accessed.\n\nSource path: ${ne}\n${Be.map(he=>`Not found: ${ho(he)}\n`).join(\"\")}`,{unqualifiedPath:ne,extensions:le})}}function ke(oe,le,Be){var ae;if(!le)throw new Error(\"Assertion failed: An issuer is required to resolve private import mappings\");let fe=sle({name:oe,base:(0,uA.pathToFileURL)(U.fromPortablePath(le)),conditions:(ae=Be.conditions)!=null?ae:D,readFileSyncFn:O});if(fe instanceof uA.URL)return pe(U.toPortablePath((0,uA.fileURLToPath)(fe)),{extensions:Be.extensions});if(fe.startsWith(\"#\"))throw new Error(\"Mapping from one private import to another isn't allowed\");return Fe(fe,le,Be)}function Fe(oe,le,Be={}){try{if(oe.startsWith(\"#\"))return ke(oe,le,Be);let{considerBuiltins:fe,extensions:ae,conditions:qe}=Be,ne=F(oe,le,{considerBuiltins:fe});if(oe===\"pnpapi\")return ne;if(ne===null)return null;let Y=()=>le!==null?V(le):!1,he=(!fe||!tb(oe))&&!Y()?ue(oe,ne,qe,le):ne;return pe(he,{extensions:ae})}catch(fe){throw Object.prototype.hasOwnProperty.call(fe,\"pnpCode\")&&Object.assign(fe.data,{request:ho(oe),issuer:le&&ho(le)}),fe}}function Ne(oe){let le=x.normalize(oe),Be=Br.resolveVirtual(le);return Be!==le?Be:null}return{VERSIONS:W,topLevel:_,getLocator:(oe,le)=>Array.isArray(le)?{name:le[0],reference:le[1]}:{name:oe,reference:le},getDependencyTreeRoots:()=>[...r.dependencyTreeRoots],getAllLocators(){let oe=[];for(let[le,Be]of f)for(let fe of Be.keys())le!==null&&fe!==null&&oe.push({name:le,reference:fe});return oe},getPackageInformation:oe=>{let le=A(oe);if(le===null)return null;let Be=U.fromPortablePath(le.packageLocation);return{...le,packageLocation:Be}},findPackageLocator:oe=>re(U.toPortablePath(oe)),resolveToUnqualified:y(\"resolveToUnqualified\",(oe,le,Be)=>{let fe=le!==null?U.toPortablePath(le):null,ae=F(U.toPortablePath(oe),fe,Be);return ae===null?null:U.fromPortablePath(ae)}),resolveUnqualified:y(\"resolveUnqualified\",(oe,le)=>U.fromPortablePath(pe(U.toPortablePath(oe),le))),resolveRequest:y(\"resolveRequest\",(oe,le,Be)=>{let fe=le!==null?U.toPortablePath(le):null,ae=Fe(U.toPortablePath(oe),fe,Be);return ae===null?null:U.fromPortablePath(ae)}),resolveVirtual:y(\"resolveVirtual\",oe=>{let le=Ne(U.toPortablePath(oe));return le!==null?U.fromPortablePath(le):null})}}var BBt=(0,ple.promisify)(hle.readFile);var dle=(r,e,t)=>{let i=nE(r),n=KO(i,{basePath:e}),s=U.join(e,xt.pnpCjs);return ZO(n,{fakeFs:t,pnpapiResolution:s})};var $O=Pe(mle());var po={};ut(po,{checkAndReportManifestCompatibility:()=>Ile,checkManifestCompatibility:()=>Ele,extractBuildScripts:()=>rb,getExtractHint:()=>eM,hasBindingGyp:()=>tM});function Ele(r){return P.isPackageCompatible(r,ws.getArchitectureSet())}function Ile(r,e,{configuration:t,report:i}){return Ele(r)?!0:(i==null||i.reportWarningOnce(76,`${P.prettyLocator(t,r)} The ${ws.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rb(r,e,t,{configuration:i,report:n}){let s=[];for(let a of[\"preinstall\",\"install\",\"postinstall\"])e.manifest.scripts.has(a)&&s.push([0,a]);return!e.manifest.scripts.has(\"install\")&&e.misc.hasBindingGyp&&s.push([1,\"node-gyp rebuild\"]),s.length===0?[]:r.linkType!==\"HARD\"?(n==null||n.reportWarningOnce(6,`${P.prettyLocator(i,r)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):t&&t.built===!1?(n==null||n.reportInfoOnce(5,`${P.prettyLocator(i,r)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get(\"enableScripts\")&&!t.built?(n==null||n.reportWarningOnce(4,`${P.prettyLocator(i,r)} lists build scripts, but all build scripts have been disabled.`),[]):Ile(r,\"build\",{configuration:i,report:n})?s:[]}var Aze=new Set([\".exe\",\".h\",\".hh\",\".hpp\",\".c\",\".cc\",\".cpp\",\".java\",\".jar\",\".node\"]);function eM(r){return r.packageFs.getExtractHint({relevantExtensions:Aze})}function tM(r){let e=x.join(r.prefixPath,\"binding.gyp\");return r.packageFs.existsSync(e)}var hE={};ut(hE,{getUnpluggedPath:()=>fE});function fE(r,{configuration:e}){return x.resolve(e.get(\"pnpUnpluggedFolder\"),P.slugifyLocator(r))}var lze=new Set([P.makeIdent(null,\"open\").identHash,P.makeIdent(null,\"opn\").identHash]),wl=class{constructor(){this.mode=\"strict\";this.pnpCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error(\"Assertion failed: Expected the PnP linker to be enabled\");let i=Bl(t.project).cjs;if(!M.existsSync(i))throw new be(`The project in ${ee.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ee.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=Ie.getFactoryWithDefault(this.pnpCache,i,()=>Ie.dynamicRequire(i,{cachingStrategy:Ie.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new be(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return U.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=Bl(t.project).cjs;if(!M.existsSync(i))return null;let s=Ie.getFactoryWithDefault(this.pnpCache,i,()=>Ie.dynamicRequire(i,{cachingStrategy:Ie.CachingStrategy.FsTime})).findPackageLocator(U.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new Yu(e)}isEnabled(e){return!(e.project.configuration.get(\"nodeLinker\")!==\"pnp\"||e.project.configuration.get(\"pnpMode\")!==this.mode)}},Yu=class{constructor(e){this.opts=e;this.mode=\"strict\";this.asyncActions=new Ie.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:\"PnpInstaller\",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==\"SOFT\",g,f;if(c||u){let D=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(D.locatorHash),typeof g>\"u\"&&(g=await cze(t),e.linkType===\"HARD\"&&this.customData.store.set(D.locatorHash,g)),g.manifest.type===\"module\"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(D,e.version)}let h=c?rb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,t,f,i):t.packageFs;if(x.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);let C=x.resolve(p.getRealPath(),t.prefixPath),y=rM(this.opts.project.cwd,C),B=new Map,v=new Set;if(a){for(let D of e.peerDependencies.values())B.set(P.stringifyIdent(D),null),v.add(P.stringifyIdent(D));if(!o){let D=P.devirtualizeLocator(e);this.virtualTemplates.set(D.locatorHash,{location:rM(this.opts.project.cwd,Br.resolveVirtual(C)),locator:D})}}return Ie.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:B,packagePeers:v,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:C,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,t){let i=this.getPackageInformation(e);for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){for(let i of t)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get(\"pnpMode\")!==this.mode)return;let e=Bl(this.opts.project);if(M.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(0,`Removing the old ${ee.pretty(this.opts.project.configuration,xt.pnpJs,ee.Type.PATH)} file. You might need to manually update existing references to reference the new ${ee.pretty(this.opts.project.configuration,xt.pnpCjs,ee.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ee.pretty(this.opts.project.configuration,\"yarn sdks\",ee.Type.CODE)}.`),await M.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await M.removePromise(e.esmLoader),this.opts.project.configuration.get(\"nodeLinker\")!==\"pnp\"){await M.removePromise(e.cjs),await M.removePromise(this.opts.project.configuration.get(\"pnpDataPath\")),await M.removePromise(e.esmLoader),await M.removePromise(this.opts.project.configuration.get(\"pnpUnpluggedFolder\"));return}for(let{locator:u,location:g}of this.virtualTemplates.values())Ie.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let t=this.opts.project.configuration.get(\"pnpFallbackMode\"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=t!==\"none\",s=[],o=new Map,a=Ie.buildIgnorePattern([\".yarn/sdks/**\",...this.opts.project.configuration.get(\"pnpIgnorePatterns\")]),l=this.packageRegistry,c=this.opts.project.configuration.get(\"pnpShebang\");if(t===\"dependencies-only\")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has(\"pnpEnableEsmLoader\"))return this.opts.project.configuration.get(\"pnpEnableEsmLoader\");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type===\"module\")return!0;return!1}async finalizeInstallWithPnp(e){let t=Bl(this.opts.project),i=this.opts.project.configuration.get(\"pnpDataPath\"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(31,\"One or more node_modules have been detected and will be removed. This operation may take some time.\");for(let o of n)await M.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get(\"pnpEnableInlining\")){let o=YAe(e);await M.changeFilePromise(t.cjs,o,{automaticNewlines:!0,mode:493}),await M.removePromise(i)}else{let o=x.relative(x.dirname(t.cjs),i),{dataFile:a,loaderFile:l}=jAe({...e,dataLocation:o});await M.changeFilePromise(t.cjs,l,{automaticNewlines:!0,mode:493}),await M.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,\"ESM support for PnP uses the experimental loader API and is therefore experimental\"),await M.changeFilePromise(t.esmLoader,(0,$O.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get(\"pnpUnpluggedFolder\");if(this.unpluggedPaths.size===0)await M.removePromise(s);else for(let o of await M.readdirPromise(s)){let a=x.resolve(s,o);this.unpluggedPaths.has(a)||await M.removePromise(a)}}async locateNodeModules(e){let t=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=x.join(n.cwd,\"node_modules\");if(i&&i.test(x.relative(this.opts.project.cwd,n.cwd))||!M.existsSync(s))continue;let o=await M.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===\".bin\"||!l.name.startsWith(\".\"));if(a.length===o.length)t.push(s);else for(let l of a)t.push(x.join(s,l.name))}return t}async unplugPackageIfNeeded(e,t,i,n,s){return this.shouldBeUnplugged(e,t,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,t,i){return typeof i.unplugged<\"u\"?i.unplugged:lze.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rb(e,t,i,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint)}async unplugPackage(e,t,i){let n=fE(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new bo(n,{baseFs:t.packageFs,pathUtils:x}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=x.join(n,t.prefixPath,\".ready\");await M.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await M.mkdirPromise(n,{recursive:!0}),await M.copyPromise(n,Oe.dot,{baseFs:t.packageFs,overwrite:!1}),await M.writeFilePromise(s,\"\"))})),new qt(n))}getPackageInformation(e){let t=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let t=Ie.getMapWithDefault(this.packageRegistry,\"@@disk\"),i=rM(this.opts.project.cwd,e);return Ie.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1}))}};function rM(r,e){let t=x.relative(r,e);return t.match(/^\\.{0,2}\\//)||(t=`./${t}`),t.replace(/\\/?$/,\"/\")}async function cze(r){var i;let e=(i=await ot.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?i:new ot,t=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let n of e.scripts.keys())t.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:eM(r),hasBindingGyp:tM(r)}}}var yle=Pe(wn());var ju=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Unplug direct dependencies from the entire project\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Unplug both direct and transitive dependencies\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);if(t.get(\"nodeLinker\")!==\"pnp\")throw new be(\"This command can only be used if the `nodeLinker` option is set to `pnp`\");await i.restoreInstallState();let o=new Set(this.patterns),a=this.patterns.map(h=>{let p=P.parseDescriptor(h),C=p.range!==\"unknown\"?p:P.makeDescriptor(p,\"*\");if(!vt.validRange(C.range))throw new be(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(t,C)})`);return y=>{let B=P.stringifyIdent(y);return!yle.default.isMatch(B,P.stringifyIdent(C))||y.version&&!vt.satisfiesWithPrereleases(y.version,C.range)?!1:(o.delete(h),!0)}}),l=()=>{let h=[];for(let p of i.storedPackages.values())!i.tryWorkspaceByLocator(p)&&!P.isVirtualLocator(p)&&a.some(C=>C(p))&&h.push(p);return h},c=h=>{let p=new Set,C=[],y=(B,v)=>{if(!p.has(B.locatorHash)&&(p.add(B.locatorHash),!i.tryWorkspaceByLocator(B)&&a.some(D=>D(B))&&C.push(B),!(v>0&&!this.recursive)))for(let D of B.dependencies.values()){let L=i.storedResolutions.get(D.descriptorHash);if(!L)throw new Error(\"Assertion failed: The resolution should have been registered\");let H=i.storedPackages.get(L);if(!H)throw new Error(\"Assertion failed: The package should have been registered\");y(H,v+1)}};for(let B of h){let v=i.storedPackages.get(B.anchoredLocator.locatorHash);if(!v)throw new Error(\"Assertion failed: The package should have been registered\");y(v,0)}return C},u,g;if(this.all&&this.recursive?(u=l(),g=\"the project\"):this.all?(u=c(i.workspaces),g=\"any workspace\"):(u=c([n]),g=\"this workspace\"),o.size>1)throw new be(`Patterns ${ee.prettyList(t,o,ee.Type.CODE)} don't match any packages referenced by ${g}`);if(o.size>0)throw new be(`Pattern ${ee.prettyList(t,o,ee.Type.CODE)} doesn't match any packages referenced by ${g}`);return u=Ie.sortMap(u,h=>P.stringifyLocator(h)),(await Ge.start({configuration:t,stdout:this.context.stdout,json:this.json},async h=>{var p;for(let C of u){let y=(p=C.version)!=null?p:\"unknown\",B=i.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(C,y));B.unplugged=!0,h.reportInfo(0,`Will unpack ${P.prettyLocator(t,C)} to ${ee.pretty(t,fE(C,{configuration:t}),ee.Type.PATH)}`),h.reportJson({locator:P.stringifyLocator(C),version:y})}await i.topLevelWorkspace.persistManifest(),h.reportSeparator(),await i.install({cache:s,report:h})})).exitCode()}};ju.paths=[[\"unplug\"]],ju.usage=ve.Usage({description:\"force the unpacking of a list of packages\",details:\"\\n      This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\\n\\n      A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\\n\\n      Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\\n\\n      By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\\n\\n      This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\\n    \",examples:[[\"Unplug the lodash dependency from the active workspace\",\"yarn unplug lodash\"],[\"Unplug all instances of lodash referenced by any workspace\",\"yarn unplug lodash -A\"],[\"Unplug all instances of lodash referenced by the active workspace and its dependencies\",\"yarn unplug lodash -R\"],[\"Unplug all instances of lodash, anywhere\",\"yarn unplug lodash -AR\"],[\"Unplug one specific version of lodash\",\"yarn unplug lodash@1.2.3\"],[\"Unplug all packages with the `@babel` scope\",\"yarn unplug '@babel/*'\"],[\"Unplug all packages (only for testing, not recommended)\",\"yarn unplug -R '*'\"]]});var Bl=r=>({cjs:x.join(r.cwd,xt.pnpCjs),cjsLegacy:x.join(r.cwd,xt.pnpJs),esmLoader:x.join(r.cwd,\".pnp.loader.mjs\")}),Qle=r=>/\\s/.test(r)?JSON.stringify(r):r;async function uze(r,e,t){let i=Bl(r),n=`--require ${Qle(U.fromPortablePath(i.cjs))}`;if(M.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,Ble.pathToFileURL)(U.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(\" \")&&wle.default.lt(process.versions.node,\"12.0.0\"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(M.existsSync(i.cjs)){let s=e.NODE_OPTIONS||\"\",o=/\\s*--require\\s+\\S*\\.pnp\\.c?js\\s*/g,a=/\\s*--experimental-loader\\s+\\S*\\.pnp\\.loader\\.mjs\\s*/;s=s.replace(o,\" \").replace(a,\" \").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function gze(r,e){let t=Bl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get(\"pnpDataPath\")),e(r.configuration.get(\"pnpUnpluggedFolder\"))}var fze={hooks:{populateYarnPaths:gze,setupScriptEnvironment:uze},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: \"pnp\", \"node-modules\"',type:\"STRING\",default:\"pnp\"},pnpMode:{description:\"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.\",type:\"STRING\",default:\"strict\"},pnpShebang:{description:\"String to prepend to the generated PnP script\",type:\"STRING\",default:\"#!/usr/bin/env node\"},pnpIgnorePatterns:{description:\"Array of glob patterns; files matching them will use the classic resolution\",type:\"STRING\",default:[],isArray:!0},pnpEnableEsmLoader:{description:\"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.\",type:\"BOOLEAN\",default:!1},pnpEnableInlining:{description:\"If true, the PnP data will be inlined along with the generated loader\",type:\"BOOLEAN\",default:!0},pnpFallbackMode:{description:\"If true, the generated PnP loader will follow the top-level fallback rule\",type:\"STRING\",default:\"dependencies-only\"},pnpUnpluggedFolder:{description:\"Folder where the unplugged packages must be stored\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/unplugged\"},pnpDataPath:{description:\"Path of the file where the PnP data (used by the loader) must be written\",type:\"ABSOLUTE_PATH\",default:\"./.pnp.data.json\"}},linkers:[wl],commands:[ju]},hze=fze;var Rle=Pe(Ple());var cM=Pe(J(\"crypto\")),Fle=Pe(J(\"fs\")),Nle=1,kr=\"node_modules\",ib=\".bin\",Lle=\".yarn-state.yml\",kze=1e3;var nb=class{constructor(){this.installStateCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error(\"Assertion failed: Expected the node-modules linker to be enabled\");let i=t.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await Ie.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await lM(t.project,{unrollAliases:!0}));if(n===null)throw new be(\"Couldn't find the node_modules state file - running an install might help (findPackageLocation)\");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let l=new be(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw l.code=\"LOCATOR_NOT_INSTALLED\",l}let o=s.locations.sort((l,c)=>l.split(x.sep).length-c.split(x.sep).length),a=x.join(t.project.configuration.startingCwd,kr);return o.find(l=>x.contains(a,l))||s.locations[0]}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=await Ie.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await lM(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=sb(x.resolve(e),{skipPrefix:t.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new AM(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"node-modules\"}},AM=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:\"NodeModulesInstaller\",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t){var u;let i=x.resolve(t.packageFs.getRealPath(),t.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n>\"u\"&&(n=await Rze(e,t),e.linkType===\"HARD\"&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${U.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=t.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=t.checksum?t.checksum.substring(t.checksum.indexOf(\"/\")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,t){let i=this.localStore.get(e.locatorHash);if(typeof i>\"u\")throw new Error(\"Assertion failed: Expected information object to have been registered\");for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){throw new Error(\"External dependencies haven't been implemented for the node-modules linker\")}async finalizeInstall(){if(this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\")return;let e=new Br({baseFs:new Mn({libzip:await on(),maxOpenFiles:80,readOnlyArchives:!0})}),t=await lM(this.opts.project),i=this.opts.project.configuration.get(\"nmMode\");(t===null||i!==t.nmMode)&&(this.opts.project.storedBuildState.clear(),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,C;let h=this.opts.project.configuration.get(\"nmHoistingLimits\");try{h=Ie.validateEnum(tE,(C=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?C:h)}catch{let B=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(57,`${B}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(tE).join(\", \")}, using default: \"${h}\"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,C;let h=this.opts.project.configuration.get(\"nmSelfReferences\");return h=(C=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?C:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p>\"u\")throw new Error(\"Assertion failed: Expected the package reference to have been registered\");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(U.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error(\"Assertion failed: Unimplemented\")},resolveToUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveRequest:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveVirtual:f=>U.fromPortablePath(Br.resolveVirtual(U.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=rE(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=MO(a);await Mze(t,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(Ule(f))continue;let p=P.parseLocator(f),C=this.localStore.get(p.locatorHash);if(typeof C>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");if(this.opts.project.tryWorkspaceByLocator(C.pkg))continue;let y=po.extractBuildScripts(C.pkg,C.customPackageData,C.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${ee.pretty(this.opts.project.configuration,\"--preserve-symlinks\",ee.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function Rze(r,e){var n;let t=(n=await ot.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new ot,i=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let s of t.scripts.keys())i.has(s)||t.scripts.delete(s);return{manifest:{bin:t.bin,scripts:t.scripts},misc:{extractHint:po.getExtractHint(e),hasBindingGyp:po.hasBindingGyp(e)}}}async function Fze(r,e,t,i,{installChangedByUser:n}){let s=\"\";s+=`# Warning: This file is automatically generated. Removing it is fine, but will\n`,s+=`# cause your node_modules installation to become invalidated.\n`,s+=`\n`,s+=`__metadata:\n`,s+=`  version: ${Nle}\n`,s+=`  nmMode: ${i.value}\n`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(r.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=`\n`,s+=`${JSON.stringify(u)}:\n`,s+=`  locations:\n`;for(let f of g.locations){let h=x.contains(r.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=`    - ${JSON.stringify(h)}\n`}if(g.aliases.length>0){s+=`  aliases:\n`;for(let f of g.aliases)s+=`    - ${JSON.stringify(f)}\n`}if(u===a&&t.size>0){s+=`  bin:\n`;for(let[f,h]of t){let p=x.contains(r.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=`    ${JSON.stringify(p)}:\n`;for(let[C,y]of h){let B=x.relative(x.join(f,kr),y);s+=`      ${JSON.stringify(C)}: ${JSON.stringify(B)}\n`}}}}let l=r.cwd,c=x.join(l,kr,Lle);n&&await M.removePromise(c),await M.changeFilePromise(c,s,{automaticNewlines:!0})}async function lM(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=x.join(t,kr,Lle),n;try{n=await M.statPromise(i)}catch{}if(!n)return null;let s=yi(await M.readFilePromise(i,\"utf8\"));if(s.__metadata.version>Nle)return null;let o=s.__metadata.nmMode||\"classic\",a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>x.join(t,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let C=x.join(t,U.toPortablePath(h)),y=Ie.getMapWithDefault(l,C);for(let[B,v]of Object.entries(p))y.set(Kr(B),U.toPortablePath([C,kr,v].join(x.sep)))}if(a.set(c,{target:Oe.dot,linkType:\"HARD\",locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:C}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,C),h),B=P.stringifyLocator(y);a.set(B,{target:Oe.dot,linkType:\"HARD\",locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:Tle(a,{skipPrefix:r.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var sp=async(r,e)=>{if(r.split(x.sep).indexOf(kr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${r}`);try{if(!e.innerLoop){let i=e.allowSymlink?await M.statPromise(r):await M.lstatPromise(r);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await M.unlinkPromise(r);return}}let t=await M.readdirPromise(r,{withFileTypes:!0});for(let i of t){let n=x.join(r,Kr(i.name));i.isDirectory()?(i.name!==kr||e&&e.innerLoop)&&await sp(n,{innerLoop:!0,contentsOnly:!1}):await M.unlinkPromise(n)}e.contentsOnly||await M.rmdirPromise(r)}catch(t){if(t.code!==\"ENOENT\"&&t.code!==\"ENOTEMPTY\")throw t}},Dle=4,sb=(r,{skipPrefix:e})=>{let t=x.contains(e,r);if(t===null)throw new Error(`Assertion failed: Writing attempt prevented to ${r} which is outside project root: ${e}`);let i=t.split(x.sep).filter(l=>l!==\"\"),n=i.indexOf(kr),s=i.slice(0,n).join(x.sep),o=x.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},Tle=(r,{skipPrefix:e})=>{let t=new Map;if(r===null)return t;let i=()=>({children:new Map,linkType:\"HARD\"});for(let[n,s]of r.entries()){if(s.linkType===\"SOFT\"&&x.contains(e,s.target)!==null){let a=Ie.getFactoryWithDefault(t,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=sb(o,{skipPrefix:e}),c=Ie.getFactoryWithDefault(t,a,i);for(let u=0;u<l.length;++u){let g=l[u];if(g!==\".\"){let f=Ie.getFactoryWithDefault(c.children,g,i);c.children.set(g,f),c=f}u===l.length-1&&(c.locator=n,c.linkType=s.linkType)}}}return t},uM=async(r,e)=>{let t;try{process.platform===\"win32\"&&(t=await M.lstatPromise(r))}catch{}process.platform==\"win32\"&&(!t||t.isDirectory())?await M.symlinkPromise(r,e,\"junction\"):await M.symlinkPromise(x.relative(x.dirname(e),r),e)};async function Ole(r,e,t){let i=x.join(r,Kr(`${cM.default.randomBytes(16).toString(\"hex\")}.tmp`));try{await M.writeFilePromise(i,t);try{await M.linkPromise(i,e)}catch{}}finally{await M.unlinkPromise(i)}}async function Nze({srcPath:r,dstPath:e,entry:t,globalHardlinksStore:i,baseFs:n,nmMode:s}){if(t.kind===Mle.FILE){if(s.value===\"hardlinks-global\"&&i&&t.digest){let a=x.join(i,t.digest.substring(0,2),`${t.digest.substring(2)}.dat`),l;try{let c=await M.statPromise(a);if(c&&(!t.mtimeMs||c.mtimeMs>t.mtimeMs||c.mtimeMs<t.mtimeMs-kze))if(await li.checksumFile(a,{baseFs:M,algorithm:\"sha1\"})!==t.digest){let g=x.join(i,Kr(`${cM.default.randomBytes(16).toString(\"hex\")}.tmp`));await M.renamePromise(a,g);let f=await n.readFilePromise(r);await M.writeFilePromise(g,f);try{await M.linkPromise(g,a),t.mtimeMs=new Date().getTime(),await M.unlinkPromise(g)}catch{}}else t.mtimeMs||(t.mtimeMs=Math.ceil(c.mtimeMs));await M.linkPromise(a,e),l=!0}catch{l=!1}if(!l){let c=await n.readFilePromise(r);await Ole(i,a,c),t.mtimeMs=new Date().getTime();try{await M.linkPromise(a,e)}catch(u){u&&u.code&&u.code==\"EXDEV\"&&(s.value=\"hardlinks-local\",await n.copyFilePromise(r,e))}}}else await n.copyFilePromise(r,e);let o=t.mode&511;o!==420&&await M.chmodPromise(e,o)}}var Mle=(i=>(i.FILE=\"file\",i.DIRECTORY=\"directory\",i.SYMLINK=\"symlink\",i))(Mle||{}),Lze=async(r,e,{baseFs:t,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await M.mkdirPromise(r,{recursive:!0});let o=async(c=Oe.dot)=>{let u=x.join(e,c),g=await t.readdirPromise(u,{withFileTypes:!0}),f=new Map;for(let h of g){let p=x.join(c,h.name),C,y=x.join(u,h.name);if(h.isFile()){if(C={kind:\"file\",mode:(await t.lstatPromise(y)).mode},n.value===\"hardlinks-global\"){let B=await li.checksumFile(y,{baseFs:t,algorithm:\"sha1\"});C.digest=B}}else if(h.isDirectory())C={kind:\"directory\"};else if(h.isSymbolicLink())C={kind:\"symlink\",symlinkTo:await t.readlinkPromise(y)};else throw new Error(`Unsupported file type (file: ${y}, mode: 0o${await t.statSync(y).mode.toString(8).padStart(6,\"0\")})`);if(f.set(p,C),h.isDirectory()&&p!==kr){let B=await o(p);for(let[v,D]of B)f.set(v,D)}}return f},a;if(n.value===\"hardlinks-global\"&&i&&s){let c=x.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await M.readFilePromise(c,\"utf8\"))))}catch{a=await o()}}else a=await o();let l=!1;for(let[c,u]of a){let g=x.join(e,c),f=x.join(r,c);if(u.kind===\"directory\")await M.mkdirPromise(f,{recursive:!0});else if(u.kind===\"file\"){let h=u.mtimeMs;await Nze({srcPath:g,dstPath:f,entry:u,nmMode:n,baseFs:t,globalHardlinksStore:i}),u.mtimeMs!==h&&(l=!0)}else u.kind===\"symlink\"&&await uM(x.resolve(x.dirname(f),u.symlinkTo),f)}if(n.value===\"hardlinks-global\"&&i&&l&&s){let c=x.join(i,s.substring(0,2),`${s.substring(2)}.json`);await M.removePromise(c),await Ole(i,c,Buffer.from(JSON.stringify(Object.fromEntries(a))))}};function Tze(r,e,t,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,C=x.join(c,u),y=new Set;if(u===kr||u.startsWith(\"@\")){let v;try{v=M.statSync(C)}catch{}p=!!v,v?v.mtimeMs>t?(a=!0,y=new Set(M.readdirSync(C))):y=new Set(g.children.get(u).children.keys()):a=!0;let D=e.get(c);if(D){let L=x.join(c,kr,ib),H;try{H=M.statSync(L)}catch{}if(!H)a=!0;else if(H.mtimeMs>t){a=!0;let j=new Set(M.readdirSync(L)),$=new Map;s.set(c,$);for(let[V,W]of D)j.has(V)&&$.set(V,W)}else s.set(c,D)}}else p=h.has(u);let B=g.children.get(u);if(p){let{linkType:v,locator:D}=B,L={children:new Map,linkType:v,locator:D};if(f.children.set(u,L),D){let H=Ie.getSetWithDefault(o,D);H.add(C),o.set(D,H)}for(let H of B.children.keys())l(C,H,B,L,y)}else B.locator&&i.storedBuildState.delete(P.parseLocator(B.locator).locatorHash)};for(let[c,u]of r){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=Ie.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(kr)&&l(c,kr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function Ule(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith(\"link:\")}async function Oze(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=Ule(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=x.join(l[0],f);f!==\"\"&&M.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=x.contains(t,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let C=x.join(a,U.toPortablePath(p));u.set(Kr(h),C)}for(let[h,p]of c.children){let C=x.join(a,h),y=o(C,C,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(x.join(a,f),l,h);for(let[C,y]of p)u.set(C,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var kle=(r,e)=>{if(!r||!e)return r===e;let t=P.parseLocator(r);P.isVirtualLocator(t)&&(t=P.devirtualizeLocator(t));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(t,i)};function gM(r){return x.join(r.get(\"globalFolder\"),\"store\")}async function Mze(r,e,{baseFs:t,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=x.join(i.cwd,kr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=Tze(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=Tle(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:V,dstDir:W,linkType:_,globalHardlinksStore:A,nmMode:Ae,packageChecksum:ge})=>{let re=(async()=>{try{_===\"SOFT\"?(await M.mkdirPromise(x.dirname(W),{recursive:!0}),await uM(x.resolve(V),W)):await Lze(W,V,{baseFs:t,globalHardlinksStore:A,nmMode:Ae,packageChecksum:ge})}catch(O){throw O.message=`While persisting ${V} -> ${W} ${O.message}`,O}finally{L.tick()}})().then(()=>h.splice(h.indexOf(re),1));h.push(re),h.length>Dle&&await Promise.race(h)},C=async(V,W,_)=>{let A=(async()=>{let Ae=async(ge,re,O)=>{try{O.innerLoop||await M.mkdirPromise(re,{recursive:!0});let F=await M.readdirPromise(ge,{withFileTypes:!0});for(let ue of F){if(!O.innerLoop&&ue.name===ib)continue;let pe=x.join(ge,ue.name),ke=x.join(re,ue.name);ue.isDirectory()?(ue.name!==kr||O&&O.innerLoop)&&(await M.mkdirPromise(ke,{recursive:!0}),await Ae(pe,ke,{...O,innerLoop:!0})):$.value===\"hardlinks-local\"||$.value===\"hardlinks-global\"?await M.linkPromise(pe,ke):await M.copyFilePromise(pe,ke,Fle.default.constants.COPYFILE_FICLONE)}}catch(F){throw O.innerLoop||(F.message=`While cloning ${ge} -> ${re} ${F.message}`),F}finally{O.innerLoop||L.tick()}};await Ae(V,W,_)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>Dle&&await Promise.race(h)},y=async(V,W,_)=>{if(_)for(let[A,Ae]of W.children){let ge=_.children.get(A);await y(x.join(V,A),Ae,ge)}else{W.children.has(kr)&&await sp(x.join(V,kr),{contentsOnly:!1});let A=x.basename(V)===kr&&f.has(x.join(x.dirname(V),x.sep));await sp(V,{contentsOnly:V===a,allowSymlink:A})}};for(let[V,W]of l){let _=f.get(V);for(let[A,Ae]of W.children){if(A===\".\")continue;let ge=_&&_.children.get(A),re=x.join(V,A);await y(re,Ae,ge)}}let B=async(V,W,_)=>{if(_){kle(W.locator,_.locator)||await sp(V,{contentsOnly:W.linkType===\"HARD\"});for(let[A,Ae]of W.children){let ge=_.children.get(A);await B(x.join(V,A),Ae,ge)}}else{W.children.has(kr)&&await sp(x.join(V,kr),{contentsOnly:!0});let A=x.basename(V)===kr&&f.has(x.join(x.dirname(V),x.sep));await sp(V,{contentsOnly:W.linkType===\"HARD\",allowSymlink:A})}};for(let[V,W]of f){let _=l.get(V);for(let[A,Ae]of W.children){if(A===\".\")continue;let ge=_&&_.children.get(A);await B(x.join(V,A),Ae,ge)}}let v=new Map,D=[];for(let[V,W]of u)for(let _ of W){let{locationRoot:A,segments:Ae}=sb(_,{skipPrefix:i.cwd}),ge=f.get(A),re=A;if(ge){for(let O of Ae)if(re=x.join(re,O),ge=ge.children.get(O),!ge)break;if(ge){let O=kle(ge.locator,V),F=e.get(ge.locator),ue=F.target,pe=re,ke=F.linkType;if(O)v.has(ue)||v.set(ue,pe);else if(ue!==pe){let Fe=P.parseLocator(ge.locator);P.isVirtualLocator(Fe)&&(Fe=P.devirtualizeLocator(Fe)),D.push({srcDir:ue,dstDir:pe,linkType:ke,realLocatorHash:Fe.locatorHash})}}}}for(let[V,{locations:W}]of e.entries())for(let _ of W){let{locationRoot:A,segments:Ae}=sb(_,{skipPrefix:i.cwd}),ge=l.get(A),re=f.get(A),O=A,F=e.get(V),ue=P.parseLocator(V);P.isVirtualLocator(ue)&&(ue=P.devirtualizeLocator(ue));let pe=ue.locatorHash,ke=F.target,Fe=_;if(ke===Fe)continue;let Ne=F.linkType;for(let oe of Ae)re=re.children.get(oe);if(!ge)D.push({srcDir:ke,dstDir:Fe,linkType:Ne,realLocatorHash:pe});else for(let oe of Ae)if(O=x.join(O,oe),ge=ge.children.get(oe),!ge){D.push({srcDir:ke,dstDir:Fe,linkType:Ne,realLocatorHash:pe});break}}let L=vi.progressViaCounter(D.length),H=n.reportProgress(L),j=i.configuration.get(\"nmMode\"),$={value:j};try{let V=$.value===\"hardlinks-global\"?`${gM(i.configuration)}/v1`:null;if(V&&!await M.existsPromise(V)){await M.mkdirpPromise(V);for(let _=0;_<256;_++)await M.mkdirPromise(x.join(V,_.toString(16).padStart(2,\"0\")))}for(let _ of D)(_.linkType===\"SOFT\"||!v.has(_.srcDir))&&(v.set(_.srcDir,_.dstDir),await p({..._,globalHardlinksStore:V,nmMode:$,packageChecksum:o.get(_.realLocatorHash)||null}));await Promise.all(h),h.length=0;for(let _ of D){let A=v.get(_.srcDir);_.linkType!==\"SOFT\"&&_.dstDir!==A&&await C(A,_.dstDir,{nmMode:$})}await Promise.all(h),await M.mkdirPromise(a,{recursive:!0});let W=await Oze(e,f,i.cwd,{loadManifest:s});await Uze(c,W,i.cwd),await Fze(i,e,W,$,{installChangedByUser:g}),j==\"hardlinks-global\"&&$.value==\"hardlinks-local\"&&n.reportWarningOnce(74,\"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices\")}finally{H.stop()}}async function Uze(r,e,t){for(let i of r.keys()){if(x.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=x.join(i,kr,ib);await M.removePromise(n)}}for(let[i,n]of e){if(x.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=x.join(i,kr,ib),o=r.get(i)||new Map;await M.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await M.removePromise(x.join(s,a)),process.platform===\"win32\"&&await M.removePromise(x.join(s,Kr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=x.join(s,a);c!==l&&(process.platform===\"win32\"?await(0,Rle.default)(U.fromPortablePath(l),U.fromPortablePath(u),{createPwshFile:!1}):(await M.removePromise(u),await uM(l,u),x.contains(t,await M.realpathPromise(l))!==null&&await M.chmodPromise(l,493)))}}}var ob=class extends wl{constructor(){super(...arguments);this.mode=\"loose\"}makeInstaller(t){return new fM(t)}},fM=class extends Yu{constructor(){super(...arguments);this.mode=\"loose\"}async transformPnpSettings(t){let i=new Br({baseFs:new Mn({libzip:await on(),maxOpenFiles:80,readOnlyArchives:!0})}),n=dle(t,this.opts.project.cwd,i),{tree:s,errors:o}=rE(n,{pnpifyFs:!1,project:this.opts.project});if(!s){for(let{messageName:g,text:f}of o)this.opts.report.reportError(g,f);return}let a=new Map;t.fallbackPool=a;let l=(g,f)=>{let h=P.parseLocator(f.locator),p=P.stringifyIdent(h);p===g?a.set(g,h.reference):a.set(g,[p,h.reference])},c=x.join(this.opts.project.cwd,xt.nodeModules),u=s.get(c);if(!(typeof u>\"u\")){if(\"target\"in u)throw new Error(\"Assertion failed: Expected the root junction point to be a directory\");for(let g of u.dirList){let f=x.join(c,g),h=s.get(f);if(typeof h>\"u\")throw new Error(\"Assertion failed: Expected the child to have been registered\");if(\"target\"in h)l(g,h);else for(let p of h.dirList){let C=x.join(f,p),y=s.get(C);if(typeof y>\"u\")throw new Error(\"Assertion failed: Expected the subchild to have been registered\");if(\"target\"in y)l(`${g}/${p}`,y);else throw new Error(\"Assertion failed: Expected the leaf junction to be a package\")}}}}};var Kze={hooks:{cleanGlobalArtifacts:async r=>{let e=gM(r);await M.removePromise(e)}},configuration:{nmHoistingLimits:{description:\"Prevent packages to be hoisted past specific levels\",type:\"STRING\",values:[\"workspaces\",\"dependencies\",\"none\"],default:\"none\"},nmMode:{description:'If set to \"hardlinks-local\" Yarn will utilize hardlinks to reduce disk space consumption inside \"node_modules\" directories. With \"hardlinks-global\" Yarn will use global content addressable storage to reduce \"node_modules\" size across all the projects using this option.',type:\"STRING\",values:[\"classic\",\"hardlinks-local\",\"hardlinks-global\"],default:\"classic\"},nmSelfReferences:{description:\"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created\",type:\"BOOLEAN\",default:!0}},linkers:[nb,ob]},Hze=Kze;var u1={};ut(u1,{default:()=>VVe,npmConfigUtils:()=>or,npmHttpUtils:()=>Mt,npmPublishUtils:()=>Cp});var qle=Pe(Xr());var gr=\"npm:\";var Mt={};ut(Mt,{AuthType:()=>jle,customPackageError:()=>Yze,del:()=>Jze,get:()=>mo,getIdentUrl:()=>bl,handleInvalidAuthenticationError:()=>Ql,post:()=>jze,put:()=>qze});var CM=Pe(Um()),Yle=J(\"url\");var or={};ut(or,{RegistryType:()=>Kle,getAuditRegistry:()=>Gze,getAuthConfiguration:()=>dM,getDefaultRegistry:()=>ab,getPublishRegistry:()=>Hle,getRegistryConfiguration:()=>Gle,getScopeConfiguration:()=>pM,getScopeRegistry:()=>gA,normalizeRegistry:()=>Co});var Kle=(i=>(i.AUDIT_REGISTRY=\"npmAuditRegistry\",i.FETCH_REGISTRY=\"npmRegistryServer\",i.PUBLISH_REGISTRY=\"npmPublishRegistry\",i))(Kle||{});function Co(r){return r.replace(/\\/$/,\"\")}function Gze(r,{configuration:e}){let t=e.get(\"npmAuditRegistry\");return t!==null?Co(t):Hle(r,{configuration:e})}function Hle(r,{configuration:e}){var t;return(t=r.publishConfig)!=null&&t.registry?Co(r.publishConfig.registry):r.name?gA(r.name.scope,{configuration:e,type:\"npmPublishRegistry\"}):ab({configuration:e,type:\"npmPublishRegistry\"})}function gA(r,{configuration:e,type:t=\"npmRegistryServer\"}){let i=pM(r,{configuration:e});if(i===null)return ab({configuration:e,type:t});let n=i.get(t);return n===null?ab({configuration:e,type:t}):Co(n)}function ab({configuration:r,type:e=\"npmRegistryServer\"}){let t=r.get(e);return Co(t!==null?t:r.get(\"npmRegistryServer\"))}function Gle(r,{configuration:e}){let t=e.get(\"npmRegistries\"),i=Co(r),n=t.get(i);if(typeof n<\"u\")return n;let s=t.get(i.replace(/^[a-z]+:/,\"\"));return typeof s<\"u\"?s:null}function pM(r,{configuration:e}){if(r===null)return null;let i=e.get(\"npmScopes\").get(r);return i||null}function dM(r,{configuration:e,ident:t}){let i=t&&pM(t.scope,{configuration:e});return(i==null?void 0:i.get(\"npmAuthIdent\"))||(i==null?void 0:i.get(\"npmAuthToken\"))?i:Gle(r,{configuration:e})||e}var jle=(n=>(n[n.NO_AUTH=0]=\"NO_AUTH\",n[n.BEST_EFFORT=1]=\"BEST_EFFORT\",n[n.CONFIGURATION=2]=\"CONFIGURATION\",n[n.ALWAYS_AUTH=3]=\"ALWAYS_AUTH\",n))(jle||{});async function Ql(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(lb(r))throw new at(41,\"Invalid OTP token\");if(((s=r.originalError)==null?void 0:s.name)===\"HTTPError\"&&((o=r.originalError)==null?void 0:o.response.statusCode)===401)throw new at(41,`Invalid authentication (${typeof e!=\"string\"?`as ${await zze(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function Yze(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?\"Package not found\":null}function bl(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function mo(r,{configuration:e,headers:t,ident:i,authType:n,registry:s,...o}){if(i&&typeof s>\"u\"&&(s=gA(i.scope,{configuration:e})),i&&i.scope&&typeof n>\"u\"&&(n=1),typeof s!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let a=await Ab(s,{authType:n,configuration:e,ident:i});a&&(t={...t,authorization:a});try{return await Xt.get(r.charAt(0)===\"/\"?`${s}${r}`:r,{configuration:e,headers:t,...o})}catch(l){throw await Ql(l,{registry:s,configuration:e,headers:t}),l}}async function jze(r,e,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l,...c}){if(s&&typeof a>\"u\"&&(a=gA(s.scope,{configuration:i})),typeof a!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let u=await Ab(a,{authType:o,configuration:i,ident:s});u&&(n={...n,authorization:u}),l&&(n={...n,...op(l)});try{return await Xt.post(a+r,e,{configuration:i,headers:n,...c})}catch(g){if(!lb(g)||l)throw await Ql(g,{attemptedAs:t,registry:a,configuration:i,headers:n}),g;l=await mM(g,{configuration:i});let f={...n,...op(l)};try{return await Xt.post(`${a}${r}`,e,{configuration:i,headers:f,...c})}catch(h){throw await Ql(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h}}}async function qze(r,e,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l,...c}){if(s&&typeof a>\"u\"&&(a=gA(s.scope,{configuration:i})),typeof a!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let u=await Ab(a,{authType:o,configuration:i,ident:s});u&&(n={...n,authorization:u}),l&&(n={...n,...op(l)});try{return await Xt.put(a+r,e,{configuration:i,headers:n,...c})}catch(g){if(!lb(g))throw await Ql(g,{attemptedAs:t,registry:a,configuration:i,headers:n}),g;l=await mM(g,{configuration:i});let f={...n,...op(l)};try{return await Xt.put(`${a}${r}`,e,{configuration:i,headers:f,...c})}catch(h){throw await Ql(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h}}}async function Jze(r,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a,...l}){if(n&&typeof o>\"u\"&&(o=gA(n.scope,{configuration:t})),typeof o!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let c=await Ab(o,{authType:s,configuration:t,ident:n});c&&(i={...i,authorization:c}),a&&(i={...i,...op(a)});try{return await Xt.del(o+r,{configuration:t,headers:i,...l})}catch(u){if(!lb(u)||a)throw await Ql(u,{attemptedAs:e,registry:o,configuration:t,headers:i}),u;a=await mM(u,{configuration:t});let g={...i,...op(a)};try{return await Xt.del(`${o}${r}`,{configuration:t,headers:g,...l})}catch(f){throw await Ql(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f}}}async function Ab(r,{authType:e=2,configuration:t,ident:i}){let n=dM(r,{configuration:t,ident:i}),s=Wze(n,e);if(!s)return null;let o=await t.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,r,{configuration:t,ident:i});if(o)return o;if(n.get(\"npmAuthToken\"))return`Bearer ${n.get(\"npmAuthToken\")}`;if(n.get(\"npmAuthIdent\")){let a=n.get(\"npmAuthIdent\");return a.includes(\":\")?`Basic ${Buffer.from(a).toString(\"base64\")}`:`Basic ${a}`}if(s&&e!==1)throw new at(33,\"No authentication configured for request\");return null}function Wze(r,e){switch(e){case 2:return r.get(\"npmAlwaysAuth\");case 1:case 3:return!0;case 0:return!1;default:throw new Error(\"Unreachable\")}}async function zze(r,e,{configuration:t}){var i;if(typeof e>\"u\"||typeof e.authorization>\"u\")return\"an anonymous user\";try{return(i=(await Xt.get(new Yle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:\"an unknown user\"}catch{return\"an unknown user\"}}async function mM(r,{configuration:e}){var n;let t=(n=r.originalError)==null?void 0:n.response.headers[\"npm-notice\"];if(t&&(await Ge.start({configuration:e,stdout:process.stdout,includeFooter:!1},async s=>{if(s.reportInfo(0,t.replace(/(https?:\\/\\/\\S+)/g,ee.pretty(e,\"$1\",ee.Type.URL))),!process.env.YARN_IS_TEST_ENV){let o=t.match(/open (https?:\\/\\/\\S+)/i);if(o&&ws.openUrl){let{openNow:a}=await(0,CM.prompt)({type:\"confirm\",name:\"openNow\",message:\"Do you want to try to open this url now?\",required:!0,initial:!0,onCancel:()=>process.exit(130)});a&&(await ws.openUrl(o[1])||(s.reportSeparator(),s.reportWarning(0,\"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.\")))}}}),process.stdout.write(`\n`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||\"\";let{otp:i}=await(0,CM.prompt)({type:\"password\",name:\"otp\",message:\"One-time password:\",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(`\n`),i}function lb(r){var e,t;if(((e=r.originalError)==null?void 0:e.name)!==\"HTTPError\")return!1;try{return((t=r.originalError)==null?void 0:t.response.headers[\"www-authenticate\"].split(/,\\s*/).map(n=>n.toLowerCase())).includes(\"otp\")}catch{return!1}}function op(r){return{[\"npm-otp\"]:r}}var cb=class{supports(e,t){if(!e.reference.startsWith(gr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!qle.default.valid(i)||n===null||typeof n.__archiveUrl!=\"string\")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!=\"string\")throw new Error(\"Assertion failed: The archiveUrl querystring parameter should have been available\");let n=await mo(i.__archiveUrl,{configuration:t.project.configuration,ident:e});return await mi.convertToZip(n,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var ub=class{supportsDescriptor(e,t){return!(!e.range.startsWith(gr)||!P.tryParseDescriptor(e.range.slice(gr.length),!0))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error(\"Unreachable\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){let i=P.parseDescriptor(e.range.slice(gr.length),!0);return t.resolver.getResolutionDependencies(i,t)}async getCandidates(e,t,i){let n=P.parseDescriptor(e.range.slice(gr.length),!0);return await i.resolver.getCandidates(n,t,i)}async getSatisfying(e,t,i){let n=P.parseDescriptor(e.range.slice(gr.length),!0);return i.resolver.getSatisfying(n,t,i)}resolve(e,t){throw new Error(\"Unreachable\")}};var Jle=Pe(Xr()),Wle=J(\"url\");var Ts=class{supports(e,t){if(!e.reference.startsWith(gr))return!1;let i=new Wle.URL(e.reference);return!(!Jle.default.valid(i.pathname)||i.searchParams.has(\"__archiveUrl\"))}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i;try{i=await mo(Ts.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch{i=await mo(Ts.getLocatorUrl(e).replace(/%2f/g,\"/\"),{configuration:t.project.configuration,ident:e})}return await mi.convertToZip(i,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:i}){let n=gA(e.scope,{configuration:i}),s=Ts.getLocatorUrl(e);return t=t.replace(/^https?:(\\/\\/(?:[^/]+\\.)?npmjs.org(?:$|\\/))/,\"https:$1\"),n=n.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),t=t.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),t===n+s||t===n+s.replace(/%2f/g,\"/\")}static getLocatorUrl(e){let t=vt.clean(e.reference.slice(gr.length));if(t===null)throw new at(10,\"The npm semver resolver got selected, but the version isn't semver\");return`${bl(e)}/-/${e.name}-${t}.tgz`}};var zle=Pe(Xr());var gb=P.makeIdent(null,\"node-gyp\"),Vze=/\\b(node-gyp|prebuild-install)\\b/,fb=class{supportsDescriptor(e,t){return e.range.startsWith(gr)?!!vt.validRange(e.range.slice(gr.length)):!1}supportsLocator(e,t){if(!e.reference.startsWith(gr))return!1;let{selector:i}=P.parseRange(e.reference);return!!zle.default.valid(i)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=vt.validRange(e.range.slice(gr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(gr.length)}`);let s=await mo(bl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=Ie.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new vt.SemVer(c);if(n.test(u))return u}catch{}return Ie.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${gr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Ts.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,t,i){let n=vt.validRange(e.range.slice(gr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(gr.length)}`);return Ie.mapAndFilter(t,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:gr}),a=new vt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return Ie.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,t){let{selector:i}=P.parseRange(e.reference),n=vt.clean(i);if(n===null)throw new at(10,\"The npm semver resolver got selected, but the version isn't semver\");let s=await mo(bl(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,\"versions\"))throw new at(15,'Registry returned invalid data for - missing \"versions\" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new at(16,`Registry failed to return reference \"${n}\"`);let o=new ot;if(o.load(s.versions[n]),!o.dependencies.has(gb.identHash)&&!o.peerDependencies.has(gb.identHash)){for(let a of o.scripts.values())if(a.match(Vze)){o.dependencies.set(gb.identHash,P.makeDescriptor(gb,\"latest\")),t.report.reportWarningOnce(32,`${P.prettyLocator(t.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated==\"string\"&&o.raw.deprecated!==\"\"){let a=P.prettyLocator(t.project.configuration,e),l=o.raw.deprecated.match(/\\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;t.report.reportWarningOnce(61,l)}return{...e,version:n,languageName:\"node\",linkType:\"HARD\",conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin}}};var hb=class{supportsDescriptor(e,t){return!(!e.range.startsWith(gr)||!Rf.test(e.range.slice(gr.length)))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error(\"Unreachable\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(gr.length),s=await mo(bl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,\"dist-tags\"))throw new at(15,'Registry returned invalid data - missing \"dist-tags\" field');let o=s[\"dist-tags\"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new at(16,`Registry failed to return tag \"${n}\"`);let a=o[n],l=P.makeLocator(e,`${gr}${a}`),c=s.versions[a].dist.tarball;return Ts.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error(\"Unreachable\")}};var Cp={};ut(Cp,{getGitHead:()=>WVe,makePublishBody:()=>JVe});var o1={};ut(o1,{default:()=>xVe,packUtils:()=>la});var la={};ut(la,{genPackList:()=>Ob,genPackStream:()=>s1,genPackageManifest:()=>bue,hasPackScripts:()=>i1,prepareForPack:()=>n1});var r1=Pe(wn()),Bue=Pe(Eue()),Que=J(\"zlib\"),CVe=[\"/package.json\",\"/readme\",\"/readme.*\",\"/license\",\"/license.*\",\"/licence\",\"/licence.*\",\"/changelog\",\"/changelog.*\"],mVe=[\"/package.tgz\",\".github\",\".git\",\".hg\",\"node_modules\",\".npmignore\",\".gitignore\",\".#*\",\".DS_Store\"];async function i1(r){return!!(Wt.hasWorkspaceScript(r,\"prepack\")||Wt.hasWorkspaceScript(r,\"postpack\"))}async function n1(r,{report:e},t){await Wt.maybeExecuteWorkspaceLifecycleScript(r,\"prepack\",{report:e});try{let i=x.join(r.cwd,ot.fileName);await M.existsPromise(i)&&await r.manifest.loadFile(i,{baseFs:M}),await t()}finally{await Wt.maybeExecuteWorkspaceLifecycleScript(r,\"postpack\",{report:e})}}async function s1(r,e){var s,o;typeof e>\"u\"&&(e=await Ob(r));let t=new Set;for(let a of(o=(s=r.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)t.add(x.normalize(a));for(let a of r.manifest.bin.values())t.add(x.normalize(a));let i=Bue.default.pack();process.nextTick(async()=>{for(let a of e){let l=x.normalize(a),c=x.resolve(r.cwd,l),u=x.join(\"package\",l),g=await M.lstatPromise(c),f={name:u,mtime:new Date(xr.SAFE_TIME*1e3)},h=t.has(l)?493:420,p,C,y=new Promise((v,D)=>{p=v,C=D}),B=v=>{v?C(v):p()};if(g.isFile()){let v;l===\"package.json\"?v=Buffer.from(JSON.stringify(await bue(r),null,2)):v=await M.readFilePromise(c),i.entry({...f,mode:h,type:\"file\"},v,B)}else g.isSymbolicLink()?i.entry({...f,mode:h,type:\"symlink\",linkname:await M.readlinkPromise(c)},B):B(new Error(`Unsupported file type ${g.mode} for ${U.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Que.createGzip)();return i.pipe(n),n}async function bue(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function Ob(r){var g,f,h,p,C,y,B,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let D of mVe)i.reject.push(D);for(let D of CVe)i.accept.push(D);i.reject.push(t.get(\"rcFilename\"));let n=D=>{if(D===null||!D.startsWith(`${r.cwd}/`))return;let L=x.relative(r.cwd,D),H=x.resolve(Oe.root,L);i.reject.push(H)};n(x.resolve(e.cwd,t.get(\"lockfileFilename\"))),n(t.get(\"cacheFolder\")),n(t.get(\"globalFolder\")),n(t.get(\"installStatePath\")),n(t.get(\"virtualFolder\")),n(t.get(\"yarnPath\")),await t.triggerHook(D=>D.populateYarnPaths,e,D=>{n(D)});for(let D of e.workspaces){let L=x.relative(r.cwd,D.cwd);L!==\"\"&&!L.match(/^(\\.\\.)?\\//)&&i.reject.push(`/${L}`)}let s={accept:[],reject:[]},o=(f=(g=r.manifest.publishConfig)==null?void 0:g.main)!=null?f:r.manifest.main,a=(p=(h=r.manifest.publishConfig)==null?void 0:h.module)!=null?p:r.manifest.module,l=(y=(C=r.manifest.publishConfig)==null?void 0:C.browser)!=null?y:r.manifest.browser,c=(v=(B=r.manifest.publishConfig)==null?void 0:B.bin)!=null?v:r.manifest.bin;o!=null&&s.accept.push(x.resolve(Oe.root,o)),a!=null&&s.accept.push(x.resolve(Oe.root,a)),typeof l==\"string\"&&s.accept.push(x.resolve(Oe.root,l));for(let D of c.values())s.accept.push(x.resolve(Oe.root,D));if(l instanceof Map)for(let[D,L]of l.entries())s.accept.push(x.resolve(Oe.root,D)),typeof L==\"string\"&&s.accept.push(x.resolve(Oe.root,L));let u=r.manifest.files!==null;if(u){s.reject.push(\"/*\");for(let D of r.manifest.files)Sue(s.accept,D,{cwd:Oe.root})}return await EVe(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function EVe(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new So(r),o=[[Oe.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!yue(a,{globalList:t,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Oe.root)for(let C of u)g=g||C===\".gitignore\",f=f||C===\".npmignore\";let h=f?await Iue(s,a,\".npmignore\"):g?await Iue(s,a,\".gitignore\"):null,p=h!==null?[h].concat(l):l;yue(a,{globalList:t,ignoreLists:l})&&(p=[...l,{accept:[],reject:[\"**/*\"]}]);for(let C of u)o.push([x.resolve(a,C),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(x.relative(Oe.root,a))}return n.sort()}async function Iue(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(x.join(e,t),\"utf8\");for(let s of n.split(/\\n/g))Sue(i.reject,s,{cwd:e});return i}function IVe(r,{cwd:e}){let t=r[0]===\"!\";return t&&(r=r.slice(1)),r.match(/\\.{0,1}\\//)&&(r=x.resolve(e,r)),t&&(r=`!${r}`),r}function Sue(r,e,{cwd:t}){let i=e.trim();i===\"\"||i[0]===\"#\"||r.push(IVe(i,{cwd:t}))}function yue(r,{globalList:e,ignoreLists:t}){let i=Tb(r,e.accept);if(i!==0)return i===2;let n=Tb(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=Tb(r,s.accept);if(o!==0)return o===2;let a=Tb(r,s.reject);if(a!==0)return a===1}return!1}function Tb(r,e){let t=e,i=[];for(let n=0;n<e.length;++n)e[n][0]!==\"!\"?t!==e&&t.push(e[n]):(t===e&&(t=e.slice(0,n)),i.push(e[n].slice(1)));return wue(r,i)?2:wue(r,t)?1:0}function wue(r,e){let t=e,i=[];for(let n=0;n<e.length;++n)e[n].includes(\"/\")?t!==e&&t.push(e[n]):(t===e&&(t=e.slice(0,n)),i.push(e[n]));return!!(r1.default.isMatch(r,t,{dot:!0,nocase:!0})||r1.default.isMatch(r,i,{dot:!0,basename:!0,nocase:!0}))}var Vu=class extends De{constructor(){super(...arguments);this.installIfNeeded=z.Boolean(\"--install-if-needed\",!1,{description:\"Run a preliminary `yarn install` if the package contains build scripts\"});this.dryRun=z.Boolean(\"-n,--dry-run\",!1,{description:\"Print the file paths without actually generating the package archive\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.out=z.String(\"-o,--out\",{description:\"Create the archive at the specified path\"});this.filename=z.String(\"--filename\",{hidden:!0})}async execute(){var l;let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i1(n)&&(this.installIfNeeded?await i.install({cache:await Rt.find(t),report:new ti}):await i.restoreInstallState());let s=(l=this.out)!=null?l:this.filename,o=typeof s<\"u\"?x.resolve(this.context.cwd,yVe(s,{workspace:n})):x.resolve(n.cwd,\"package.tgz\");return(await Ge.start({configuration:t,stdout:this.context.stdout,json:this.json},async c=>{await n1(n,{report:c},async()=>{c.reportJson({base:U.fromPortablePath(n.cwd)});let u=await Ob(n);for(let g of u)c.reportInfo(null,U.fromPortablePath(g)),c.reportJson({location:U.fromPortablePath(g)});if(!this.dryRun){let g=await s1(n,u),f=M.createWriteStream(o);g.pipe(f),await new Promise(h=>{f.on(\"finish\",h)})}}),this.dryRun||(c.reportInfo(0,`Package archive generated in ${ee.pretty(t,o,ee.Type.PATH)}`),c.reportJson({output:U.fromPortablePath(o)}))})).exitCode()}};Vu.paths=[[\"pack\"]],Vu.usage=ve.Usage({description:\"generate a tarball from the active workspace\",details:\"\\n      This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\\n\\n      If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\\n    \",examples:[[\"Create an archive from the active workspace\",\"yarn pack\"],[\"List the files that would be made part of the workspace's archive\",\"yarn pack --dry-run\"],[\"Name and output the archive in a dedicated folder\",\"yarn pack --out /artifacts/%s-%v.tgz\"]]});function yVe(r,{workspace:e}){let t=r.replace(\"%s\",wVe(e)).replace(\"%v\",BVe(e));return U.toPortablePath(t)}function wVe(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):\"package\"}function BVe(r){return r.manifest.version!==null?r.manifest.version:\"unknown\"}var QVe=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],bVe=\"workspace:\",SVe=(r,e)=>{var i,n;e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let t=r.project;for(let s of QVe)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===bVe)if(a===null){if(t.tryWorkspaceByIdent(o)===null)throw new at(21,`${P.prettyDescriptor(t.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector===\"*\"?c=(i=a.manifest.version)!=null?i:\"0.0.0\":l.selector===\"~\"||l.selector===\"^\"?c=`${l.selector}${(n=a.manifest.version)!=null?n:\"0.0.0\"}`:c=l.selector;let u=s===\"dependencies\"?P.makeDescriptor(o,\"unknown\"):null,g=u!==null&&r.manifest.ensureDependencyMeta(u).optional?\"optionalDependencies\":s;e[g][P.stringifyIdent(o)]=c}}},vVe={hooks:{beforeWorkspacePacking:SVe},commands:[Vu]},xVe=vVe;var Lue=J(\"crypto\"),Tue=Pe(Nue()),Oue=J(\"url\");async function JVe(r,e,{access:t,tag:i,registry:n,gitHead:s}){let o=r.project.configuration,a=r.manifest.name,l=r.manifest.version,c=P.stringifyIdent(a),u=(0,Lue.createHash)(\"sha1\").update(e).digest(\"hex\"),g=Tue.default.fromData(e).toString();typeof t>\"u\"&&(r.manifest.publishConfig&&typeof r.manifest.publishConfig.access==\"string\"?t=r.manifest.publishConfig.access:o.get(\"npmPublishAccess\")!==null?t=o.get(\"npmPublishAccess\"):a.scope?t=\"restricted\":t=\"public\");let f=await la.genPackageManifest(r),h=`${c}-${l}.tgz`,p=new Oue.URL(`${Co(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:\"application/octet-stream\",data:e.toString(\"base64\"),length:e.length}},name:c,access:t,[\"dist-tags\"]:{[i]:l},versions:{[l]:{...f,_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}}}}}async function WVe(r){try{let{stdout:e}=await Cr.execvp(\"git\",[\"rev-parse\",\"--revs-only\",\"HEAD\"],{cwd:r});return e.trim()===\"\"?void 0:e.trim()}catch{return}}var c1={npmAlwaysAuth:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"BOOLEAN\",default:!1},npmAuthIdent:{description:\"Authentication identity for the npm registry (_auth in npm and yarn v1)\",type:\"SECRET\",default:null},npmAuthToken:{description:\"Authentication token for the npm registry (_authToken in npm and yarn v1)\",type:\"SECRET\",default:null}},Mue={npmAuditRegistry:{description:\"Registry to query for audit reports\",type:\"STRING\",default:null},npmPublishRegistry:{description:\"Registry to push packages to\",type:\"STRING\",default:null},npmRegistryServer:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"STRING\",default:\"https://registry.yarnpkg.com\"}},zVe={configuration:{...c1,...Mue,npmScopes:{description:\"Settings per package scope\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...c1,...Mue}}},npmRegistries:{description:\"Settings per registry\",type:\"MAP\",normalizeKeys:Co,valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...c1}}}},fetchers:[cb,Ts],resolvers:[ub,fb,hb]},VVe=zVe;var p1={};ut(p1,{default:()=>s9e});var kE=Pe(wn());ls();var Mb=(i=>(i.All=\"all\",i.Production=\"production\",i.Development=\"development\",i))(Mb||{}),Ub=(s=>(s.Info=\"info\",s.Low=\"low\",s.Moderate=\"moderate\",s.High=\"high\",s.Critical=\"critical\",s))(Ub||{});var DE=[\"info\",\"low\",\"moderate\",\"high\",\"critical\"];function Kue(r,e){let t=[],i=new Set,n=o=>{i.has(o)||(i.add(o),t.push(o))};for(let o of e)n(o);let s=new Set;for(;t.length>0;){let o=t.shift(),a=r.storedResolutions.get(o);if(typeof a>\"u\")throw new Error(\"Assertion failed: Expected the resolution to have been registered\");let l=r.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function XVe(r,e){return new Set([...r].filter(t=>!e.has(t)))}function ZVe(r,e,{all:t}){let i=t?r.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=Kue(r,l),g=Kue(r,c);return XVe(g,u)}function Hue(r){let e={};for(let t of r)e[P.stringifyIdent(t)]=P.parseRange(t.range).selector;return e}function Gue(r){if(typeof r>\"u\")return new Set(DE);let e=DE.indexOf(r),t=DE.slice(e);return new Set(t)}function _Ve(r,e){let t=Gue(e),i={};for(let n of t)i[n]=r[n];return i}function Yue(r,e){var i;let t=_Ve(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function jue(r,e){var s;let t={},i={children:t},n=Object.values(r.advisories);if(e!=null){let o=Gue(e);n=n.filter(a=>o.has(a.severity))}for(let o of Ie.sortMap(n,a=>a.module_name))t[o.module_name]={label:o.module_name,value:ee.tuple(ee.Type.RANGE,o.findings.map(a=>a.version).join(\", \")),children:{ID:{label:\"ID\",value:ee.tuple(ee.Type.NUMBER,o.id)},Issue:{label:\"Issue\",value:ee.tuple(ee.Type.NO_HINT,o.title)},URL:{label:\"URL\",value:ee.tuple(ee.Type.URL,o.url)},Severity:{label:\"Severity\",value:ee.tuple(ee.Type.NO_HINT,o.severity)},[\"Vulnerable Versions\"]:{label:\"Vulnerable Versions\",value:ee.tuple(ee.Type.RANGE,o.vulnerable_versions)},[\"Patched Versions\"]:{label:\"Patched Versions\",value:ee.tuple(ee.Type.RANGE,o.patched_versions)},Via:{label:\"Via\",value:ee.tuple(ee.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(\">\")[0]))).join(\", \"))},Recommendation:{label:\"Recommendation\",value:ee.tuple(ee.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\\n/g,\" \"))}}};return i}function que(r,e,{all:t,environment:i}){let n=t?r.workspaces:[e],s=[\"all\",\"production\"].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[\"all\",\"development\"].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return Hue([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function Jue(r,e,{all:t}){var s;let i=ZVe(r,e,{all:t}),n={};for(let o of r.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:\"0.0.0\",integrity:o.identHash,requires:Hue(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var _u=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Audit dependencies from all workspaces\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Audit transitive dependencies as well\"});this.environment=z.String(\"--environment\",\"all\",{description:\"Which environments to cover\",validator:Xi(Mb)});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.severity=z.String(\"--severity\",\"info\",{description:\"Minimal severity requested for packages to be displayed\",validator:Xi(Ub)});this.excludes=z.Array(\"--exclude\",[],{description:\"Array of glob patterns of packages to exclude from audit\"});this.ignores=z.Array(\"--ignore\",[],{description:\"Array of glob patterns of advisory ID's to ignore in the audit report\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let s=que(i,n,{all:this.all,environment:this.environment}),o=Jue(i,n,{all:this.all});if(!this.recursive)for(let C of Object.keys(o))Object.prototype.hasOwnProperty.call(s,C)?o[C].requires={}:delete o[C];let a=Array.from(new Set([...t.get(\"npmAuditExcludePackages\"),...this.excludes]));if(a){for(let C of Object.keys(s))kE.default.isMatch(C,a)&&delete s[C];for(let C of Object.keys(o))kE.default.isMatch(C,a)&&delete o[C];for(let C of Object.keys(o))for(let y of Object.keys(o[C].requires))kE.default.isMatch(y,a)&&delete o[C].requires[y]}let l={requires:s,dependencies:o},c=or.getAuditRegistry(n.manifest,{configuration:t}),u,g=await ra.start({configuration:t,stdout:this.context.stdout},async()=>{u=await Mt.post(\"/-/npm/v1/security/audits/quick\",l,{authType:Mt.AuthType.BEST_EFFORT,configuration:t,jsonResponse:!0,registry:c})});if(g.hasErrors())return g.exitCode();let f=Array.from(new Set([...t.get(\"npmAuditIgnoreAdvisories\"),...this.ignores]));if(f){for(let C of Object.keys(u.advisories))if(kE.default.isMatch(C,f)){let y=u.advisories[C],B=0;y.findings.forEach(v=>B+=v.paths.length),u.metadata.vulnerabilities[y.severity]-=B,delete u.advisories[C]}}let h=Yue(u.metadata.vulnerabilities,this.severity);return!this.json&&h?($n.emitTree(jue(u,this.severity),{configuration:t,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Ge.start({configuration:t,includeFooter:!1,json:this.json,stdout:this.context.stdout},async C=>{C.reportJson(u),h||C.reportInfo(1,\"No audit suggestions\")})).exitCode()}};_u.paths=[[\"npm\",\"audit\"]],_u.usage=ve.Usage({description:\"perform a vulnerability audit against the installed packages\",details:`\n      This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths).\n\n      For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \\`-A,--all\\`. To extend this search to both direct and transitive dependencies, use \\`-R,--recursive\\`.\n\n      Applying the \\`--severity\\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${DE.map(t=>`\\`${t}\\``).join(\", \")}.\n\n      If the \\`--json\\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages.\n\n      If certain packages produce false positives for a particular environment, the \\`--exclude\\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \\`npmAuditExcludePackages\\` option.\n\n      If particular advisories are needed to be ignored, the \\`--ignore\\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \\`npmAuditIgnoreAdvisories\\` option.\n\n      To understand the dependency tree requiring vulnerable packages, check the raw report with the \\`--json\\` flag or use \\`yarn why <package>\\` to get more information as to who depends on them.\n    `,examples:[[\"Checks for known security issues with the installed packages. The output is a list of known issues.\",\"yarn npm audit\"],[\"Audit dependencies in all workspaces\",\"yarn npm audit --all\"],[\"Limit auditing to `dependencies` (excludes `devDependencies`)\",\"yarn npm audit --environment production\"],[\"Show audit report as valid JSON\",\"yarn npm audit --json\"],[\"Audit all direct and transitive dependencies\",\"yarn npm audit --recursive\"],[\"Output moderate (or more severe) vulnerabilities\",\"yarn npm audit --severity moderate\"],[\"Exclude certain packages\",\"yarn npm audit --exclude package1 --exclude package2\"],[\"Ignore specific advisories\",\"yarn npm audit --ignore 1234567 --ignore 7654321\"]]});var g1=Pe(Xr()),f1=J(\"util\"),$u=class extends De{constructor(){super(...arguments);this.fields=z.String(\"-f,--fields\",{description:\"A comma-separated list of manifest fields that should be displayed\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.packages=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd),n=typeof this.fields<\"u\"?new Set([\"name\",...this.fields.split(/\\s*,\\s*/)]):null,s=[],o=!1,a=await Ge.start({configuration:t,includeFooter:!1,json:this.json,stdout:this.context.stdout},async l=>{for(let c of this.packages){let u;if(c===\".\"){let L=i.topLevelWorkspace;if(!L.manifest.name)throw new be(`Missing ${ee.pretty(t,\"name\",ee.Type.CODE)} field in ${U.fromPortablePath(x.join(L.cwd,xt.manifest))}`);u=P.makeDescriptor(L.manifest.name,\"unknown\")}else u=P.parseDescriptor(c);let g=Mt.getIdentUrl(u),f=h1(await Mt.get(g,{configuration:t,ident:u,jsonResponse:!0,customErrorMessage:Mt.customPackageError})),h=Object.keys(f.versions).sort(g1.default.compareLoose),C=f[\"dist-tags\"].latest||h[h.length-1],y=vt.validRange(u.range);if(y){let L=g1.default.maxSatisfying(h,y);L!==null?C=L:(l.reportWarning(0,`Unmet range ${P.prettyRange(t,u.range)}; falling back to the latest version`),o=!0)}else Object.prototype.hasOwnProperty.call(f[\"dist-tags\"],u.range)?C=f[\"dist-tags\"][u.range]:u.range!==\"unknown\"&&(l.reportWarning(0,`Unknown tag ${P.prettyRange(t,u.range)}; falling back to the latest version`),o=!0);let B=f.versions[C],v={...f,...B,version:C,versions:h},D;if(n!==null){D={};for(let L of n){let H=v[L];if(typeof H<\"u\")D[L]=H;else{l.reportWarning(1,`The ${ee.pretty(t,L,ee.Type.CODE)} field doesn't exist inside ${P.prettyIdent(t,u)}'s information`),o=!0;continue}}}else this.json||(delete v.dist,delete v.readme,delete v.users),D=v;l.reportJson(D),this.json||s.push(D)}});f1.inspect.styles.name=\"cyan\";for(let l of s)(l!==s[0]||o)&&this.context.stdout.write(`\n`),this.context.stdout.write(`${(0,f1.inspect)(l,{depth:1/0,colors:!0,compact:!1})}\n`);return a.exitCode()}};$u.paths=[[\"npm\",\"info\"]],$u.usage=ve.Usage({category:\"Npm-related commands\",description:\"show information about a package\",details:\"\\n      This command fetches information about a package from the npm registry and prints it in a tree format.\\n\\n      The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\\n\\n      Append `@<range>` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\\n\\n      If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\\n\\n      By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\\n    \",examples:[[\"Show all available information about react (except the `dist`, `readme`, and `users` fields)\",\"yarn npm info react\"],[\"Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)\",\"yarn npm info react --json\"],[\"Show all available information about react@16.12.0\",\"yarn npm info react@16.12.0\"],[\"Show all available information about react@next\",\"yarn npm info react@next\"],[\"Show the description of react\",\"yarn npm info react --fields description\"],[\"Show all available versions of react\",\"yarn npm info react --fields versions\"],[\"Show the readme of react\",\"yarn npm info react --fields readme\"],[\"Show a few fields of react\",\"yarn npm info react --fields homepage,repository\"]]});function h1(r){if(Array.isArray(r)){let e=[];for(let t of r)t=h1(t),t&&e.push(t);return e}else if(typeof r==\"object\"&&r!==null){let e={};for(let t of Object.keys(r)){if(t.startsWith(\"_\"))continue;let i=h1(r[t]);i&&(e[t]=i)}return e}else return r||null}var Wue=Pe(Um()),eg=class extends De{constructor(){super(...arguments);this.scope=z.String(\"-s,--scope\",{description:\"Login to the registry configured for a given scope\"});this.publish=z.Boolean(\"--publish\",!1,{description:\"Login to the publish registry\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=await Kb({configuration:t,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Ge.start({configuration:t,stdout:this.context.stdout,includeFooter:!1},async s=>{let o=await t9e({configuration:t,registry:i,report:s,stdin:this.context.stdin,stdout:this.context.stdout}),a=`/-/user/org.couchdb.user:${encodeURIComponent(o.name)}`,l=await Mt.put(a,o,{attemptedAs:o.name,configuration:t,registry:i,jsonResponse:!0,authType:Mt.AuthType.NO_AUTH});return await e9e(i,l.token,{configuration:t,scope:this.scope}),s.reportInfo(0,\"Successfully logged in\")})).exitCode()}};eg.paths=[[\"npm\",\"login\"]],eg.usage=ve.Usage({category:\"Npm-related commands\",description:\"store new login info to access the npm registry\",details:\"\\n      This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\\n\\n      Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n    \",examples:[[\"Login to the default registry\",\"yarn npm login\"],[\"Login to the registry linked to the @my-scope registry\",\"yarn npm login --scope my-scope\"],[\"Login to the publish registry for the current package\",\"yarn npm login --publish\"]]});async function Kb({scope:r,publish:e,configuration:t,cwd:i}){return r&&e?or.getScopeRegistry(r,{configuration:t,type:or.RegistryType.PUBLISH_REGISTRY}):r?or.getScopeRegistry(r,{configuration:t}):e?or.getPublishRegistry((await Hh(t,i)).manifest,{configuration:t}):or.getDefaultRegistry({configuration:t})}async function e9e(r,e,{configuration:t,scope:i}){let n=o=>a=>{let l=Ie.isIndexableObject(a)?a:{},c=l[o],u=Ie.isIndexableObject(c)?c:{};return{...l,[o]:{...u,npmAuthToken:e}}},s=i?{npmScopes:n(i)}:{npmRegistries:n(r)};return await ye.updateHomeConfiguration(s)}async function t9e({configuration:r,registry:e,report:t,stdin:i,stdout:n}){t.reportInfo(0,`Logging in to ${ee.pretty(r,e,ee.Type.URL)}`);let s=!1;if(e.match(/^https:\\/\\/npm\\.pkg\\.github\\.com(\\/|$)/)&&(t.reportInfo(0,\"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions.\"),s=!0),t.reportSeparator(),process.env.YARN_IS_TEST_ENV)return{name:process.env.YARN_INJECT_NPM_USER||\"\",password:process.env.YARN_INJECT_NPM_PASSWORD||\"\"};let{username:o,password:a}=await(0,Wue.prompt)([{type:\"input\",name:\"username\",message:\"Username:\",required:!0,onCancel:()=>process.exit(130),stdin:i,stdout:n},{type:\"password\",name:\"password\",message:s?\"Token:\":\"Password:\",required:!0,onCancel:()=>process.exit(130),stdin:i,stdout:n}]);return t.reportSeparator(),{name:o,password:a}}var mp=new Set([\"npmAuthIdent\",\"npmAuthToken\"]),tg=class extends De{constructor(){super(...arguments);this.scope=z.String(\"-s,--scope\",{description:\"Logout of the registry configured for a given scope\"});this.publish=z.Boolean(\"--publish\",!1,{description:\"Logout of the publish registry\"});this.all=z.Boolean(\"-A,--all\",!1,{description:\"Logout of all registries\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=async()=>{var c;let s=await Kb({configuration:t,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),o=await ye.find(this.context.cwd,this.context.plugins),a=P.makeIdent((c=this.scope)!=null?c:null,\"pkg\");return!or.getAuthConfiguration(s,{configuration:o,ident:a}).get(\"npmAuthToken\")};return(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{if(this.all&&(await i9e(),s.reportInfo(0,\"Successfully logged out from everything\")),this.scope){await zue(\"npmScopes\",this.scope),await i()?s.reportInfo(0,`Successfully logged out from ${this.scope}`):s.reportWarning(0,\"Scope authentication settings removed, but some other ones settings still apply to it\");return}let o=await Kb({configuration:t,cwd:this.context.cwd,publish:this.publish});await zue(\"npmRegistries\",o),await i()?s.reportInfo(0,`Successfully logged out from ${o}`):s.reportWarning(0,\"Registry authentication settings removed, but some other ones settings still apply to it\")})).exitCode()}};tg.paths=[[\"npm\",\"logout\"]],tg.usage=ve.Usage({category:\"Npm-related commands\",description:\"logout of the npm registry\",details:\"\\n      This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\\n\\n      Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n\\n      Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\\n    \",examples:[[\"Logout of the default registry\",\"yarn npm logout\"],[\"Logout of the @my-scope scope\",\"yarn npm logout --scope my-scope\"],[\"Logout of the publish registry for the current package\",\"yarn npm logout --publish\"],[\"Logout of all registries\",\"yarn npm logout --all\"]]});function r9e(r,e){let t=r[e];if(!Ie.isIndexableObject(t))return!1;let i=new Set(Object.keys(t));if([...mp].every(s=>!i.has(s)))return!1;for(let s of mp)i.delete(s);if(i.size===0)return r[e]=void 0,!0;let n={...t};for(let s of mp)delete n[s];return r[e]=n,!0}async function i9e(){let r=e=>{let t=!1,i=Ie.isIndexableObject(e)?{...e}:{};i.npmAuthToken&&(delete i.npmAuthToken,t=!0);for(let n of Object.keys(i))r9e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function zue(r,e){return await ye.updateHomeConfiguration({[r]:t=>{let i=Ie.isIndexableObject(t)?t:{};if(!Object.prototype.hasOwnProperty.call(i,e))return t;let n=i[e],s=Ie.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...mp].every(l=>!o.has(l)))return t;for(let l of mp)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:{...i,[e]:void 0};let a={};for(let l of mp)a[l]=void 0;return{...i,[e]:{...s,...a}}}})}var rg=class extends De{constructor(){super(...arguments);this.access=z.String(\"--access\",{description:\"The access for the published package (public or restricted)\"});this.tag=z.String(\"--tag\",\"latest\",{description:\"The tag on the registry that the package should be attached to\"});this.tolerateRepublish=z.Boolean(\"--tolerate-republish\",!1,{description:\"Warn and exit when republishing an already existing version of a package\"});this.otp=z.String(\"--otp\",{description:\"The OTP token to use with the command\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);if(n.manifest.private)throw new be(\"Private workspaces cannot be published\");if(n.manifest.name===null||n.manifest.version===null)throw new be(\"Workspaces must have valid names and versions to be published on an external registry\");await i.restoreInstallState();let s=n.manifest.name,o=n.manifest.version,a=or.getPublishRegistry(n.manifest,{configuration:t});return(await Ge.start({configuration:t,stdout:this.context.stdout},async c=>{var u,g;if(this.tolerateRepublish)try{let f=await Mt.get(Mt.getIdentUrl(s),{configuration:t,registry:a,ident:s,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(f,\"versions\"))throw new at(15,'Registry returned invalid data for - missing \"versions\" field');if(Object.prototype.hasOwnProperty.call(f.versions,o)){c.reportWarning(0,`Registry already knows about version ${o}; skipping.`);return}}catch(f){if(((g=(u=f.originalError)==null?void 0:u.response)==null?void 0:g.statusCode)!==404)throw f}await Wt.maybeExecuteWorkspaceLifecycleScript(n,\"prepublish\",{report:c}),await la.prepareForPack(n,{report:c},async()=>{let f=await la.genPackList(n);for(let B of f)c.reportInfo(null,B);let h=await la.genPackStream(n,f),p=await Ie.bufferStream(h),C=await Cp.getGitHead(n.cwd),y=await Cp.makePublishBody(n,p,{access:this.access,tag:this.tag,registry:a,gitHead:C});await Mt.put(Mt.getIdentUrl(s),y,{configuration:t,registry:a,ident:s,otp:this.otp,jsonResponse:!0})}),c.reportInfo(0,\"Package archive published\")})).exitCode()}};rg.paths=[[\"npm\",\"publish\"]],rg.usage=ve.Usage({category:\"Npm-related commands\",description:\"publish the active workspace to the npm registry\",details:'\\n      This command will pack the active workspace into a fresh archive and upload it to the npm registry.\\n\\n      The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\\n\\n      Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka \"private packages\"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\\n    ',examples:[[\"Publish the active workspace\",\"yarn npm publish\"]]});var Vue=Pe(Xr());var ig=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=z.String({required:!1})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s;if(typeof this.package<\"u\")s=P.parseIdent(this.package);else{if(!n)throw new ct(i.cwd,this.context.cwd);if(!n.manifest.name)throw new be(`Missing 'name' field in ${U.fromPortablePath(x.join(n.cwd,xt.manifest))}`);s=n.manifest.name}let o=await RE(s,t),l={children:Ie.sortMap(Object.entries(o),([c])=>c).map(([c,u])=>({value:ee.tuple(ee.Type.RESOLUTION,{descriptor:P.makeDescriptor(s,c),locator:P.makeLocator(s,u)})}))};return $n.emitTree(l,{configuration:t,json:this.json,stdout:this.context.stdout})}};ig.paths=[[\"npm\",\"tag\",\"list\"]],ig.usage=ve.Usage({category:\"Npm-related commands\",description:\"list all dist-tags of a package\",details:`\n      This command will list all tags of a package from the npm registry.\n\n      If the package is not specified, Yarn will default to the current workspace.\n    `,examples:[[\"List all tags of package `my-pkg`\",\"yarn npm tag list my-pkg\"]]});async function RE(r,e){let t=`/-/package${Mt.getIdentUrl(r)}/dist-tags`;return Mt.get(t,{configuration:e,ident:r,jsonResponse:!0,customErrorMessage:Mt.customPackageError})}var ng=class extends De{constructor(){super(...arguments);this.package=z.String();this.tag=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);let s=P.parseDescriptor(this.package,!0),o=s.range;if(!Vue.default.valid(o))throw new be(`The range ${ee.pretty(t,s.range,ee.Type.RANGE)} must be a valid semver version`);let a=or.getPublishRegistry(n.manifest,{configuration:t}),l=ee.pretty(t,s,ee.Type.IDENT),c=ee.pretty(t,o,ee.Type.RANGE),u=ee.pretty(t,this.tag,ee.Type.CODE);return(await Ge.start({configuration:t,stdout:this.context.stdout},async f=>{let h=await RE(s,t);Object.prototype.hasOwnProperty.call(h,this.tag)&&h[this.tag]===o&&f.reportWarning(0,`Tag ${u} is already set to version ${c}`);let p=`/-/package${Mt.getIdentUrl(s)}/dist-tags/${encodeURIComponent(this.tag)}`;await Mt.put(p,o,{configuration:t,registry:a,ident:s,jsonRequest:!0,jsonResponse:!0}),f.reportInfo(0,`Tag ${u} added to version ${c} of package ${l}`)})).exitCode()}};ng.paths=[[\"npm\",\"tag\",\"add\"]],ng.usage=ve.Usage({category:\"Npm-related commands\",description:\"add a tag for a specific version of a package\",details:`\n      This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten.\n    `,examples:[[\"Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`\",\"yarn npm tag add my-pkg@2.3.4-beta.4 beta\"]]});var sg=class extends De{constructor(){super(...arguments);this.package=z.String();this.tag=z.String()}async execute(){if(this.tag===\"latest\")throw new be(\"The 'latest' tag cannot be removed.\");let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);let s=P.parseIdent(this.package),o=or.getPublishRegistry(n.manifest,{configuration:t}),a=ee.pretty(t,this.tag,ee.Type.CODE),l=ee.pretty(t,s,ee.Type.IDENT),c=await RE(s,t);if(!Object.prototype.hasOwnProperty.call(c,this.tag))throw new be(`${a} is not a tag of package ${l}`);return(await Ge.start({configuration:t,stdout:this.context.stdout},async g=>{let f=`/-/package${Mt.getIdentUrl(s)}/dist-tags/${encodeURIComponent(this.tag)}`;await Mt.del(f,{configuration:t,registry:o,ident:s,jsonResponse:!0}),g.reportInfo(0,`Tag ${a} removed from package ${l}`)})).exitCode()}};sg.paths=[[\"npm\",\"tag\",\"remove\"]],sg.usage=ve.Usage({category:\"Npm-related commands\",description:\"remove a tag from a package\",details:`\n      This command will remove a tag from a package from the npm registry.\n    `,examples:[[\"Remove the `beta` tag from package `my-pkg`\",\"yarn npm tag remove my-pkg beta\"]]});var og=class extends De{constructor(){super(...arguments);this.scope=z.String(\"-s,--scope\",{description:\"Print username for the registry configured for a given scope\"});this.publish=z.Boolean(\"--publish\",!1,{description:\"Print username for the publish registry\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i;return this.scope&&this.publish?i=or.getScopeRegistry(this.scope,{configuration:t,type:or.RegistryType.PUBLISH_REGISTRY}):this.scope?i=or.getScopeRegistry(this.scope,{configuration:t}):this.publish?i=or.getPublishRegistry((await Hh(t,this.context.cwd)).manifest,{configuration:t}):i=or.getDefaultRegistry({configuration:t}),(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{var a,l;let o;try{o=await Mt.get(\"/-/whoami\",{configuration:t,registry:i,authType:Mt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,\"\"):void 0})}catch(c){if(((a=c.response)==null?void 0:a.statusCode)===401||((l=c.response)==null?void 0:l.statusCode)===403){s.reportError(41,\"Authentication failed - your credentials may have expired\");return}else throw c}s.reportInfo(0,o.username)})).exitCode()}};og.paths=[[\"npm\",\"whoami\"]],og.usage=ve.Usage({category:\"Npm-related commands\",description:\"display the name of the authenticated user\",details:\"\\n      Print the username associated with the current authentication settings to the standard output.\\n\\n      When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\\n\\n      When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\\n    \",examples:[[\"Print username for the default registry\",\"yarn npm whoami\"],[\"Print username for the registry on a given scope\",\"yarn npm whoami --scope company\"]]});var n9e={configuration:{npmPublishAccess:{description:\"Default access of the published packages\",type:\"STRING\",default:null},npmAuditExcludePackages:{description:\"Array of glob patterns of packages to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:\"Array of glob patterns of advisory IDs to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0}},commands:[_u,$u,eg,tg,rg,ng,ig,sg,og]},s9e=n9e;var Q1={};ut(Q1,{default:()=>y9e,patchUtils:()=>ag});var ag={};ut(ag,{applyPatchFile:()=>Gb,diffFolders:()=>w1,ensureUnpatchedDescriptor:()=>C1,extractPackageToDisk:()=>y1,extractPatchFlags:()=>rge,isParentRequired:()=>I1,loadPatchFiles:()=>TE,makeDescriptor:()=>m1,makeLocator:()=>E1,makePatchHash:()=>B1,parseDescriptor:()=>NE,parseLocator:()=>LE,parsePatchFile:()=>FE});var o9e=/^@@ -(\\d+)(,(\\d+))? \\+(\\d+)(,(\\d+))? @@.*/;function Ep(r){return x.relative(Oe.root,x.resolve(Oe.root,U.toPortablePath(r)))}function a9e(r){let e=r.trim().match(o9e);if(!e)throw new Error(`Bad header line: '${r}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var A9e=420,l9e=493;var Xue=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),c9e=r=>({header:a9e(r),parts:[]}),u9e={[\"@\"]:\"header\",[\"-\"]:\"deletion\",[\"+\"]:\"insertion\",[\" \"]:\"context\",[\"\\\\\"]:\"pragma\",undefined:\"context\"};function g9e(r){let e=[],t=Xue(),i=\"parsing header\",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),t.hunks.push(n),n=null)}function a(){o(),e.push(t),t=Xue()}for(let l=0;l<r.length;l++){let c=r[l];if(i===\"parsing header\")if(c.startsWith(\"@@\"))i=\"parsing hunks\",t.hunks=[],l-=1;else if(c.startsWith(\"diff --git \")){t&&t.diffLineFromPath&&a();let u=c.match(/^diff --git a\\/(.*?) b\\/(.*?)\\s*$/);if(!u)throw new Error(`Bad diff line: ${c}`);t.diffLineFromPath=u[1],t.diffLineToPath=u[2]}else if(c.startsWith(\"old mode \"))t.oldMode=c.slice(9).trim();else if(c.startsWith(\"new mode \"))t.newMode=c.slice(9).trim();else if(c.startsWith(\"deleted file mode \"))t.deletedFileMode=c.slice(18).trim();else if(c.startsWith(\"new file mode \"))t.newFileMode=c.slice(14).trim();else if(c.startsWith(\"rename from \"))t.renameFrom=c.slice(12).trim();else if(c.startsWith(\"rename to \"))t.renameTo=c.slice(10).trim();else if(c.startsWith(\"index \")){let u=c.match(/(\\w+)\\.\\.(\\w+)/);if(!u)continue;t.beforeHash=u[1],t.afterHash=u[2]}else c.startsWith(\"semver exclusivity \")?t.semverExclusivity=c.slice(19).trim():c.startsWith(\"--- \")?t.fromPath=c.slice(6).trim():c.startsWith(\"+++ \")&&(t.toPath=c.slice(6).trim());else{let u=u9e[c[0]]||null;switch(u){case\"header\":o(),n=c9e(c);break;case null:i=\"parsing header\",a(),l-=1;break;case\"pragma\":{if(!c.startsWith(\"\\\\ No newline at end of file\"))throw new Error(`Unrecognized pragma in patch file: ${c}`);if(!s)throw new Error(\"Bad parser state: No newline at EOF pragma encountered without context\");s.noNewlineAtEndOfFile=!0}break;case\"context\":case\"deletion\":case\"insertion\":{if(!n)throw new Error(\"Bad parser state: Hunk lines encountered before hunk header\");s&&s.type!==u&&(n.parts.push(s),s=null),s||(s={type:u,lines:[],noNewlineAtEndOfFile:!1}),s.lines.push(c.slice(1))}break;default:Ie.assertNever(u);break}}}a();for(let{hunks:l}of e)if(l)for(let c of l)h9e(c);return e}function f9e(r){let e=[];for(let t of r){let{semverExclusivity:i,diffLineFromPath:n,diffLineToPath:s,oldMode:o,newMode:a,deletedFileMode:l,newFileMode:c,renameFrom:u,renameTo:g,beforeHash:f,afterHash:h,fromPath:p,toPath:C,hunks:y}=t,B=u?\"rename\":l?\"file deletion\":c?\"file creation\":y&&y.length>0?\"patch\":\"mode change\",v=null;switch(B){case\"rename\":{if(!u||!g)throw new Error(\"Bad parser state: rename from & to not given\");e.push({type:\"rename\",semverExclusivity:i,fromPath:Ep(u),toPath:Ep(g)}),v=g}break;case\"file deletion\":{let D=n||p;if(!D)throw new Error(\"Bad parse state: no path given for file deletion\");e.push({type:\"file deletion\",semverExclusivity:i,hunk:y&&y[0]||null,path:Ep(D),mode:Hb(l),hash:f})}break;case\"file creation\":{let D=s||C;if(!D)throw new Error(\"Bad parse state: no path given for file creation\");e.push({type:\"file creation\",semverExclusivity:i,hunk:y&&y[0]||null,path:Ep(D),mode:Hb(c),hash:h})}break;case\"patch\":case\"mode change\":v=C||s;break;default:Ie.assertNever(B);break}v&&o&&a&&o!==a&&e.push({type:\"mode change\",semverExclusivity:i,path:Ep(v),oldMode:Hb(o),newMode:Hb(a)}),v&&y&&y.length&&e.push({type:\"patch\",semverExclusivity:i,path:Ep(v),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error(\"Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string\");return e}function Hb(r){let e=parseInt(r,8)&511;if(e!==A9e&&e!==l9e)throw new Error(`Unexpected file mode string: ${r}`);return e}function FE(r){let e=r.split(/\\n/g);return e[e.length-1]===\"\"&&e.pop(),f9e(g9e(e))}function h9e(r){let e=0,t=0;for(let{type:i,lines:n}of r.parts)switch(i){case\"context\":t+=n.length,e+=n.length;break;case\"deletion\":e+=n.length;break;case\"insertion\":t+=n.length;break;default:Ie.assertNever(i);break}if(e!==r.header.original.length||t!==r.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(r.header.original.length)} ${i(r.header.patched.length)} @@, got @@ ${i(e)} ${i(t)} @@)`)}}var Ip=class extends Error{constructor(t,i){super(`Cannot apply hunk #${t+1}`);this.hunk=i}};async function yp(r,e,t){let i=await r.lstatPromise(e),n=await t();if(typeof n<\"u\"&&(e=n),r.lutimesPromise)await r.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await r.utimesPromise(e,i.atime,i.mtime);else throw new Error(\"Cannot preserve the time values of a symlink\")}async function Gb(r,{baseFs:e=new $t,dryRun:t=!1,version:i=null}={}){for(let n of r)if(!(n.semverExclusivity!==null&&i!==null&&!vt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case\"file deletion\":if(t){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await yp(e,x.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case\"rename\":if(t){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await yp(e,x.dirname(n.fromPath),async()=>{await yp(e,x.dirname(n.toPath),async()=>{await yp(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case\"file creation\":if(t){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(`\n`)+(n.hunk.parts[0].noNewlineAtEndOfFile?\"\":`\n`):\"\";await e.mkdirpPromise(x.dirname(n.path),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,xr.SAFE_TIME,xr.SAFE_TIME)}break;case\"patch\":await yp(e,n.path,async()=>{await C9e(n,{baseFs:e,dryRun:t})});break;case\"mode change\":{let o=(await e.statPromise(n.path)).mode;if(Zue(n.newMode)!==Zue(o))continue;await yp(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Ie.assertNever(n);break}}function Zue(r){return(r&64)>0}function _ue(r){return r.replace(/\\s+$/,\"\")}function d9e(r,e){return _ue(r)===_ue(e)}async function C9e({hunks:r,path:e},{baseFs:t,dryRun:i=!1}){let n=await t.statSync(e).mode,o=(await t.readFileSync(e,\"utf8\")).split(/\\n/),a=[],l=0,c=0;for(let g of r){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),C=Math.max(h,p),y=0,B=0,v=null;for(;y<=C;){if(y<=h&&(B=f-y,v=$ue(g,o,B),v!==null)){y=-y;break}if(y<=p&&(B=f+y,v=$ue(g,o,B),v!==null))break;y+=1}if(v===null)throw new Ip(r.indexOf(g),g);a.push(v),l+=y,c=B+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case\"splice\":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case\"pop\":o.pop();break;case\"push\":o.push(f.line);break;default:Ie.assertNever(f);break}await t.writeFilePromise(e,o.join(`\n`),{mode:n})}function $ue(r,e,t){let i=[];for(let n of r.parts)switch(n.type){case\"context\":case\"deletion\":{for(let s of n.lines){let o=e[t];if(o==null||!d9e(o,s))return null;t+=1}n.type===\"deletion\"&&(i.push({type:\"splice\",index:t-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:\"push\",line:\"\"}))}break;case\"insertion\":i.push({type:\"splice\",index:t,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:\"pop\"});break;default:Ie.assertNever(n.type);break}return i}var E9e=/^builtin<([^>]+)>$/;function d1(r,e){let{source:t,selector:i,params:n}=P.parseRange(r);if(t===null)throw new Error(\"Patch locators must explicitly define their source\");let s=i?i.split(/&/).map(c=>U.toPortablePath(c)):[],o=n&&typeof n.locator==\"string\"?P.parseLocator(n.locator):null,a=n&&typeof n.version==\"string\"?n.version:null,l=e(t);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function NE(r){let{sourceItem:e,...t}=d1(r.range,P.parseDescriptor);return{...t,sourceDescriptor:e}}function LE(r){let{sourceItem:e,...t}=d1(r.reference,P.parseLocator);return{...t,sourceLocator:e}}function C1(r){if(!r.range.startsWith(\"patch:\"))return r;let{sourceItem:e}=d1(r.range,P.parseDescriptor);return e}function ege({parentLocator:r,sourceItem:e,patchPaths:t,sourceVersion:i,patchHash:n},s){let o=r!==null?{locator:P.stringifyLocator(r)}:{},a=typeof i<\"u\"?{version:i}:{},l=typeof n<\"u\"?{hash:n}:{};return P.makeRange({protocol:\"patch:\",source:s(e),selector:t.join(\"&\"),params:{...a,...l,...o}})}function m1(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeDescriptor(r,ege({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function E1(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,ege({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function tge({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith(\"~\")&&(i=i.slice(1));let s=i.match(E9e);return s!==null?t(s[1]):x.isAbsolute(i)?r(i):e(i)}function rge(r){let e=r.startsWith(\"~\");return e&&(r=r.slice(1)),{optional:e}}function I1(r){return tge({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},r)}async function TE(r,e,t){let i=r!==null?await t.fetcher.fetch(r,t):null,n=i&&i.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await Ie.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=rge(o),l=await tge({onAbsolute:async()=>await M.readFilePromise(o,\"utf8\"),onRelative:async()=>{if(n===null)throw new Error(\"Assertion failed: The parent locator should have been fetched\");return await n.packageFs.readFilePromise(x.join(n.prefixPath,o),\"utf8\")},onBuiltin:async c=>await t.project.configuration.firstHook(u=>u.getBuiltinPatch,t.project,c)},o);return{...a,source:l}})));for(let o of s)typeof o.source==\"string\"&&(o.source=o.source.replace(/\\r\\n?/g,`\n`));return s}async function y1(r,{cache:e,project:t}){let i=t.storedPackages.get(r.locatorHash);if(typeof i>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let n=t.storedChecksums,s=new ti,o=t.configuration.makeFetcher(),a=await o.fetch(r,{cache:e,project:t,fetcher:o,checksums:n,report:s}),l=await M.mktempPromise(),c=x.join(l,\"source\"),u=x.join(l,\"user\"),g=x.join(l,\".yarn-patch.json\");return await Promise.all([M.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),M.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),M.writeJsonPromise(g,{locator:P.stringifyLocator(r),version:i.version})]),M.detachTemp(l),u}async function w1(r,e){let t=U.fromPortablePath(r).replace(/\\\\/g,\"/\"),i=U.fromPortablePath(e).replace(/\\\\/g,\"/\"),{stdout:n,stderr:s}=await Cr.execvp(\"git\",[\"-c\",\"core.safecrlf=false\",\"diff\",\"--src-prefix=a/\",\"--dst-prefix=b/\",\"--ignore-cr-at-eol\",\"--full-index\",\"--no-index\",\"--no-renames\",\"--text\",t,i],{cwd:U.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:\"1\",HOME:\"\",XDG_CONFIG_HOME:\"\",USERPROFILE:\"\"}});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH.\nThe following error was reported by 'git':\n${s}`);let o=t.startsWith(\"/\")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${Ie.escapeRegExp(`/${o(t)}/`)})`,\"g\"),\"$1/\").replace(new RegExp(`(a|b)${Ie.escapeRegExp(`/${o(i)}/`)}`,\"g\"),\"$1/\").replace(new RegExp(Ie.escapeRegExp(`${t}/`),\"g\"),\"\").replace(new RegExp(Ie.escapeRegExp(`${i}/`),\"g\"),\"\")}function B1(r,e){let t=[];for(let{source:i}of r){if(i===null)continue;let n=FE(i);for(let s of n){let{semverExclusivity:o,...a}=s;o!==null&&e!==null&&!vt.satisfiesWithPrereleases(e,o)||t.push(JSON.stringify(a))}}return li.makeHash(`${3}`,...t).slice(0,6)}function ige(r,{configuration:e,report:t}){for(let i of r.parts)for(let n of i.lines)switch(i.type){case\"context\":t.reportInfo(null,`  ${ee.pretty(e,n,\"grey\")}`);break;case\"deletion\":t.reportError(28,`- ${ee.pretty(e,n,ee.Type.REMOVED)}`);break;case\"insertion\":t.reportError(28,`+ ${ee.pretty(e,n,ee.Type.ADDED)}`);break;default:Ie.assertNever(i.type)}}var Yb=class{supports(e,t){return!!e.reference.startsWith(\"patch:\")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=LE(e),a=await TE(i,o,t),l=await M.mktempPromise(),c=x.join(l,\"current.zip\"),u=await t.fetcher.fetch(n,t),g=P.getIdentVendorPath(e),f=await on(),h=new Wr(c,{libzip:f,create:!0,level:t.project.configuration.get(\"compressionLevel\")});await Ie.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:C}of a){if(p===null)continue;let y=new Wr(c,{libzip:f,level:t.project.configuration.get(\"compressionLevel\")}),B=new qt(x.resolve(Oe.root,g),{baseFs:y});try{await Gb(FE(p),{baseFs:B,version:s})}catch(v){if(!(v instanceof Ip))throw v;let D=t.project.configuration.get(\"enableInlineHunks\"),L=!D&&!C?\" (set enableInlineHunks for details)\":\"\",H=`${P.prettyLocator(t.project.configuration,e)}: ${v.message}${L}`,j=$=>{!D||ige(v.hunk,{configuration:t.project.configuration,report:$})};if(y.discardAndClose(),C){t.report.reportWarningOnce(66,H,{reportExtra:j});continue}else throw new at(66,H,j)}y.saveAndClose()}return new Wr(c,{libzip:f,level:t.project.configuration.get(\"compressionLevel\")})}};var jb=class{supportsDescriptor(e,t){return!!e.range.startsWith(\"patch:\")}supportsLocator(e,t){return!!e.reference.startsWith(\"patch:\")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){let{patchPaths:n}=NE(e);return n.every(s=>!I1(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){let{sourceDescriptor:i}=NE(e);return[i]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=NE(e),a=await TE(n,o,i.fetchOptions),l=t.get(s.descriptorHash);if(typeof l>\"u\")throw new Error(\"Assertion failed: The dependency should have been resolved\");let c=B1(a,l.version);return[E1(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){let{sourceLocator:i}=LE(e);return{...await t.resolver.resolve(i,t),...e}}};var Ag=class extends De{constructor(){super(...arguments);this.save=z.Boolean(\"-s,--save\",!1,{description:\"Add the patch to your resolution entries\"});this.patchFolder=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let s=x.resolve(this.context.cwd,U.toPortablePath(this.patchFolder)),o=x.join(s,\"../source\"),a=x.join(s,\"../.yarn-patch.json\");if(!M.existsSync(o))throw new be(\"The argument folder didn't get created by 'yarn patch'\");let l=await w1(o,s),c=await M.readJsonPromise(a),u=P.parseLocator(c.locator,!0);if(!i.storedPackages.has(u.locatorHash))throw new be(\"No package found in the project for the given locator\");if(!this.save){this.context.stdout.write(l);return}let g=t.get(\"patchFolder\"),f=x.join(g,`${P.slugifyLocator(u)}.patch`);await M.mkdirPromise(g,{recursive:!0}),await M.writeFilePromise(f,l);let h=new Map;for(let p of i.storedPackages.values()){if(P.isVirtualLocator(p))continue;let C=p.dependencies.get(u.identHash);if(!C)continue;let y=P.isVirtualDescriptor(C)?P.devirtualizeDescriptor(C):C,B=C1(y),v=i.storedResolutions.get(B.descriptorHash);if(!v)throw new Error(\"Assertion failed: Expected the resolution to have been registered\");if(!i.storedPackages.get(v))throw new Error(\"Assertion failed: Expected the package to have been registered\");let L=i.originalPackages.get(p.locatorHash);if(!L)throw new Error(\"Assertion failed: Expected the original package to have been registered\");let H=L.dependencies.get(C.identHash);if(!H)throw new Error(\"Assertion failed: Expected the original dependency to have been registered\");h.set(H.descriptorHash,H)}for(let p of h.values()){let C=m1(p,{parentLocator:null,sourceDescriptor:P.convertLocatorToDescriptor(u),sourceVersion:null,patchPaths:[`./${x.relative(i.cwd,f)}`]});i.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(C),description:p.range}},reference:C.range})}await i.persist()}};Ag.paths=[[\"patch-commit\"]],Ag.usage=ve.Usage({description:\"generate a patch out of a directory\",details:\"\\n      By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\\n\\n      With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\\n\\n      Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\\n    \"});var lg=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let o=P.parseLocator(this.package);if(o.reference===\"unknown\"){let a=Ie.mapAndFilter([...i.storedPackages.values()],l=>l.identHash!==o.identHash?Ie.mapAndFilter.skip:P.isVirtualLocator(l)?Ie.mapAndFilter.skip:l);if(a.length===0)throw new be(\"No package found in the project for the given locator\");if(a.length>1)throw new be(`Multiple candidate packages found; explicitly choose one of them (use \\`yarn why <package>\\` to get more information as to who depends on them):\n${a.map(l=>`\n- ${P.prettyLocator(t,l)}`).join(\"\")}`);o=a[0]}if(!i.storedPackages.has(o.locatorHash))throw new be(\"No package found in the project for the given locator\");await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async a=>{let l=await y1(o,{cache:s,project:i});a.reportJson({locator:P.stringifyLocator(o),path:U.fromPortablePath(l)}),a.reportInfo(0,`Package ${P.prettyLocator(t,o)} got extracted with success!`),a.reportInfo(0,`You can now edit the following folder: ${ee.pretty(t,U.fromPortablePath(l),\"magenta\")}`),a.reportInfo(0,`Once you are done run ${ee.pretty(t,`yarn patch-commit -s ${process.platform===\"win32\"?'\"':\"\"}${U.fromPortablePath(l)}${process.platform===\"win32\"?'\"':\"\"}`,\"cyan\")} and Yarn will store a patchfile based on your changes.`)})}};lg.paths=[[\"patch\"]],lg.usage=ve.Usage({description:\"prepare a package for patching\",details:\"\\n      This command will cause a package to be extracted in a temporary directory intended to be editable at will.\\n      \\n      Once you're done with your changes, run `yarn patch-commit -s <path>` (with `<path>` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\\n    \"});var I9e={configuration:{enableInlineHunks:{description:\"If true, the installs will print unmatched patch hunks\",type:\"BOOLEAN\",default:!1},patchFolder:{description:\"Folder where the patch files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/patches\"}},commands:[Ag,lg],fetchers:[Yb],resolvers:[jb]},y9e=I9e;var x1={};ut(x1,{default:()=>Q9e});var qb=class{supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error(\"Assertion failed: Expected the pnpm linker to be enabled\");let i=S1(),n=t.project.installersCustomData.get(i);if(!n)throw new be(`The project in ${ee.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ee.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s>\"u\")throw new be(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=S1(),n=t.project.installersCustomData.get(i);if(!n)throw new be(`The project in ${ee.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ee.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\\/node_modules\\/(@[^/]*\\/)?[^/]+)(\\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=x.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new b1(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"pnpm\"}},b1=class{constructor(e){this.opts=e;this.asyncActions=new Ie.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return S1()}attachCustomData(e){}async installPackage(e,t,i){switch(e.linkType){case\"SOFT\":return this.installPackageSoft(e,t,i);case\"HARD\":return this.installPackageHard(e,t,i)}throw new Error(\"Assertion failed: Unsupported package link type\")}async installPackageSoft(e,t,i){let n=x.resolve(t.packageFs.getRealPath(),t.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,t,i){var u;let n=w9e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await M.mkdirPromise(n,{recursive:!0}),await M.copyPromise(n,t.prefixPath,{baseFs:t.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await ot.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?u:new ot,misc:{hasBindingGyp:po.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=po.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,t){this.opts.project.configuration.get(\"nodeLinker\")===\"pnpm\"&&(!nge(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=x.join(n,xt.nodeModules),o=[],a=await sge(s);for(let[l,c]of t){let u=c;nge(c,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,\"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies\"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=x.join(s,f),p=x.relative(x.dirname(h),g),C=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(C){if(C.isSymbolicLink()&&await M.readlinkPromise(h)===p)return;await M.removePromise(h)}await M.mkdirpPromise(x.dirname(h)),process.platform==\"win32\"?await M.symlinkPromise(g,h,\"junction\"):await M.symlinkPromise(p,h)}))}o.push(oge(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,t){throw new Error(\"External dependencies haven't been implemented for the pnpm linker\")}async finalizeInstall(){let e=Age(this.opts.project);if(this.opts.project.configuration.get(\"nodeLinker\")!==\"pnpm\")await M.removePromise(e);else{let t=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=x.contains(e,s);if(o!==null){let[a,,...l]=o.split(x.sep);i.add(a);let c=x.join(e,a);t.push(M.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=x.join(c,g);if(g===xt.nodeModules){let h=await sge(f);return h.delete(l.join(x.sep)),oge(f,h)}else return M.removePromise(f)}))).catch(u=>{if(u.code!==\"ENOENT\")throw u}))}}let n;try{n=await M.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||t.push(M.removePromise(x.join(e,s)));await Promise.all(t)}return await this.asyncActions.wait(),await v1(e),this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\"&&await v1(age(this.opts.project)),{customData:this.customData}}};function S1(){return JSON.stringify({name:\"PnpmInstaller\",version:2})}function age(r){return x.join(r.cwd,xt.nodeModules)}function Age(r){return x.join(age(r),\".store\")}function w9e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return x.join(Age(e),t,i)}function nge(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function sge(r){let e=new Map,t=[];try{t=await M.readdirPromise(r,{withFileTypes:!0})}catch(i){if(i.code!==\"ENOENT\")throw i}try{for(let i of t)if(!i.name.startsWith(\".\"))if(i.name.startsWith(\"@\")){let n=await M.readdirPromise(x.join(r,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!==\"ENOENT\")throw i}return e}async function oge(r,e){var n;let t=[],i=new Set;for(let s of e.keys()){t.push(M.removePromise(x.join(r,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(t).then(()=>Promise.all([...i].map(s=>v1(x.join(r,s)))))}async function v1(r){try{await M.rmdirPromise(r)}catch(e){if(e.code!==\"ENOENT\"&&e.code!==\"ENOTEMPTY\")throw e}}var B9e={linkers:[qb]},Q9e=B9e;var BQ=()=>({modules:new Map([[\"@yarnpkg/cli\",Nm],[\"@yarnpkg/core\",sm],[\"@yarnpkg/fslib\",Wp],[\"@yarnpkg/libzip\",xC],[\"@yarnpkg/parsers\",td],[\"@yarnpkg/shell\",RC],[\"clipanion\",F$(ud)],[\"semver\",b9e],[\"typanion\",fn],[\"yup\",S9e],[\"@yarnpkg/plugin-essentials\",pO],[\"@yarnpkg/plugin-compat\",IO],[\"@yarnpkg/plugin-dlx\",yO],[\"@yarnpkg/plugin-file\",bO],[\"@yarnpkg/plugin-git\",hO],[\"@yarnpkg/plugin-github\",SO],[\"@yarnpkg/plugin-http\",vO],[\"@yarnpkg/plugin-init\",kO],[\"@yarnpkg/plugin-link\",RO],[\"@yarnpkg/plugin-nm\",hM],[\"@yarnpkg/plugin-npm\",u1],[\"@yarnpkg/plugin-npm-cli\",p1],[\"@yarnpkg/plugin-pack\",o1],[\"@yarnpkg/plugin-patch\",Q1],[\"@yarnpkg/plugin-pnp\",iM],[\"@yarnpkg/plugin-pnpm\",x1]]),plugins:new Set([\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\"])});$0({binaryVersion:Lr||\"<unknown>\",pluginConfiguration:BQ()});})();\n/*!\n * buildToken\n * Builds OAuth token prefix (helper function)\n *\n * @name buildToken\n * @function\n * @param {GitUrl} obj The parsed Git url object.\n * @return {String} token prefix\n */\n/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n/*!\n * is-extglob <https://github.com/jonschlinkert/is-extglob>\n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n/*!\n * is-windows <https://github.com/jonschlinkert/is-windows>\n *\n * Copyright © 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n/**\n  @license\n  Copyright (c) 2015, Rebecca Turner\n\n  Permission to use, copy, modify, and/or distribute this software for any\n  purpose with or without fee is hereby granted, provided that the above\n  copyright notice and this permission notice appear in all copies.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n  PERFORMANCE OF THIS SOFTWARE.\n */\n/**\n  @license\n  Copyright Joyent, Inc. and other Node contributors.\n\n  Permission is hereby granted, free of charge, to any person obtaining a\n  copy of this software and associated documentation files (the\n  \"Software\"), to deal in the Software without restriction, including\n  without limitation the rights to use, copy, modify, merge, publish,\n  distribute, sublicense, and/or sell copies of the Software, and to permit\n  persons to whom the Software is furnished to do so, subject to the\n  following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n  NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n  USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n/**\n  @license\n  Copyright Node.js contributors. All rights reserved.\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to\n  deal in the Software without restriction, including without limitation the\n  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n  sell copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n  IN THE SOFTWARE.\n*/\n/**\n  @license\n  The MIT License (MIT)\n\n  Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n"
  },
  {
    "path": "bindings/node/.yarnrc.yml",
    "content": "nodeLinker: node-modules\n\nnpmAuditRegistry: 'https://registry.npmjs.org'\n\nyarnPath: .yarn/releases/yarn-3.5.1.cjs\n"
  },
  {
    "path": "bindings/node/Cargo.toml",
    "content": "[package]\nauthors = [\"Nicolas Patry <nicolas@huggingface.co>\"]\nedition = \"2021\"\nname    = \"node\"\nversion = \"0.22.3-dev.0\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n[dependencies]\nnapi        = \"2\"\nnapi-derive = \"2\"\nserde       = { version = \"1.0.163\", features = [\"derive\"] }\ntokenizers  = { path = \"../../tokenizers/\" }\nahash = { version = \"0.8.11\", features = [\"serde\"] }\n\n[build-dependencies]\nnapi-build = \"2\"\n\n[profile.release]\nlto = true\n"
  },
  {
    "path": "bindings/node/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 N-API for Rust\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "bindings/node/Makefile",
    "content": ".PHONY: style check-style test\n\nDATA_DIR = data\n\ndir_guard=@mkdir -p $(@D)\n\n# Format source code automatically\nstyle:\n\tnpm run lint\n\n# Check the source code is formatted correctly\ncheck-style:\n\tnpm run lint-check\n\nTESTS_RESOURCES = $(DATA_DIR)/small.txt $(DATA_DIR)/roberta.json $(DATA_DIR)/tokenizer-wiki.json $(DATA_DIR)/bert-wiki.json\n\n# Launch the test suite\ntest: $(TESTS_RESOURCES)\n\tnpm run test\n\n$(DATA_DIR)/big.txt :\n\t$(dir_guard)\n\twget https://norvig.com/big.txt -O $@\n\n$(DATA_DIR)/small.txt : $(DATA_DIR)/big.txt\n\thead -100 $(DATA_DIR)/big.txt > $@\n\n$(DATA_DIR)/roberta.json :\n\t$(dir_guard)\n\twget https://huggingface.co/roberta-large/raw/main/tokenizer.json -O $@\n\n$(DATA_DIR)/tokenizer-wiki.json :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-quicktour/tokenizer.json -O $@\n\n$(DATA_DIR)/bert-wiki.json :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-pipeline/tokenizer.json -O $@\n"
  },
  {
    "path": "bindings/node/README.md",
    "content": "<p align=\"center\">\n  <br>\n  <img src=\"https://huggingface.co/landing/assets/tokenizers/tokenizers-logo.png\" width=\"600\"/>\n  <br>\n<p>\n<p align=\"center\">\n  <a href=\"https://badge.fury.io/js/tokenizers\">\n    <img alt=\"Build\" src=\"https://badge.fury.io/js/tokenizers.svg\">\n  </a>\n  <a href=\"https://github.com/huggingface/tokenizers/blob/master/LICENSE\">\n    <img alt=\"GitHub\" src=\"https://img.shields.io/github/license/huggingface/tokenizers.svg?color=blue\">\n  </a>\n</p>\n<br>\n\nNodeJS implementation of today's most used tokenizers, with a focus on performance and\nversatility. Bindings over the [Rust](https://github.com/huggingface/tokenizers/tree/master/tokenizers) implementation.\nIf you are interested in the High-level design, you can go check it there.\n\n## Main features\n\n - Train new vocabularies and tokenize using 4 pre-made tokenizers (Bert WordPiece and the 3\n   most common BPE versions).\n - Extremely fast (both training and tokenization), thanks to the Rust implementation. Takes\n   less than 20 seconds to tokenize a GB of text on a server's CPU.\n - Easy to use, but also extremely versatile.\n - Designed for research and production.\n - Normalization comes with alignments tracking. It's always possible to get the part of the\n   original sentence that corresponds to a given token.\n - Does all the pre-processing: Truncate, Pad, add the special tokens your model needs.\n\n## Installation\n\n```bash\nnpm install tokenizers@latest\n```\n\n## Basic example\n\n```ts\nimport { Tokenizer } from \"tokenizers\";\n\nconst tokenizer = await Tokenizer.fromFile(\"tokenizer.json\");\nconst wpEncoded = await tokenizer.encode(\"Who is John?\");\n\nconsole.log(wpEncoded.getLength());\nconsole.log(wpEncoded.getTokens());\nconsole.log(wpEncoded.getIds());\nconsole.log(wpEncoded.getAttentionMask());\nconsole.log(wpEncoded.getOffsets());\nconsole.log(wpEncoded.getOverflowing());\nconsole.log(wpEncoded.getSpecialTokensMask());\nconsole.log(wpEncoded.getTypeIds());\nconsole.log(wpEncoded.getWordIds());\n```\n\n## License\n\n[Apache License 2.0](../../LICENSE)\n"
  },
  {
    "path": "bindings/node/build.rs",
    "content": "extern crate napi_build;\n\nfn main() {\n  napi_build::setup();\n}\n"
  },
  {
    "path": "bindings/node/examples/documentation/pipeline.test.ts",
    "content": "/* eslint-disable */\nvar globRequire = require;\n\ndescribe(\"pipelineExample\", () => {\n    // This is a hack to let us require using path similar to what the user has to use\n    function require(mod: string) {\n        if (mod.startsWith(\"tokenizers\")) {\n            // let path = mod.slice(\"tokenizers\".length);\n            return globRequire(\"../../\");\n        } else {\n            return globRequire(mod);\n        }\n    }\n    let console = {\n        log: (..._args: any[]) => {}\n    };\n\n    it(\"shows pipeline parts\", async () => {\n        // START reload_tokenizer\n        let { Tokenizer } = require(\"tokenizers\");\n\n        let tokenizer = Tokenizer.fromFile(\"data/tokenizer-wiki.json\");\n        // END reload_tokenizer\n        // START setup_normalizer\n        let { sequenceNormalizer, nfdNormalizer, stripAccentsNormalizer } = require(\"tokenizers\");\n\n        let normalizer = sequenceNormalizer([nfdNormalizer(), stripAccentsNormalizer()]);\n        // END setup_normalizer\n        // START test_normalizer\n        let normalized = normalizer.normalizeString(\"Héllò hôw are ü?\")\n        // \"Hello how are u?\"\n        // END test_normalizer\n        expect(normalized).toEqual(\"Hello how are u?\");\n        // START replace_normalizer\n        tokenizer.setNormalizer(normalizer)\n        // END replace_normalizer\n        // START setup_pre_tokenizer\n        let { whitespacePreTokenizer } = require(\"tokenizers\");\n\n        var preTokenizer = whitespacePreTokenizer();\n        var preTokenized = preTokenizer.preTokenizeString(\"Hello! How are you? I'm fine, thank you.\");\n        // END setup_pre_tokenizer\n        expect(preTokenized).toEqual([\n            [\"Hello\", [0, 5]],\n            [\"!\", [5, 6]],\n            [\"How\", [7, 10]],\n            [\"are\", [11, 14]],\n            [\"you\", [15, 18]],\n            [\"?\", [18, 19]],\n            [\"I\", [20, 21]],\n            [\"'\", [21, 22]],\n            ['m', [22, 23]],\n            [\"fine\", [24, 28]],\n            [\",\", [28, 29]],\n            [\"thank\", [30, 35]],\n            [\"you\", [36, 39]],\n            [\".\", [39, 40]]\n        ]);\n        // START combine_pre_tokenizer\n        let { sequencePreTokenizer, digitsPreTokenizer } = require(\"tokenizers\");\n\n        var preTokenizer = sequencePreTokenizer([whitespacePreTokenizer(), digitsPreTokenizer(true)]);\n        var preTokenized = preTokenizer.preTokenizeString(\"Call 911!\");\n        // END combine_pre_tokenizer\n        // START replace_pre_tokenizer\n        tokenizer.setPreTokenizer(preTokenizer)\n        // END replace_pre_tokenizer\n        // START setup_processor\n        let { templateProcessing } = require(\"tokenizers\");\n\n        tokenizer.setPostProcessor(templateProcessing(\n            \"[CLS] $A [SEP]\",\n            \"[CLS] $A [SEP] $B:1 [SEP]:1\",\n            [[\"[CLS]\", 1], [\"[SEP]\", 2]]\n        ));\n        // END setup_processor\n        // START test_decoding\n        let output = await tokenizer.encode(\"Hello, y'all! How are you 😁 ?\");\n        console.log(output.getIds());\n        // [1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2]\n\n        let decoded = await tokenizer.decode([1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2], true);\n        // \"Hello , y ' all ! How are you ?\"\n        // END test_decoding\n        expect(decoded).toEqual(\"Hello , y ' all ! How are you ?\");\n    });\n\n    it.skip(\"trains the tokenizer\", async () => {\n        // START bert_setup_tokenizer\n        let { Tokenizer } = require(\"tokenizers\");\n        let { WordPiece } = require(\"tokenizers\");\n\n        let bertTokenizer = new Tokenizer(WordPiece.init({}, { unkToken: \"[UNK]\" }));\n        // END bert_setup_tokenizer\n        // START bert_setup_normalizer\n        let { sequenceNormalizer, lowercaseNormalizer, nfdNormalizer, stripAccentsNormalizer }\n            = require(\"tokenizers\");\n\n        bertTokenizer.setNormalizer(sequenceNormalizer([\n            nfdNormalizer(), lowercaseNormalizer(), stripAccentsNormalizer()\n        ]))\n        // END bert_setup_normalizer\n        // START bert_setup_pre_tokenizer\n        let { whitespacePreTokenizer } = require(\"tokenizers\");\n\n        bertTokenizer.setPreTokenizer(whitespacePreTokenizer());\n        // END bert_setup_pre_tokenizer\n        // START bert_setup_processor\n        let { templateProcessing } = require(\"tokenizers\");\n\n        bertTokenizer.setPostProcessor(templateProcessing(\n            \"[CLS] $A [SEP]\",\n            \"[CLS] $A [SEP] $B:1 [SEP]:1\",\n            [[\"[CLS]\", 1], [\"[SEP]\", 2]]\n        ));\n        // END bert_setup_processor\n        // START bert_train_tokenizer\n        let { wordPieceTrainer } = require(\"tokenizers\");\n\n        let trainer = wordPieceTrainer({\n            vocabSize: 30522,\n            specialTokens: [\"[UNK]\", \"[CLS]\", \"[SEP]\", \"[PAD]\", \"[MASK]\"]\n        });\n        let files = [\"test\", \"train\", \"valid\"].map(split => `data/wikitext-103-raw/wiki.${split}.raw`);\n        bertTokenizer.train(files, trainer);\n\n        bertTokenizer.save(\"data/bert-wiki.json\")\n        // END bert_train_tokenizer\n    });\n\n    it(\"shows a full bert example\", async () => {\n        let { Tokenizer } = require(\"tokenizers\");\n        let bertTokenizer = await Tokenizer.fromFile(\"data/bert-wiki.json\")\n\n        // START bert_test_decoding\n\n        let output = await bertTokenizer.encode(\"Welcome to the 🤗 Tokenizers library.\");\n        console.log(output.getTokens());\n        // [\"[CLS]\", \"welcome\", \"to\", \"the\", \"[UNK]\", \"tok\", \"##eni\", \"##zer\", \"##s\", \"library\", \".\", \"[SEP]\"]\n\n        var decoded = await bertTokenizer.decode(output.getIds(), true);\n        // \"welcome to the tok ##eni ##zer ##s library .\"\n        // END bert_test_decoding\n        expect(decoded).toEqual(\"welcome to the tok ##eni ##zer ##s library .\");\n        // START bert_proper_decoding\n        let { wordPieceDecoder } = require(\"tokenizers\");\n        bertTokenizer.setDecoder(wordPieceDecoder());\n        var decoded = await bertTokenizer.decode(output.getIds(), true);\n        // \"welcome to the tokenizers library.\"\n        // END bert_proper_decoding\n        expect(decoded).toEqual(\"welcome to the tokenizers library.\");\n    });\n});\n"
  },
  {
    "path": "bindings/node/examples/documentation/quicktour.test.ts",
    "content": "/* eslint-disable */\nvar globRequire = require\n\nconsole.log = (..._args: any[]) => {}\n\ndescribe('quicktourExample', () => {\n  function require(mod: string) {\n    if (mod.startsWith('tokenizers')) {\n      return globRequire('../../')\n    } else {\n      return globRequire(mod)\n    }\n  }\n\n  it.skip('trains the tokenizer', async () => {\n    // START init_tokenizer\n    let { Tokenizer } = require('tokenizers')\n    let { BPE } = require('tokenizers')\n\n    let tokenizer = new Tokenizer(BPE.init({}, [], { unkToken: '[UNK]' }))\n    // END init_tokenizer\n    // START init_trainer\n    let { bpeTrainer } = require('tokenizers')\n\n    let trainer = bpeTrainer({\n      specialTokens: ['[UNK]', '[CLS]', '[SEP]', '[PAD]', '[MASK]'],\n    })\n    // END init_trainer\n    // START init_pretok\n    let { whitespacePreTokenizer } = require('tokenizers')\n\n    tokenizer.setPreTokenizer(whitespacePreTokenizer())\n    // END init_pretok\n    // START train\n    let files = ['test', 'train', 'valid'].map((split) => `data/wikitext-103-raw/wiki.${split}.raw`)\n    tokenizer.train(files, trainer)\n    // END train\n    // START save\n    tokenizer.save('data/tokenizer-wiki.json')\n    // END save\n  })\n\n  it('shows a quicktour example', async () => {\n    let { Tokenizer } = require('tokenizers')\n\n    // START reload_tokenizer\n    let tokenizer = Tokenizer.fromFile('data/tokenizer-wiki.json')\n    // END reload_tokenizer\n    // START encode\n\n    var output = await tokenizer.encode(\"Hello, y'all! How are you 😁 ?\")\n    // END encode\n    // START print_tokens\n    console.log(output.getTokens())\n    // [\"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\"]\n    // END print_tokens\n    expect(output.getTokens()).toEqual(['Hello', ',', 'y', \"'\", 'all', '!', 'How', 'are', 'you', '[UNK]', '?'])\n    // START print_ids\n    console.log(output.getIds())\n    // [27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35]\n    // END print_ids\n    expect(output.getIds()).toEqual([27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35])\n    // START print_offsets\n    let offsets = output.getOffsets()\n    console.log(offsets[9])\n    // (26, 27)\n    // END print_offsets\n    expect(offsets[9]).toEqual([26, 27])\n    // START use_offsets\n    let { slice } = require('tokenizers')\n\n    let sentence = \"Hello, y'all! How are you 😁 ?\"\n    let [start, end] = offsets[9]\n    console.log(slice(sentence, start, end))\n    // \"😁\"\n    // END use_offsets\n    expect(slice(sentence, start, end)).toEqual('😁')\n    // START check_sep\n    console.log(tokenizer.tokenToId('[SEP]'))\n    // 2\n    // END check_sep\n    expect(tokenizer.tokenToId('[SEP]')).toEqual(2)\n    // START init_template_processing\n    let { templateProcessing } = require('tokenizers')\n\n    tokenizer.setPostProcessor(\n      templateProcessing('[CLS] $A [SEP]', '[CLS] $A [SEP] $B:1 [SEP]:1', [\n        ['[CLS]', tokenizer.tokenToId('[CLS]')],\n        ['[SEP]', tokenizer.tokenToId('[SEP]')],\n      ]),\n    )\n    // END init_template_processing\n    // START print_special_tokens\n    var output = await tokenizer.encode(\"Hello, y'all! How are you 😁 ?\")\n    console.log(output.getTokens())\n    // [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n    // END print_special_tokens\n    expect(output.getTokens()).toEqual([\n      '[CLS]',\n      'Hello',\n      ',',\n      'y',\n      \"'\",\n      'all',\n      '!',\n      'How',\n      'are',\n      'you',\n      '[UNK]',\n      '?',\n      '[SEP]',\n    ])\n    // START print_special_tokens_pair\n    var output = await tokenizer.encode(\"Hello, y'all!\", 'How are you 😁 ?')\n    console.log(output.getTokens())\n    // [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"[SEP]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n    // END print_special_tokens_pair\n    expect(output.getTokens()).toEqual([\n      '[CLS]',\n      'Hello',\n      ',',\n      'y',\n      \"'\",\n      'all',\n      '!',\n      '[SEP]',\n      'How',\n      'are',\n      'you',\n      '[UNK]',\n      '?',\n      '[SEP]',\n    ])\n    // START print_type_ids\n    console.log(output.getTypeIds())\n    // [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\n    // END print_type_ids\n    expect(output.getTypeIds()).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])\n    // START encode_batch\n\n    var output = await tokenizer.encodeBatch([\"Hello, y'all!\", 'How are you 😁 ?'])\n    // END encode_batch\n    // START encode_batch_pair\n    // var output = await tokenizer.encodeBatch(\n    //     [[\"Hello, y'all!\", \"How are you 😁 ?\"], [\"Hello to you too!\", \"I'm fine, thank you!\"]]\n    // );\n    // END encode_batch_pair\n    // START enable_padding\n    tokenizer.setPadding({ padId: 3, padToken: '[PAD]' })\n    // END enable_padding\n    // START print_batch_tokens\n    var output = await tokenizer.encodeBatch([\"Hello, y'all!\", 'How are you 😁 ?'])\n    console.log(output[1].getTokens())\n    // [\"[CLS]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\", \"[PAD]\"]\n    // END print_batch_tokens\n    expect(output[1].getTokens()).toEqual(['[CLS]', 'How', 'are', 'you', '[UNK]', '?', '[SEP]', '[PAD]'])\n    // START print_attention_mask\n    console.log(output[1].getAttentionMask())\n    // [1, 1, 1, 1, 1, 1, 1, 0]\n    // END print_attention_mask\n    expect(output[1].getAttentionMask()).toEqual([1, 1, 1, 1, 1, 1, 1, 0])\n  })\n})\n"
  },
  {
    "path": "bindings/node/index.d.ts",
    "content": "/* tslint:disable */\n/* eslint-disable */\n\n/* auto-generated by NAPI-RS */\n\nexport function bpeDecoder(suffix?: string | undefined | null): Decoder\nexport function byteFallbackDecoder(): Decoder\nexport function ctcDecoder(\n  padToken?: string = '<pad>',\n  wordDelimiterToken?: string | undefined | null,\n  cleanup?: boolean | undefined | null,\n): Decoder\nexport function fuseDecoder(): Decoder\nexport function metaspaceDecoder(\n  replacement?: string = '▁',\n  prependScheme?: prepend_scheme = 'always',\n  split?: split = true,\n): Decoder\nexport function replaceDecoder(pattern: string, content: string): Decoder\nexport function sequenceDecoder(decoders: Array<Decoder>): Decoder\nexport function stripDecoder(content: string, left: number, right: number): Decoder\nexport function wordPieceDecoder(prefix?: string = '##', cleanup?: bool = true): Decoder\nexport const enum TruncationDirection {\n  Left = 'Left',\n  Right = 'Right',\n}\nexport const enum TruncationStrategy {\n  LongestFirst = 'LongestFirst',\n  OnlyFirst = 'OnlyFirst',\n  OnlySecond = 'OnlySecond',\n}\nexport interface BpeOptions {\n  cacheCapacity?: number\n  dropout?: number\n  unkToken?: string\n  continuingSubwordPrefix?: string\n  endOfWordSuffix?: string\n  fuseUnk?: boolean\n  byteFallback?: boolean\n}\nexport interface WordPieceOptions {\n  unkToken?: string\n  continuingSubwordPrefix?: string\n  maxInputCharsPerWord?: number\n}\nexport interface WordLevelOptions {\n  unkToken?: string\n}\nexport interface UnigramOptions {\n  unkId?: number\n  byteFallback?: boolean\n}\nexport function prependNormalizer(prepend: string): Normalizer\nexport function stripAccentsNormalizer(): Normalizer\nexport interface BertNormalizerOptions {\n  cleanText?: boolean\n  handleChineseChars?: boolean\n  stripAccents?: boolean\n  lowercase?: boolean\n}\n/**\n * bert_normalizer(options?: {\n *   cleanText?: bool = true,\n *   handleChineseChars?: bool = true,\n *   stripAccents?: bool = true,\n *   lowercase?: bool = true\n * })\n */\nexport function bertNormalizer(options?: BertNormalizerOptions | undefined | null): Normalizer\nexport function nfdNormalizer(): Normalizer\nexport function nfkdNormalizer(): Normalizer\nexport function nfcNormalizer(): Normalizer\nexport function nfkcNormalizer(): Normalizer\nexport function stripNormalizer(left?: boolean | undefined | null, right?: boolean | undefined | null): Normalizer\nexport function sequenceNormalizer(normalizers: Array<Normalizer>): Normalizer\nexport function lowercase(): Normalizer\nexport function replace(pattern: string, content: string): Normalizer\nexport function nmt(): Normalizer\nexport function precompiled(bytes: Array<number>): Normalizer\nexport const enum JsSplitDelimiterBehavior {\n  Removed = 'Removed',\n  Isolated = 'Isolated',\n  MergedWithPrevious = 'MergedWithPrevious',\n  MergedWithNext = 'MergedWithNext',\n  Contiguous = 'Contiguous',\n}\n/** byte_level(addPrefixSpace: bool = true, useRegex: bool = true) */\nexport function byteLevelPreTokenizer(\n  addPrefixSpace?: boolean | undefined | null,\n  useRegex?: boolean | undefined | null,\n): PreTokenizer\nexport function byteLevelAlphabet(): Array<string>\nexport function whitespacePreTokenizer(): PreTokenizer\nexport function whitespaceSplitPreTokenizer(): PreTokenizer\nexport function bertPreTokenizer(): PreTokenizer\nexport function metaspacePreTokenizer(\n  replacement?: string = '▁',\n  prependScheme?: prepend_scheme = 'always',\n  split?: split = true,\n): PreTokenizer\nexport function splitPreTokenizer(pattern: string, behavior: string, invert?: boolean | undefined | null): PreTokenizer\nexport function punctuationPreTokenizer(behavior?: string | undefined | null): PreTokenizer\nexport function sequencePreTokenizer(preTokenizers: Array<PreTokenizer>): PreTokenizer\nexport function charDelimiterSplit(delimiter: string): PreTokenizer\nexport function digitsPreTokenizer(individualDigits?: boolean | undefined | null): PreTokenizer\nexport function bertProcessing(sep: [string, number], cls: [string, number]): Processor\nexport function robertaProcessing(\n  sep: [string, number],\n  cls: [string, number],\n  trimOffsets?: boolean | undefined | null,\n  addPrefixSpace?: boolean | undefined | null,\n): Processor\nexport function byteLevelProcessing(trimOffsets?: boolean | undefined | null): Processor\nexport function templateProcessing(\n  single: string,\n  pair?: string | undefined | null,\n  specialTokens?: Array<[string, number]> | undefined | null,\n): Processor\nexport function sequenceProcessing(processors: Array<Processor>): Processor\nexport const enum PaddingDirection {\n  Left = 0,\n  Right = 1,\n}\nexport interface PaddingOptions {\n  maxLength?: number\n  direction?: string | PaddingDirection\n  padToMultipleOf?: number\n  padId?: number\n  padTypeId?: number\n  padToken?: string\n}\nexport interface EncodeOptions {\n  isPretokenized?: boolean\n  addSpecialTokens?: boolean\n}\nexport interface TruncationOptions {\n  maxLength?: number\n  strategy?: TruncationStrategy\n  direction?: string | TruncationDirection\n  stride?: number\n}\nexport interface AddedTokenOptions {\n  singleWord?: boolean\n  leftStrip?: boolean\n  rightStrip?: boolean\n  normalized?: boolean\n}\nexport interface JsFromPretrainedParameters {\n  revision?: string\n  authToken?: string\n}\nexport function slice(s: string, beginIndex?: number | undefined | null, endIndex?: number | undefined | null): string\nexport function mergeEncodings(encodings: Array<Encoding>, growingOffsets?: boolean | undefined | null): Encoding\n/** Decoder */\nexport class Decoder {\n  decode(tokens: Array<string>): string\n}\nexport type JsEncoding = Encoding\nexport class Encoding {\n  constructor()\n  getLength(): number\n  getNSequences(): number\n  getIds(): Array<number>\n  getTypeIds(): Array<number>\n  getAttentionMask(): Array<number>\n  getSpecialTokensMask(): Array<number>\n  getTokens(): Array<string>\n  getOffsets(): Array<Array<number>>\n  getWordIds(): Array<number | undefined | null>\n  charToToken(pos: number, seqId?: number | undefined | null): number | null\n  charToWord(pos: number, seqId?: number | undefined | null): number | null\n  pad(length: number, options?: PaddingOptions | undefined | null): void\n  truncate(\n    length: number,\n    stride?: number | undefined | null,\n    direction?: string | TruncationDirection | undefined | null,\n  ): void\n  wordToTokens(word: number, seqId?: number | undefined | null): [number, number] | null | undefined\n  wordToChars(word: number, seqId?: number | undefined | null): [number, number] | null | undefined\n  tokenToChars(token: number): [number, [number, number]] | null | undefined\n  tokenToWord(token: number): number | null\n  getOverflowing(): Array<Encoding>\n  getSequenceIds(): Array<number | undefined | null>\n  tokenToSequence(token: number): number | null\n}\nexport class Model {}\nexport type Bpe = BPE\nexport class BPE {\n  static empty(): Model\n  static init(vocab: Vocab, merges: Merges, options?: BpeOptions | undefined | null): Model\n  static fromFile(vocab: string, merges: string, options?: BpeOptions | undefined | null): Promise<Model>\n}\nexport class WordPiece {\n  static init(vocab: Vocab, options?: WordPieceOptions | undefined | null): Model\n  static empty(): WordPiece\n  static fromFile(vocab: string, options?: WordPieceOptions | undefined | null): Promise<Model>\n}\nexport class WordLevel {\n  static init(vocab: Vocab, options?: WordLevelOptions | undefined | null): Model\n  static empty(): WordLevel\n  static fromFile(vocab: string, options?: WordLevelOptions | undefined | null): Promise<Model>\n}\nexport class Unigram {\n  static init(vocab: Array<[string, number]>, options?: UnigramOptions | undefined | null): Model\n  static empty(): Model\n}\n/** Normalizer */\nexport class Normalizer {\n  normalizeString(sequence: string): string\n}\n/** PreTokenizers */\nexport class PreTokenizer {\n  preTokenizeString(sequence: string): [string, [number, number]][]\n}\nexport class Processor {}\nexport class AddedToken {\n  constructor(token: string, isSpecial: boolean, options?: AddedTokenOptions | undefined | null)\n  getContent(): string\n}\nexport class Tokenizer {\n  constructor(model: Model)\n  setPreTokenizer(preTokenizer: PreTokenizer): void\n  setDecoder(decoder: Decoder): void\n  setModel(model: Model): void\n  setPostProcessor(postProcessor: Processor): void\n  setNormalizer(normalizer: Normalizer): void\n  save(path: string, pretty?: boolean | undefined | null): void\n  addAddedTokens(tokens: Array<AddedToken>): number\n  addTokens(tokens: Array<string>): number\n  encode(\n    sentence: InputSequence,\n    pair?: InputSequence | null,\n    encodeOptions?: EncodeOptions | undefined | null,\n  ): Promise<JsEncoding>\n  encodeBatch(sentences: EncodeInput[], encodeOptions?: EncodeOptions | undefined | null): Promise<JsEncoding[]>\n  decode(ids: Array<number>, skipSpecialTokens: boolean): Promise<string>\n  decodeBatch(ids: Array<Array<number>>, skipSpecialTokens: boolean): Promise<string[]>\n  static fromString(s: string): Tokenizer\n  static fromFile(file: string): Tokenizer\n  addSpecialTokens(tokens: Array<string>): void\n  setTruncation(maxLength: number, options?: TruncationOptions | undefined | null): void\n  disableTruncation(): void\n  setPadding(options?: PaddingOptions | undefined | null): void\n  disablePadding(): void\n  getDecoder(): Decoder | null\n  getNormalizer(): Normalizer | null\n  getPreTokenizer(): PreTokenizer | null\n  getPostProcessor(): Processor | null\n  getVocab(withAddedTokens?: boolean | undefined | null): Record<string, number>\n  getVocabSize(withAddedTokens?: boolean | undefined | null): number\n  idToToken(id: number): string | null\n  tokenToId(token: string): number | null\n  train(files: Array<string>): void\n  runningTasks(): number\n  postProcess(\n    encoding: Encoding,\n    pair?: Encoding | undefined | null,\n    addSpecialTokens?: boolean | undefined | null,\n  ): Encoding\n}\nexport class Trainer {}\n"
  },
  {
    "path": "bindings/node/index.js",
    "content": "/* tslint:disable */\n/* eslint-disable */\n/* prettier-ignore */\n\n/* auto-generated by NAPI-RS */\n\nconst { existsSync, readFileSync } = require('fs')\nconst { join } = require('path')\n\nconst { platform, arch } = process\n\nlet nativeBinding = null\nlet localFileExisted = false\nlet loadError = null\n\nfunction isMusl() {\n  // For Node 10\n  if (!process.report || typeof process.report.getReport !== 'function') {\n    try {\n      const lddPath = require('child_process').execSync('which ldd').toString().trim()\n      return readFileSync(lddPath, 'utf8').includes('musl')\n    } catch (e) {\n      return true\n    }\n  } else {\n    const { glibcVersionRuntime } = process.report.getReport().header\n    return !glibcVersionRuntime\n  }\n}\n\nswitch (platform) {\n  case 'android':\n    switch (arch) {\n      case 'arm64':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.android-arm64.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.android-arm64.node')\n          } else {\n            nativeBinding = require('tokenizers-android-arm64')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      case 'arm':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.android-arm-eabi.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.android-arm-eabi.node')\n          } else {\n            nativeBinding = require('tokenizers-android-arm-eabi')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      default:\n        throw new Error(`Unsupported architecture on Android ${arch}`)\n    }\n    break\n  case 'win32':\n    switch (arch) {\n      case 'x64':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.win32-x64-msvc.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.win32-x64-msvc.node')\n          } else {\n            nativeBinding = require('tokenizers-win32-x64-msvc')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      case 'ia32':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.win32-ia32-msvc.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.win32-ia32-msvc.node')\n          } else {\n            nativeBinding = require('tokenizers-win32-ia32-msvc')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      case 'arm64':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.win32-arm64-msvc.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.win32-arm64-msvc.node')\n          } else {\n            nativeBinding = require('tokenizers-win32-arm64-msvc')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      default:\n        throw new Error(`Unsupported architecture on Windows: ${arch}`)\n    }\n    break\n  case 'darwin':\n    localFileExisted = existsSync(join(__dirname, 'tokenizers.darwin-universal.node'))\n    try {\n      if (localFileExisted) {\n        nativeBinding = require('./tokenizers.darwin-universal.node')\n      } else {\n        nativeBinding = require('tokenizers-darwin-universal')\n      }\n      break\n    } catch {}\n    switch (arch) {\n      case 'x64':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.darwin-x64.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.darwin-x64.node')\n          } else {\n            nativeBinding = require('tokenizers-darwin-x64')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      case 'arm64':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.darwin-arm64.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.darwin-arm64.node')\n          } else {\n            nativeBinding = require('tokenizers-darwin-arm64')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      default:\n        throw new Error(`Unsupported architecture on macOS: ${arch}`)\n    }\n    break\n  case 'freebsd':\n    if (arch !== 'x64') {\n      throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)\n    }\n    localFileExisted = existsSync(join(__dirname, 'tokenizers.freebsd-x64.node'))\n    try {\n      if (localFileExisted) {\n        nativeBinding = require('./tokenizers.freebsd-x64.node')\n      } else {\n        nativeBinding = require('tokenizers-freebsd-x64')\n      }\n    } catch (e) {\n      loadError = e\n    }\n    break\n  case 'linux':\n    switch (arch) {\n      case 'x64':\n        if (isMusl()) {\n          localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-x64-musl.node'))\n          try {\n            if (localFileExisted) {\n              nativeBinding = require('./tokenizers.linux-x64-musl.node')\n            } else {\n              nativeBinding = require('tokenizers-linux-x64-musl')\n            }\n          } catch (e) {\n            loadError = e\n          }\n        } else {\n          localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-x64-gnu.node'))\n          try {\n            if (localFileExisted) {\n              nativeBinding = require('./tokenizers.linux-x64-gnu.node')\n            } else {\n              nativeBinding = require('tokenizers-linux-x64-gnu')\n            }\n          } catch (e) {\n            loadError = e\n          }\n        }\n        break\n      case 'arm64':\n        if (isMusl()) {\n          localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-arm64-musl.node'))\n          try {\n            if (localFileExisted) {\n              nativeBinding = require('./tokenizers.linux-arm64-musl.node')\n            } else {\n              nativeBinding = require('tokenizers-linux-arm64-musl')\n            }\n          } catch (e) {\n            loadError = e\n          }\n        } else {\n          localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-arm64-gnu.node'))\n          try {\n            if (localFileExisted) {\n              nativeBinding = require('./tokenizers.linux-arm64-gnu.node')\n            } else {\n              nativeBinding = require('tokenizers-linux-arm64-gnu')\n            }\n          } catch (e) {\n            loadError = e\n          }\n        }\n        break\n      case 'arm':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-arm-gnueabihf.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.linux-arm-gnueabihf.node')\n          } else {\n            nativeBinding = require('tokenizers-linux-arm-gnueabihf')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      case 'riscv64':\n        if (isMusl()) {\n          localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-riscv64-musl.node'))\n          try {\n            if (localFileExisted) {\n              nativeBinding = require('./tokenizers.linux-riscv64-musl.node')\n            } else {\n              nativeBinding = require('tokenizers-linux-riscv64-musl')\n            }\n          } catch (e) {\n            loadError = e\n          }\n        } else {\n          localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-riscv64-gnu.node'))\n          try {\n            if (localFileExisted) {\n              nativeBinding = require('./tokenizers.linux-riscv64-gnu.node')\n            } else {\n              nativeBinding = require('tokenizers-linux-riscv64-gnu')\n            }\n          } catch (e) {\n            loadError = e\n          }\n        }\n        break\n      case 's390x':\n        localFileExisted = existsSync(join(__dirname, 'tokenizers.linux-s390x-gnu.node'))\n        try {\n          if (localFileExisted) {\n            nativeBinding = require('./tokenizers.linux-s390x-gnu.node')\n          } else {\n            nativeBinding = require('tokenizers-linux-s390x-gnu')\n          }\n        } catch (e) {\n          loadError = e\n        }\n        break\n      default:\n        throw new Error(`Unsupported architecture on Linux: ${arch}`)\n    }\n    break\n  default:\n    throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)\n}\n\nif (!nativeBinding) {\n  if (loadError) {\n    throw loadError\n  }\n  throw new Error(`Failed to load native binding`)\n}\n\nconst {\n  Decoder,\n  bpeDecoder,\n  byteFallbackDecoder,\n  ctcDecoder,\n  fuseDecoder,\n  metaspaceDecoder,\n  replaceDecoder,\n  sequenceDecoder,\n  stripDecoder,\n  wordPieceDecoder,\n  Encoding,\n  TruncationDirection,\n  TruncationStrategy,\n  Model,\n  BPE,\n  WordPiece,\n  WordLevel,\n  Unigram,\n  Normalizer,\n  prependNormalizer,\n  stripAccentsNormalizer,\n  bertNormalizer,\n  nfdNormalizer,\n  nfkdNormalizer,\n  nfcNormalizer,\n  nfkcNormalizer,\n  stripNormalizer,\n  sequenceNormalizer,\n  lowercase,\n  replace,\n  nmt,\n  precompiled,\n  JsSplitDelimiterBehavior,\n  PreTokenizer,\n  byteLevelPreTokenizer,\n  byteLevelAlphabet,\n  whitespacePreTokenizer,\n  whitespaceSplitPreTokenizer,\n  bertPreTokenizer,\n  metaspacePreTokenizer,\n  splitPreTokenizer,\n  punctuationPreTokenizer,\n  sequencePreTokenizer,\n  charDelimiterSplit,\n  digitsPreTokenizer,\n  Processor,\n  bertProcessing,\n  robertaProcessing,\n  byteLevelProcessing,\n  templateProcessing,\n  sequenceProcessing,\n  PaddingDirection,\n  AddedToken,\n  Tokenizer,\n  Trainer,\n  slice,\n  mergeEncodings,\n} = nativeBinding\n\nmodule.exports.Decoder = Decoder\nmodule.exports.bpeDecoder = bpeDecoder\nmodule.exports.byteFallbackDecoder = byteFallbackDecoder\nmodule.exports.ctcDecoder = ctcDecoder\nmodule.exports.fuseDecoder = fuseDecoder\nmodule.exports.metaspaceDecoder = metaspaceDecoder\nmodule.exports.replaceDecoder = replaceDecoder\nmodule.exports.sequenceDecoder = sequenceDecoder\nmodule.exports.stripDecoder = stripDecoder\nmodule.exports.wordPieceDecoder = wordPieceDecoder\nmodule.exports.Encoding = Encoding\nmodule.exports.TruncationDirection = TruncationDirection\nmodule.exports.TruncationStrategy = TruncationStrategy\nmodule.exports.Model = Model\nmodule.exports.BPE = BPE\nmodule.exports.WordPiece = WordPiece\nmodule.exports.WordLevel = WordLevel\nmodule.exports.Unigram = Unigram\nmodule.exports.Normalizer = Normalizer\nmodule.exports.prependNormalizer = prependNormalizer\nmodule.exports.stripAccentsNormalizer = stripAccentsNormalizer\nmodule.exports.bertNormalizer = bertNormalizer\nmodule.exports.nfdNormalizer = nfdNormalizer\nmodule.exports.nfkdNormalizer = nfkdNormalizer\nmodule.exports.nfcNormalizer = nfcNormalizer\nmodule.exports.nfkcNormalizer = nfkcNormalizer\nmodule.exports.stripNormalizer = stripNormalizer\nmodule.exports.sequenceNormalizer = sequenceNormalizer\nmodule.exports.lowercase = lowercase\nmodule.exports.replace = replace\nmodule.exports.nmt = nmt\nmodule.exports.precompiled = precompiled\nmodule.exports.JsSplitDelimiterBehavior = JsSplitDelimiterBehavior\nmodule.exports.PreTokenizer = PreTokenizer\nmodule.exports.byteLevelPreTokenizer = byteLevelPreTokenizer\nmodule.exports.byteLevelAlphabet = byteLevelAlphabet\nmodule.exports.whitespacePreTokenizer = whitespacePreTokenizer\nmodule.exports.whitespaceSplitPreTokenizer = whitespaceSplitPreTokenizer\nmodule.exports.bertPreTokenizer = bertPreTokenizer\nmodule.exports.metaspacePreTokenizer = metaspacePreTokenizer\nmodule.exports.splitPreTokenizer = splitPreTokenizer\nmodule.exports.punctuationPreTokenizer = punctuationPreTokenizer\nmodule.exports.sequencePreTokenizer = sequencePreTokenizer\nmodule.exports.charDelimiterSplit = charDelimiterSplit\nmodule.exports.digitsPreTokenizer = digitsPreTokenizer\nmodule.exports.Processor = Processor\nmodule.exports.bertProcessing = bertProcessing\nmodule.exports.robertaProcessing = robertaProcessing\nmodule.exports.byteLevelProcessing = byteLevelProcessing\nmodule.exports.templateProcessing = templateProcessing\nmodule.exports.sequenceProcessing = sequenceProcessing\nmodule.exports.PaddingDirection = PaddingDirection\nmodule.exports.AddedToken = AddedToken\nmodule.exports.Tokenizer = Tokenizer\nmodule.exports.Trainer = Trainer\nmodule.exports.slice = slice\nmodule.exports.mergeEncodings = mergeEncodings\n"
  },
  {
    "path": "bindings/node/jest.config.js",
    "content": "/* eslint-disable prettier/prettier */\n// For a detailed explanation regarding each configuration property, visit:\n// https://jestjs.io/docs/en/configuration.html\n\nmodule.exports = {\n  // All imported modules in your tests should be mocked automatically\n  // automock: false,\n\n  // Stop running tests after `n` failures\n  // bail: 0,\n\n  // Respect \"browser\" field in package.json when resolving modules\n  // browser: false,\n\n  // The directory where Jest should store its cached dependency information\n  // cacheDirectory: \"/private/var/folders/y_/n6h0fkqn3m57bg_ktk25j7rm0000gn/T/jest_dx\",\n\n  // Automatically clear mock calls and instances between every test\n  // clearMocks: false,\n\n  // Indicates whether the coverage information should be collected while executing the test\n  // collectCoverage: false,\n\n  // An array of glob patterns indicating a set of files for which coverage information should be collected\n  // collectCoverageFrom: null,\n\n  // The directory where Jest should output its coverage files\n  // coverageDirectory: null,\n\n  // An array of regexp pattern strings used to skip coverage collection\n  // coveragePathIgnorePatterns: [\n  //   \"/node_modules/\"\n  // ],\n\n  // A list of reporter names that Jest uses when writing coverage reports\n  // coverageReporters: [\n  //   \"json\",\n  //   \"text\",\n  //   \"lcov\",\n  //   \"clover\"\n  // ],\n\n  // An object that configures minimum threshold enforcement for coverage results\n  // coverageThreshold: null,\n\n  // A path to a custom dependency extractor\n  // dependencyExtractor: null,\n\n  // Make calling deprecated APIs throw helpful error messages\n  // errorOnDeprecated: false,\n\n  // Force coverage collection from ignored files using an array of glob patterns\n  // forceCoverageMatch: [],\n\n  // A path to a module which exports an async function that is triggered once before all test suites\n  // globalSetup: null,\n\n  // A path to a module which exports an async function that is triggered once after all test suites\n  // globalTeardown: null,\n\n  // A set of global variables that need to be available in all test environments\n  // globals: {},\n\n  // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.\n  // maxWorkers: \"50%\",\n\n  // An array of directory names to be searched recursively up from the requiring module's location\n  // moduleDirectories: [\n  //   \"node_modules\"\n  // ],\n\n  // An array of file extensions your modules use\n  // moduleFileExtensions: [\n  //   \"js\",\n  //   \"json\",\n  //   \"jsx\",\n  //   \"ts\",\n  //   \"tsx\",\n  //   \"node\"\n  // ],\n\n  // A map from regular expressions to module names that allow to stub out resources with a single module\n  // moduleNameMapper: {},\n\n  // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader\n  // modulePathIgnorePatterns: [],\n\n  // Activates notifications for test results\n  // notify: false,\n\n  // An enum that specifies notification mode. Requires { notify: true }\n  // notifyMode: \"failure-change\",\n\n  // A preset that is used as a base for Jest's configuration\n  preset: 'ts-jest',\n\n  // Run tests from one or more projects\n  // projects: null,\n\n  // Use this configuration option to add custom reporters to Jest\n  // reporters: undefined,\n\n  // Automatically reset mock state between every test\n  // resetMocks: false,\n\n  // Reset the module registry before running each individual test\n  // resetModules: false,\n\n  // A path to a custom resolver\n  // resolver: null,\n\n  // Automatically restore mock state between every test\n  // restoreMocks: false,\n\n  // The root directory that Jest should scan for tests and modules within\n  // rootDir: null,\n\n  // A list of paths to directories that Jest should use to search for files in\n  // roots: [\n  //   \"<rootDir>\"\n  // ],\n\n  // Allows you to use a custom runner instead of Jest's default test runner\n  // runner: \"jest-runner\",\n\n  // The paths to modules that run some code to configure or set up the testing environment before each test\n  // setupFiles: [],\n\n  // A list of paths to modules that run some code to configure or set up the testing framework before each test\n  // setupFilesAfterEnv: [],\n\n  // A list of paths to snapshot serializer modules Jest should use for snapshot testing\n  // snapshotSerializers: [],\n\n  // The test environment that will be used for testing\n  testEnvironment: 'node',\n\n  // Options that will be passed to the testEnvironment\n  // testEnvironmentOptions: {},\n\n  // Adds a location field to test results\n  // testLocationInResults: false,\n\n  // The glob patterns Jest uses to detect test files\n  // testMatch: [\n  //   \"**/__tests__/**/*.[jt]s?(x)\",\n  //   \"**/?(*.)+(spec|test).[tj]s?(x)\"\n  // ],\n\n  // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped\n  testPathIgnorePatterns: ['/node_modules/', '/dist/'],\n\n  // The regexp pattern or array of patterns that Jest uses to detect test files\n  // testRegex: [],\n\n  // This option allows the use of a custom results processor\n  // testResultsProcessor: null,\n\n  // This option allows use of a custom test runner\n  // testRunner: \"jasmine2\",\n\n  // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href\n  // testURL: \"http://localhost\",\n\n  // Setting this value to \"fake\" allows the use of fake timers for functions such as \"setTimeout\"\n  // timers: \"real\",\n\n  // A map from regular expressions to paths to transformers\n  // transform: null,\n\n  // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation\n  // transformIgnorePatterns: [\n  //   \"/node_modules/\"\n  // ],\n\n  // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them\n  // unmockedModulePathPatterns: undefined,\n\n  // Indicates whether each individual test should be reported during the run\n  // verbose: null,\n\n  // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode\n  watchPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/native/', '<rootDir>/dist/', '<rootDir>/build/'],\n\n  // Whether to use watchman for file crawling\n  // watchman: true,\n}\n"
  },
  {
    "path": "bindings/node/lib/bindings/__mocks__/merges.txt",
    "content": ""
  },
  {
    "path": "bindings/node/lib/bindings/__mocks__/vocab.json",
    "content": "{}\n"
  },
  {
    "path": "bindings/node/lib/bindings/__mocks__/vocab.txt",
    "content": "my\nname\nis\njo\n##hn\nwhat\nyours\npair\n[UNK]\n"
  },
  {
    "path": "bindings/node/lib/bindings/decoders.test.ts",
    "content": "import {\n  bpeDecoder,\n  byteFallbackDecoder,\n  ctcDecoder,\n  fuseDecoder,\n  metaspaceDecoder,\n  replaceDecoder,\n  sequenceDecoder,\n  stripDecoder,\n  wordPieceDecoder,\n} from '../../'\n\ndescribe('wordPieceDecoder', () => {\n  it('accepts `undefined` as first parameter', () => {\n    expect(wordPieceDecoder(undefined)).toBeDefined()\n  })\n\n  it('accepts `undefined` as second parameter', () => {\n    expect(wordPieceDecoder('test', undefined)).toBeDefined()\n  })\n\n  it('can decode arrays of strings', () => {\n    expect(wordPieceDecoder().decode(['Hel', '##lo', 'there', 'my', 'fr', '##iend'])).toEqual('Hello there my friend')\n  })\n})\n\ndescribe('byteFallbackDecoder', () => {\n  it('accepts `undefined` as first parameter', () => {\n    expect(byteFallbackDecoder()).toBeDefined()\n  })\n\n  it('can decode arrays of strings', () => {\n    expect(byteFallbackDecoder().decode(['Hel', 'lo'])).toEqual('Hello')\n    expect(byteFallbackDecoder().decode(['<0x61>'])).toEqual('a')\n    expect(byteFallbackDecoder().decode(['<0x61>'])).toEqual('a')\n    expect(byteFallbackDecoder().decode(['My', ' na', 'me'])).toEqual('My name')\n    expect(byteFallbackDecoder().decode(['<0x61>'])).toEqual('a')\n    expect(byteFallbackDecoder().decode(['<0xE5>'])).toEqual('�')\n    expect(byteFallbackDecoder().decode(['<0xE5>', '<0x8f>'])).toEqual('��')\n    expect(byteFallbackDecoder().decode(['<0xE5>', '<0x8f>', '<0xab>'])).toEqual('叫')\n    expect(byteFallbackDecoder().decode(['<0xE5>', '<0x8f>', 'a'])).toEqual('��a')\n    expect(byteFallbackDecoder().decode(['<0xE5>', '<0x8f>', '<0xab>', 'a'])).toEqual('叫a')\n  })\n})\n\ndescribe('replaceDecoder', () => {\n  it('can decode arrays of strings', () => {\n    expect(replaceDecoder('_', ' ').decode(['Hello', '_Hello'])).toEqual('Hello Hello')\n  })\n})\n\ndescribe('fuseDecoder', () => {\n  it('accepts `undefined` as first parameter', () => {\n    expect(fuseDecoder()).toBeDefined()\n  })\n\n  it('can decode arrays of strings', () => {\n    expect(fuseDecoder().decode(['Hel', 'lo'])).toEqual('Hello')\n  })\n})\n\ndescribe('stripDecoder', () => {\n  it('accepts `undefined` as first parameter', () => {\n    expect(stripDecoder('_', 0, 0)).toBeDefined()\n  })\n\n  it('can decode arrays of strings', () => {\n    expect(stripDecoder('_', 1, 0).decode(['_Hel', 'lo', '__there'])).toEqual('Hello_there')\n  })\n})\n\ndescribe('metaspaceDecoder', () => {\n  it('accepts `undefined` as first parameter', () => {\n    expect(metaspaceDecoder(undefined)).toBeDefined()\n  })\n\n  it('accepts `undefined` as second parameter', () => {\n    expect(metaspaceDecoder('t', undefined)).toBeDefined()\n  })\n  it('works', () => {\n    expect(metaspaceDecoder().decode(['▁Hello'])).toEqual('Hello')\n  })\n})\n\ndescribe('bpeDecoder', () => {\n  it('accepts `undefined` as parameter', () => {\n    expect(bpeDecoder(undefined)).toBeDefined()\n  })\n})\n\ndescribe('ctcDecoder', () => {\n  it('accepts `undefined` as parameter', () => {\n    expect(ctcDecoder(undefined)).toBeDefined()\n  })\n  it('encodes correctly', () => {\n    expect(ctcDecoder().decode(['<pad>', 'h', 'h', 'e', 'e', 'l', 'l', '<pad>', 'l', 'l', 'o'])).toEqual('hello')\n  })\n})\n\ndescribe('sequenceDecoder', () => {\n  it('accepts `empty list` as parameter', () => {\n    expect(sequenceDecoder([])).toBeDefined()\n  })\n  it('encodes correctly', () => {\n    expect(\n      sequenceDecoder([ctcDecoder(), metaspaceDecoder()]).decode(['▁', '▁', 'H', 'H', 'i', 'i', '▁', 'y', 'o', 'u']),\n    ).toEqual('Hi you')\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/encoding.test.ts",
    "content": "import {\n  PaddingDirection,\n  WordPiece,\n  punctuationPreTokenizer,\n  sequencePreTokenizer,\n  whitespacePreTokenizer,\n  Encoding,\n  EncodeOptions,\n  Tokenizer,\n} from '../../'\nimport { InputSequence } from '../../types'\n\nconst MOCKS_DIR = __dirname + '/__mocks__'\n\ndescribe('Can modify pretokenizers on the fly', () => {\n  let encoding: Encoding\n  let encode: (\n    sequence: InputSequence,\n    pair?: InputSequence | null,\n    options?: EncodeOptions | null,\n  ) => Promise<Encoding>\n  let tokenizer: Tokenizer\n\n  beforeAll(async () => {\n    const model = await WordPiece.fromFile(`${MOCKS_DIR}/vocab.txt`, {\n      continuingSubwordPrefix: '##',\n    })\n\n    tokenizer = new Tokenizer(model)\n    encode = tokenizer.encode.bind(tokenizer)\n  })\n\n  it('Can change pre tokenizer', async () => {\n    const input = 'my  name is john.!?'\n    tokenizer.setPreTokenizer(sequencePreTokenizer([whitespacePreTokenizer()]))\n\n    encoding = await encode(input, null)\n    expect(encoding.getIds()).toEqual([0, 1, 2, 3, 4, 8])\n\n    // Change pre tokenizer\n    tokenizer.setPreTokenizer(sequencePreTokenizer([whitespacePreTokenizer(), punctuationPreTokenizer()]))\n\n    encoding = await encode(input, null)\n    expect(encoding.getIds()).toEqual([0, 1, 2, 3, 4, 8, 8, 8])\n  })\n})\n\ndescribe('Encoding', () => {\n  const originalString = 'my name is john'\n  const originalPairString = 'what is yours?'\n  let encoding: Encoding\n  let encodingDual: Encoding\n  let encode: (\n    sequence: InputSequence,\n    pair?: InputSequence | null,\n    options?: EncodeOptions | null,\n  ) => Promise<Encoding>\n\n  beforeAll(async () => {\n    const model = await WordPiece.fromFile(`${MOCKS_DIR}/vocab.txt`, {\n      continuingSubwordPrefix: '##',\n    })\n\n    const tokenizer = new Tokenizer(model)\n    tokenizer.setPreTokenizer(whitespacePreTokenizer())\n    encode = tokenizer.encode.bind(tokenizer)\n  })\n\n  beforeEach(async () => {\n    encoding = await encode(originalString, null)\n    encodingDual = await encode(originalString, originalPairString)\n  })\n\n  it('has a list of defined methods', () => {\n    expect(typeof encoding.wordToTokens).toBe('function')\n    expect(typeof encoding.wordToChars).toBe('function')\n    expect(typeof encoding.tokenToChars).toBe('function')\n    expect(typeof encoding.tokenToWord).toBe('function')\n    expect(typeof encoding.charToToken).toBe('function')\n    expect(typeof encoding.charToWord).toBe('function')\n    expect(typeof encoding.getAttentionMask).toBe('function')\n    expect(typeof encoding.getIds).toBe('function')\n    expect(typeof encoding.getLength).toBe('function')\n    expect(typeof encoding.getOffsets).toBe('function')\n    expect(typeof encoding.getOverflowing).toBe('function')\n    expect(typeof encoding.getSpecialTokensMask).toBe('function')\n    expect(typeof encoding.getTokens).toBe('function')\n    expect(typeof encoding.getTypeIds).toBe('function')\n    expect(typeof encoding.getWordIds).toBe('function')\n    expect(typeof encoding.getSequenceIds).toBe('function')\n    expect(typeof encoding.pad).toBe('function')\n    expect(typeof encoding.truncate).toBe('function')\n  })\n\n  describe('truncate', () => {\n    it('accepts `undefined` as second parameter', () => {\n      expect(encoding.truncate(10, undefined)).toBeUndefined()\n    })\n    it('should throw an Error on invalid direction', () => {\n      const t = () => encoding.truncate(10, 3, 'not_valid')\n      expect(t).toThrow(`not_valid is not a valid truncation direction`)\n    })\n  })\n\n  describe('getWordIds', () => {\n    it('returns the correct list of indexes', () => {\n      const indexes = encoding.getWordIds()\n      expect(indexes).toEqual([0, 1, 2, 3, 3])\n    })\n  })\n\n  describe('getSequenceIds', () => {\n    it('returns the correct list of indexes', () => {\n      expect(encoding.getSequenceIds()).toEqual([0, 0, 0, 0, 0])\n      expect(encodingDual.getSequenceIds()).toEqual([0, 0, 0, 0, 0, 1, 1, 1, 1])\n    })\n  })\n\n  describe('wordToTokens', () => {\n    it('returns the correct indexes', () => {\n      const indexes = encoding.wordToTokens(3)\n      expect(indexes).toEqual([3, 5])\n    })\n\n    it('returns the correct indexes with pair sequences', () => {\n      expect(encodingDual.wordToTokens(3, 0)).toEqual([3, 5])\n      expect(encodingDual.wordToTokens(3, 1)).toEqual([8, 9])\n    })\n\n    it('returns undefined when out of range word', () => {\n      const index = encoding.wordToTokens(100)\n      expect(index).toBeNull()\n    })\n  })\n\n  describe('wordToChars', () => {\n    it('returns the correct offsets', () => {\n      const offsets = encoding.wordToChars(3)\n      expect(offsets).toEqual([11, 15])\n    })\n\n    it('returns the correct offsets with pair sequences', () => {\n      expect(encodingDual.wordToChars(3, 0)).toEqual([11, 15])\n      expect(encodingDual.wordToChars(3, 1)).toEqual([13, 14])\n    })\n\n    it('returns undefined when out of range word', () => {\n      const offsets = encoding.wordToChars(100)\n      expect(offsets).toBeNull()\n    })\n  })\n\n  describe('tokenToSequence', () => {\n    it('returns the correct value', () => {\n      expect(encodingDual.tokenToSequence(4)).toEqual(0)\n      expect(encodingDual.tokenToSequence(6)).toEqual(1)\n    })\n  })\n\n  describe('tokenToChars', () => {\n    it('returns the correct offsets', () => {\n      const offsets = encoding.tokenToChars(3)\n      expect(offsets).toEqual([11, 13])\n    })\n\n    it('returns the correct offsets with pair sequences', () => {\n      expect(encodingDual.tokenToChars(3)).toEqual([11, 13])\n      expect(encodingDual.tokenToChars(7)).toEqual([8, 13])\n    })\n\n    it('returns undefined when out of range token', () => {\n      const offsets = encoding.tokenToChars(100)\n      expect(offsets).toBeNull()\n    })\n  })\n\n  describe('tokenToWord', () => {\n    it('returns the correct index', () => {\n      const index = encoding.tokenToWord(3)\n      expect(index).toEqual(3)\n    })\n\n    it('returns the correct index with pair sequences', () => {\n      expect(encodingDual.tokenToWord(3)).toEqual(3)\n      expect(encodingDual.tokenToWord(7)).toEqual(2)\n    })\n\n    it('returns undefined when out of range token', () => {\n      const index = encoding.tokenToWord(100)\n      expect(index).toBeNull()\n    })\n  })\n\n  describe('charToToken', () => {\n    it('returns the correct index', () => {\n      const index = encoding.charToToken(3)\n      expect(index).toEqual(1)\n    })\n\n    it('returns the correct index with pair sequences', () => {\n      expect(encodingDual.charToToken(3, 0)).toEqual(1)\n      expect(encodingDual.charToToken(3, 1)).toEqual(5)\n    })\n\n    it('returns undefined when out of range char', () => {\n      const index = encoding.charToToken(100)\n      expect(index).toBeNull()\n    })\n  })\n\n  describe('charToWord', () => {\n    it('returns the correct index', () => {\n      const index = encoding.charToWord(3)\n      expect(index).toEqual(1)\n    })\n\n    it('returns the correct index with pair sequences', () => {\n      expect(encodingDual.charToWord(3, 0)).toEqual(1)\n      expect(encodingDual.charToWord(3, 1)).toEqual(0)\n    })\n\n    it('returns undefined when out of range char', () => {\n      const index = encoding.charToWord(100)\n      expect(index).toBeNull()\n    })\n  })\n\n  describe('pad', () => {\n    it('works correctly with only one parameter', () => {\n      encoding.pad(10)\n      expect(encoding.getTokens()).toHaveLength(10)\n    })\n\n    it('accepts `undefined` as second parameter', () => {\n      encoding.pad(10, undefined)\n      expect(encoding.getTokens()).toHaveLength(10)\n    })\n\n    it('accepts options as second parameter', () => {\n      encoding.pad(10, {\n        direction: PaddingDirection.Left,\n        padToken: '[PA]',\n        padTypeId: 10,\n        padId: 400,\n      })\n\n      const tokens = encoding.getTokens()\n      expect(tokens).toHaveLength(10)\n      expect(tokens[0]).toBe('[PA]')\n      expect(encoding.getTypeIds()[0]).toBe(10)\n      expect(encoding.getIds()[0]).toBe(400)\n    })\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/models.test.ts",
    "content": "/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { BPE, Unigram, WordPiece } from '../../'\n\nconst MOCKS_DIR = __dirname + '/__mocks__'\n\ndescribe('WordPiece', () => {\n  describe('fromFile', () => {\n    it('throws if called with only one argument', () => {\n      expect(() => (WordPiece as any).fromFile()).toThrow(\n        'Failed to convert JavaScript value `Undefined` into rust type `String`',\n      )\n    })\n\n    it('throws if called with 2 arguments without a callback as third argument', () => {\n      expect(() => (WordPiece as any).fromFile({})).toThrow(\n        'Failed to convert JavaScript value `Object {}` into rust type `String`',\n      )\n    })\n\n    it('has its callback called with the loaded model', async () => {\n      const model = await WordPiece.fromFile(`${MOCKS_DIR}/vocab.txt`)\n      expect(model).toBeDefined()\n    })\n  })\n})\n\ndescribe('BPE', () => {\n  describe('fromFile', () => {\n    it('has its callback called with the loaded model', async () => {\n      const model = await BPE.fromFile(`${MOCKS_DIR}/vocab.json`, `${MOCKS_DIR}/merges.txt`)\n      expect(model).toBeDefined()\n    })\n\n    it('has its callback called with the loaded model', async () => {\n      const model = await BPE.fromFile(`${MOCKS_DIR}/vocab.json`, `${MOCKS_DIR}/merges.txt`, {})\n      expect(model).toBeDefined()\n    })\n  })\n  describe('When initialized from memory', () => {\n    it('returns the loaded Model', () => {\n      const bpe = BPE.init({ a: 0, b: 1, ab: 2 }, [['a', 'b']])\n      // expect(bpe.constructor.name).toEqual(\"Model\");\n      expect(bpe.constructor.name).toEqual('BPE')\n    })\n  })\n})\n\ndescribe('Unigram', () => {\n  it('can be initialized from memory', () => {\n    const unigram = Unigram.init(\n      [\n        ['<unk>', 0],\n        ['Hello', -1],\n        ['there', -2],\n      ],\n      {\n        unkId: 0,\n      },\n    )\n    expect(unigram.constructor.name).toEqual('Unigram')\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/normalizers.test.ts",
    "content": "import { prependNormalizer, stripAccentsNormalizer, stripNormalizer } from '../../'\n\ndescribe('stripNormalizer', () => {\n  it('instantiates with no parameters', () => {\n    const normalizer = stripNormalizer()\n    expect(normalizer.constructor.name).toEqual('Normalizer')\n  })\n\n  it('accepts `undefined` as first parameter', () => {\n    expect(stripNormalizer(undefined)).toBeDefined()\n  })\n\n  it('accepts `undefined` as second parameter', () => {\n    expect(stripNormalizer(false, undefined)).toBeDefined()\n  })\n\n  it('instantiates with one parameter', () => {\n    const normalizer = stripNormalizer(false)\n    expect(normalizer.constructor.name).toEqual('Normalizer')\n  })\n\n  it('instantiates with two parameters', () => {\n    const normalizer = stripNormalizer(false, true)\n    expect(normalizer.constructor.name).toEqual('Normalizer')\n  })\n\n  it('prepend instantiates with one parameter', () => {\n    const normalizer = prependNormalizer('_')\n    expect(normalizer.constructor.name).toEqual('Normalizer')\n    expect(normalizer.normalizeString('Hello')).toEqual('_Hello')\n  })\n\n  it('can normalize strings', () => {\n    const normalizer = stripNormalizer()\n    expect(normalizer.normalizeString('     Hello there   ')).toEqual('Hello there')\n  })\n})\n\ndescribe('stripAccentsNormalizer', () => {\n  it('initialize', () => {\n    const normalizer = stripAccentsNormalizer()\n    expect(normalizer.constructor.name).toEqual('Normalizer')\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/post-processors.test.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { bertProcessing, byteLevelProcessing, robertaProcessing, sequenceProcessing, templateProcessing } from '../../'\n\ndescribe('bertProcessing', () => {\n  it('instantiates correctly with only two parameters', () => {\n    const processor = bertProcessing(['sep', 1], ['cls', 2])\n    expect(processor.constructor.name).toEqual('Processor')\n  })\n\n  it('throws if only one argument is provided', () => {\n    expect(() => (bertProcessing as any)(['sep', 1])).toThrow('Given napi value is not an array')\n  })\n\n  it('throws if arguments are malformed', () => {\n    expect(() => (bertProcessing as any)(['sep', '1'], ['cls', '2'])).toThrow(\n      'Failed to convert napi value String into rust type `u32`',\n    )\n    expect(() => (bertProcessing as any)(['sep'], ['cls'])).toThrow('Array length < 2')\n  })\n})\n\ndescribe('byteLevelProcessing', () => {\n  it('instantiates correctly without any parameter', () => {\n    const processor = byteLevelProcessing()\n    expect(processor.constructor.name).toEqual('Processor')\n  })\n\n  it('accepts `undefined` as first parameter', () => {\n    expect(byteLevelProcessing(undefined)).toBeDefined()\n  })\n\n  it('accepts `boolean` as first parameter', () => {\n    expect(byteLevelProcessing(true)).toBeDefined()\n  })\n})\n\ndescribe('robertaProcessing', () => {\n  it('instantiates correctly with only two parameters', () => {\n    const processor = robertaProcessing(['sep', 1], ['cls', 2])\n    expect(processor.constructor.name).toEqual('Processor')\n  })\n\n  it('accepts `undefined` as third and fourth parameters', () => {\n    expect(robertaProcessing(['sep', 1], ['cls', 2], undefined, undefined)).toBeDefined()\n  })\n\n  it('accepts `boolean` as third and fourth parameter', () => {\n    expect(robertaProcessing(['sep', 1], ['cls', 2], true, true)).toBeDefined()\n  })\n})\n\ndescribe('templateProcessing', () => {\n  it('instantiates correctly with only a single template', () => {\n    const processor = templateProcessing('$A $A')\n    expect(processor.constructor.name).toEqual('Processor')\n  })\n\n  it('throws if special tokens are missing', () => {\n    expect(() => templateProcessing('[CLS] $A [SEP]')).toThrow('Missing SpecialToken(s) with id(s)')\n  })\n\n  it('instantiates correctly with both templates', () => {\n    const processor = templateProcessing('[CLS] $A [SEP]', '[CLS] $A [SEP] $B:1 [SEP]:1', [\n      ['[CLS]', 1],\n      ['[SEP]', 2],\n    ])\n    expect(processor.constructor.name).toEqual('Processor')\n  })\n})\n\ndescribe('sequenceProcessing', () => {\n  it('accepts `PostProcessor[]` as first parameter', () => {\n    const template = templateProcessing('[CLS] $A [SEP]', '[CLS] $A [SEP] $B:1 [SEP]:1', [\n      ['[CLS]', 1],\n      ['[SEP]', 2],\n    ])\n    const bytelevel = byteLevelProcessing(true)\n    expect(sequenceProcessing([bytelevel, template])).toBeDefined()\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/pre-tokenizers.test.ts",
    "content": "import {\n  byteLevelPreTokenizer,\n  metaspacePreTokenizer,\n  punctuationPreTokenizer,\n  sequencePreTokenizer,\n  splitPreTokenizer,\n  whitespaceSplitPreTokenizer,\n} from '../../'\n\ndescribe('byteLevelPreTokenizer', () => {\n  it('instantiates correctly', () => {\n    const processor = byteLevelPreTokenizer()\n    expect(processor.constructor.name).toEqual('PreTokenizer')\n  })\n})\n\ndescribe('metaspacePreTokenizer', () => {\n  it('instantiates correctly without any parameter', () => {\n    const processor = metaspacePreTokenizer()\n    expect(processor.constructor.name).toEqual('PreTokenizer')\n  })\n\n  it('accepts `undefined` as first parameter', () => {\n    expect(metaspacePreTokenizer(undefined)).toBeDefined()\n  })\n\n  it('accepts `undefined` as second parameter', () => {\n    expect(metaspacePreTokenizer('t', undefined)).toBeDefined()\n  })\n\n  it('can pre-tokenize strings', () => {\n    const pretok = metaspacePreTokenizer()\n    expect(pretok.preTokenizeString('Hello there friend')).toEqual([\n      ['▁Hello', [0, 5]],\n      ['▁there', [5, 11]],\n      ['▁friend', [11, 18]],\n    ])\n  })\n})\n\ndescribe('punctuationPreTokenizer', () => {\n  it('instantiates correctly without any parameter', () => {\n    const processor = punctuationPreTokenizer()\n    expect(processor.constructor.name).toEqual('PreTokenizer')\n  })\n\n  it('instantiates correctly with non-default split delimeter', () => {\n    const processor = punctuationPreTokenizer('removed')\n    expect(processor.constructor.name).toEqual('PreTokenizer')\n  })\n})\n\ndescribe('splitPreTokenizer', () => {\n  it('instantiates correctly with invert parameter', () => {\n    const processor = splitPreTokenizer(' ', 'mergedWithPrevious', false)\n    expect(processor.constructor.name).toEqual('PreTokenizer')\n  })\n})\n\ndescribe('sequencePreTokenizer', () => {\n  it('instantiates correctly', () => {\n    const punctuation = punctuationPreTokenizer()\n    const whitespace = whitespaceSplitPreTokenizer()\n    const sequence2 = sequencePreTokenizer([])\n    expect(sequence2.constructor.name).toEqual('PreTokenizer')\n    const sequence3 = sequencePreTokenizer([punctuation, whitespace])\n    expect(sequence3.constructor.name).toEqual('PreTokenizer')\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/tokenizer.test.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-function */\n\nimport { TruncationStrategy, BPE, Encoding, AddedToken, Tokenizer } from '../../'\n\n// jest.mock('../../bindings/tokenizer');\n// jest.mock('../../bindings/models', () => ({\n//   __esModule: true,\n//   Model: jest.fn()\n// }));\n\n// Or:\n// jest.mock('../../bindings/models', () => {\n//   return require('../../bindings/__mocks__/models');\n// });\n\n// const TokenizerMock = mocked(Tokenizer);\n\ndescribe('AddedToken', () => {\n  it('instantiates with only content', () => {\n    const addToken = new AddedToken('test', false)\n    expect(addToken.constructor.name).toEqual('AddedToken')\n  })\n\n  it('instantiates with empty options', () => {\n    const addToken = new AddedToken('test', false, {})\n    expect(addToken.constructor.name).toEqual('AddedToken')\n  })\n\n  it('instantiates with options', () => {\n    const addToken = new AddedToken('test', false, {\n      leftStrip: true,\n      rightStrip: true,\n      singleWord: true,\n    })\n    expect(addToken.constructor.name).toEqual('AddedToken')\n  })\n\n  describe('getContent', () => {\n    it('returns the string content of AddedToken', () => {\n      const addedToken = new AddedToken('test', false)\n      expect(addedToken.getContent()).toEqual('test')\n    })\n  })\n})\n\ndescribe('Tokenizer', () => {\n  it('has expected methods', () => {\n    const model = BPE.empty()\n    const tokenizer = new Tokenizer(model)\n\n    expect(typeof Tokenizer.fromFile).toBe('function')\n    expect(typeof Tokenizer.fromString).toBe('function')\n    // expect(typeof Tokenizer.fromPretrained).toBe('function')\n\n    expect(typeof tokenizer.addSpecialTokens).toBe('function')\n    expect(typeof tokenizer.addTokens).toBe('function')\n    expect(typeof tokenizer.decode).toBe('function')\n    expect(typeof tokenizer.decodeBatch).toBe('function')\n    expect(typeof tokenizer.disablePadding).toBe('function')\n    expect(typeof tokenizer.disableTruncation).toBe('function')\n    expect(typeof tokenizer.encode).toBe('function')\n    expect(typeof tokenizer.encodeBatch).toBe('function')\n    expect(typeof tokenizer.getDecoder).toBe('function')\n    expect(typeof tokenizer.getNormalizer).toBe('function')\n    expect(typeof tokenizer.getPostProcessor).toBe('function')\n    expect(typeof tokenizer.getPreTokenizer).toBe('function')\n    expect(typeof tokenizer.getVocab).toBe('function')\n    expect(typeof tokenizer.getVocabSize).toBe('function')\n    expect(typeof tokenizer.idToToken).toBe('function')\n    expect(typeof tokenizer.runningTasks).toBe('function')\n    expect(typeof tokenizer.save).toBe('function')\n    expect(typeof tokenizer.setDecoder).toBe('function')\n    expect(typeof tokenizer.setModel).toBe('function')\n    expect(typeof tokenizer.setNormalizer).toBe('function')\n    expect(typeof tokenizer.setPadding).toBe('function')\n    expect(typeof tokenizer.setPostProcessor).toBe('function')\n    expect(typeof tokenizer.setPreTokenizer).toBe('function')\n    expect(typeof tokenizer.setTruncation).toBe('function')\n    expect(typeof tokenizer.tokenToId).toBe('function')\n    expect(typeof tokenizer.toString).toBe('function')\n    expect(typeof tokenizer.train).toBe('function')\n  })\n\n  // it('can be instantiated from the hub', async () => {\n  //   let tokenizer: Tokenizer\n  //   let output: Encoding\n\n  //   tokenizer = Tokenizer.fromPretrained('bert-base-cased')\n  //   output = await tokenizer.encode('Hey there dear friend!', null, { addSpecialTokens: false })\n  //   expect(output.getTokens()).toEqual(['Hey', 'there', 'dear', 'friend', '!'])\n\n  //   tokenizer = Tokenizer.fromPretrained('anthony/tokenizers-test')\n  //   output = await tokenizer.encode('Hey there dear friend!', null, { addSpecialTokens: false })\n  //   expect(output.getTokens()).toEqual(['hey', 'there', 'dear', 'friend', '!'])\n\n  //   tokenizer = Tokenizer.fromPretrained('anthony/tokenizers-test', {\n  //     revision: 'gpt-2',\n  //   })\n  //   output = await tokenizer.encode('Hey there dear friend!', null, { addSpecialTokens: false })\n  //   expect(output.getTokens()).toEqual(['Hey', 'Ġthere', 'Ġdear', 'Ġfriend', '!'])\n  // }, 10000)\n\n  describe('addTokens', () => {\n    it('accepts a list of string as new tokens when initial model is empty', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n\n      const nbAdd = tokenizer.addTokens(['my', 'name', 'is', 'john', 'pair'])\n      expect(nbAdd).toBe(5)\n    })\n\n    it('accepts a list of AddedToken as new tokens when initial model is empty', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n      const addedToken = new AddedToken('test', false)\n\n      const nbAdd = tokenizer.addAddedTokens([addedToken])\n      expect(nbAdd).toBe(1)\n    })\n  })\n\n  describe('encode', () => {\n    let tokenizer: Tokenizer\n    beforeEach(() => {\n      // Clear all instances and calls to constructor and all methods:\n      // TokenizerMock.mockClear();\n\n      const model = BPE.empty()\n      tokenizer = new Tokenizer(model)\n      tokenizer.addTokens(['my', 'name', 'is', 'john', 'pair'])\n    })\n\n    it('accepts a pair of strings as parameters', async () => {\n      const encoding = await tokenizer.encode('my name is john', 'pair')\n      expect(encoding).toBeDefined()\n    })\n\n    it('accepts a string with a null pair', async () => {\n      const encoding = await tokenizer.encode('my name is john', null)\n      expect(encoding).toBeDefined()\n    })\n\n    // TODO\n    // it(\"throws if we try to encode a pre-tokenized string without isPretokenized=true\", async () => {\n    //   await expect((encode as any)([\"my\", \"name\", \"is\", \"john\"], null)).rejects.toThrow(\n    //     \"encode with isPreTokenized=false expect string\"\n    //   );\n    // });\n\n    // it(\"accepts a pre-tokenized string as parameter\", async () => {\n    //   const encoding = await tokenizer.encode([\"my\", \"name\", \"is\", \"john\"], undefined, {\n    //     isPretokenized: true,\n    //   });\n    //   expect(encoding).toBeDefined();\n    // });\n\n    // it(\"throws if we try to encodeBatch pre-tokenized strings without isPretokenized=true\", async () => {\n    //   await expect((encodeBatch as any)([[\"my\", \"name\", \"is\", \"john\"]])).rejects.toThrow(\n    //     \"encodeBatch with isPretokenized=false expects input to be `EncodeInput[]` \" +\n    //       \"with `EncodeInput = string | [string, string]`\"\n    //   );\n    // });\n\n    // it(\"accepts a pre-tokenized input in encodeBatch\", async () => {\n    //   const encoding = await tokenizer.encodeBatch([[\"my\", \"name\", \"is\", \"john\"]], {\n    //     isPretokenized: true,\n    //   });\n    //   expect(encoding).toBeDefined();\n    // });\n\n    it('Encodes correctly if called with only one argument', async () => {\n      const encoded = await tokenizer.encode('my name is john')\n      expect(encoded.getIds()).toEqual([0, 1, 2, 3])\n    })\n\n    it('returns an Encoding', async () => {\n      const encoding = await tokenizer.encode('my name is john', 'pair')\n\n      expect(encoding.getAttentionMask()).toEqual([1, 1, 1, 1, 1])\n\n      const ids = encoding.getIds()\n      expect(Array.isArray(ids)).toBe(true)\n      expect(ids).toHaveLength(5)\n      for (const id of ids) {\n        expect(typeof id).toBe('number')\n      }\n\n      expect(encoding.getOffsets()).toEqual([\n        [0, 2],\n        [3, 7],\n        [8, 10],\n        [11, 15],\n        [0, 4],\n      ])\n      expect(encoding.getOverflowing()).toEqual([])\n      expect(encoding.getSpecialTokensMask()).toEqual([0, 0, 0, 0, 0])\n      expect(encoding.getTokens()).toEqual(['my', 'name', 'is', 'john', 'pair'])\n      expect(encoding.getTypeIds()).toEqual([0, 0, 0, 0, 1])\n    })\n\n    describe('when truncation is enabled', () => {\n      it('truncates with default if no truncation options provided', async () => {\n        tokenizer.setTruncation(2)\n\n        const singleEncoding = await tokenizer.encode('my name is john', null)\n        expect(singleEncoding.getTokens()).toEqual(['my', 'name'])\n\n        const pairEncoding = await tokenizer.encode('my name is john', 'pair')\n        expect(pairEncoding.getTokens()).toEqual(['my', 'pair'])\n      })\n\n      it('throws an error with strategy `only_second` and no pair is encoded', async () => {\n        tokenizer.setTruncation(2, { strategy: TruncationStrategy.OnlySecond })\n        await expect(tokenizer.encode('my name is john', null)).rejects.toThrow(\n          'Truncation error: Second sequence not provided',\n        )\n      })\n    })\n\n    describe('when padding is enabled', () => {\n      it('does not pad anything with default options', async () => {\n        tokenizer.setPadding()\n\n        const singleEncoding = await tokenizer.encode('my name', null)\n        expect(singleEncoding.getTokens()).toEqual(['my', 'name'])\n\n        const pairEncoding = await tokenizer.encode('my name', 'pair')\n        expect(pairEncoding.getTokens()).toEqual(['my', 'name', 'pair'])\n      })\n\n      it('pads to the right by default', async () => {\n        tokenizer.setPadding({ maxLength: 5 })\n\n        const singleEncoding = await tokenizer.encode('my name', null)\n        expect(singleEncoding.getTokens()).toEqual(['my', 'name', '[PAD]', '[PAD]', '[PAD]'])\n\n        const pairEncoding = await tokenizer.encode('my name', 'pair')\n        expect(pairEncoding.getTokens()).toEqual(['my', 'name', 'pair', '[PAD]', '[PAD]'])\n      })\n\n      it('pads to multiple of the given value', async () => {\n        tokenizer.setPadding({ padToMultipleOf: 8 })\n\n        const singleEncoding = await tokenizer.encode('my name', null)\n        expect(singleEncoding.getTokens()).toHaveLength(8)\n\n        const pairEncoding = await tokenizer.encode('my name', 'pair')\n        expect(pairEncoding.getTokens()).toHaveLength(8)\n      })\n    })\n  })\n\n  describe('decode', () => {\n    let tokenizer: Tokenizer\n\n    beforeEach(() => {\n      const model = BPE.empty()\n      tokenizer = new Tokenizer(model)\n      tokenizer.addTokens(['my', 'name', 'is', 'john', 'pair'])\n    })\n\n    it('has its callback called with the decoded string', async () => {\n      const decode = tokenizer.decode.bind(tokenizer)\n      expect(await decode([0, 1, 2, 3], true)).toEqual('my name is john')\n    })\n  })\n\n  describe('decodeBatch', () => {\n    let tokenizer: Tokenizer\n\n    beforeEach(() => {\n      const model = BPE.empty()\n      tokenizer = new Tokenizer(model)\n      tokenizer.addTokens(['my', 'name', 'is', 'john', 'pair'])\n    })\n\n    it('has its callback called with the decoded string', async () => {\n      const decodeBatch = tokenizer.decodeBatch.bind(tokenizer)\n      expect(await decodeBatch([[0, 1, 2, 3], [4]], true)).toEqual(['my name is john', 'pair'])\n    })\n  })\n\n  describe('getVocab', () => {\n    it('accepts `undefined` as parameter', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n\n      expect(tokenizer.getVocab(undefined)).toBeDefined()\n    })\n\n    it('returns the vocabulary', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n      tokenizer.addTokens(['my', 'name', 'is', 'john'])\n\n      expect(tokenizer.getVocab(true)).toEqual({\n        my: 0,\n        name: 1,\n        is: 2,\n        john: 3,\n      })\n    })\n  })\n\n  describe('getVocabSize', () => {\n    it('accepts `undefined` as parameter', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n\n      expect(tokenizer.getVocabSize(undefined)).toBeDefined()\n    })\n  })\n\n  describe('setTruncation', () => {\n    it('returns the full truncation configuration', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n\n      tokenizer.setTruncation(2)\n      // TODO Return type is weird\n      // const expectedConfig: TruncationOptions = {\n      //   maxLength: 2,\n      //   strategy: TruncationStrategy.LongestFirst,\n      //   stride: 0,\n      //   direction: TruncationDirection.Right,\n      // };\n      // expect(truncation).toEqual(expectedConfig);\n    })\n  })\n\n  describe('setPadding', () => {\n    it('returns the full padding params', () => {\n      const model = BPE.empty()\n      const tokenizer = new Tokenizer(model)\n\n      tokenizer.setPadding()\n      // TODO Return type is weird\n      // const expectedConfig: PaddingOptions = {\n      //   direction: PaddingDirection.Right,\n      //   padId: 0,\n      //   padToken: \"[PAD]\",\n      //   padTypeId: 0,\n      // };\n      // expect(padding).toEqual(expectedConfig);\n    })\n  })\n\n  describe('postProcess', () => {\n    let tokenizer: Tokenizer\n    let firstEncoding: Encoding\n    let secondEncoding: Encoding\n\n    beforeAll(() => {\n      const model = BPE.empty()\n      tokenizer = new Tokenizer(model)\n      tokenizer.addTokens(['my', 'name', 'is', 'john', 'pair'])\n    })\n\n    beforeEach(async () => {\n      firstEncoding = await tokenizer.encode('my name is john', null)\n      secondEncoding = await tokenizer.encode('pair', null)\n\n      tokenizer.setTruncation(2)\n      tokenizer.setPadding({ maxLength: 5 })\n    })\n\n    it('returns correctly with a single Encoding param', () => {\n      const encoding = tokenizer.postProcess(firstEncoding)\n      expect(encoding.getTokens()).toEqual(['my', 'name', '[PAD]', '[PAD]', '[PAD]'])\n    })\n\n    it('returns correctly with `undefined` as second and third parameters', () => {\n      const encoding = tokenizer.postProcess(firstEncoding, undefined, undefined)\n      expect(encoding.getTokens()).toEqual(['my', 'name', '[PAD]', '[PAD]', '[PAD]'])\n    })\n\n    it('returns correctly with 2 encodings', () => {\n      const encoding = tokenizer.postProcess(firstEncoding, secondEncoding)\n      expect(encoding.getTokens()).toEqual(['my', 'pair', '[PAD]', '[PAD]', '[PAD]'])\n    })\n  })\n})\n"
  },
  {
    "path": "bindings/node/lib/bindings/utils.test.ts",
    "content": "// import { promisify } from 'util'\n\nimport { BPE, Tokenizer, mergeEncodings, slice } from '../../'\n\ndescribe('slice', () => {\n  const text = 'My name is John 👋'\n  const sliceText = slice.bind({}, text)\n\n  it('returns the full text when no params', () => {\n    const sliced = sliceText()\n    expect(sliced).toEqual(text)\n  })\n\n  it('accepts `undefined` as second parameter', () => {\n    const original = sliceText(undefined)\n    expect(original).toEqual(text)\n  })\n\n  it('accepts `undefined` as third parameter', () => {\n    const original = sliceText(0, undefined)\n    expect(original).toEqual(text)\n  })\n\n  it('throws an error when `begin` is out of range', () => {\n    expect(() => sliceText(1000)).toThrow()\n  })\n\n  it('returns slice starting at the specified index', () => {\n    const original = sliceText(3)\n    expect(original).toEqual('name is John 👋')\n  })\n\n  it('throws an error when `end` is out of range', () => {\n    expect(() => sliceText(0, 1000)).toThrow()\n  })\n\n  it('returns the text between the two specified indexes', () => {\n    const original = sliceText(3, 7)\n    expect(original).toEqual('name')\n  })\n\n  describe('with only a negative `begin`', () => {\n    it('returns the original string counting from the end when in the range', () => {\n      const original = sliceText(-1)\n      expect(original).toEqual('👋')\n    })\n\n    it('throws an error when out of range', () => {\n      expect(() => sliceText(-1000)).toThrow()\n    })\n  })\n\n  describe('with a positive `begin` and a negative `end`', () => {\n    it('returns correct slice when resulting range is valid', () => {\n      const original = sliceText(3, -7)\n      expect(original).toEqual('name is')\n    })\n\n    it('throws an error when resulting `end` index is lower than `begin`', () => {\n      expect(() => sliceText(7, -12)).toThrow()\n    })\n\n    it('throws an error when `begin` is out of range', () => {\n      expect(() => sliceText(1000, -12)).toThrow()\n    })\n\n    it('throws an error when resulting `end` index is out of range', () => {\n      expect(() => sliceText(7, -1000)).toThrow()\n    })\n  })\n\n  describe('with a negative `begin` and a positive `end`', () => {\n    it('returns correct slice when resulting range is valid', () => {\n      const original = sliceText(-9, 10)\n      expect(original).toEqual('is')\n    })\n\n    it('throws an error when resulting `begin` index is upper than `end`', () => {\n      expect(() => sliceText(-3, 5)).toThrow()\n    })\n\n    it('throws an error when `end` is out of range', () => {\n      expect(() => sliceText(-5, 1000)).toThrow()\n    })\n\n    it('throws an error when resulting `begin` index is out of range', () => {\n      expect(() => sliceText(-1000, 10)).toThrow()\n    })\n  })\n\n  describe('with negatives `begin` and `end`', () => {\n    it('returns correct slice when resulting range is valid', () => {\n      const original = sliceText(-9, -7)\n      expect(original).toEqual('is')\n    })\n\n    it('throws an error when resulting `end` index is lower than `begin`', () => {\n      expect(() => sliceText(-5, -10)).toThrow()\n    })\n\n    it('throws an error when resulting `begin` index is out of range', () => {\n      expect(() => sliceText(-1000, -10)).toThrow()\n    })\n\n    it('throws an error when resulting `end` index is out of range', () => {\n      expect(() => sliceText(-10, -1000)).toThrow()\n    })\n  })\n})\n\ndescribe('mergeEncodings', () => {\n  const model = BPE.empty()\n  const tokenizer = new Tokenizer(model)\n  tokenizer.addTokens(['my', 'name', 'is', 'john'])\n\n  it('accepts `undefined` as a second parameter', () => {\n    const encoding = mergeEncodings([], undefined)\n    expect(encoding.constructor.name).toEqual('Encoding')\n  })\n\n  it('returns correct result with `growingOffsets` not provided', async () => {\n    const firstEncoding = await tokenizer.encode('my name is', null)\n    const secondEncoding = await tokenizer.encode('john', null)\n    const encoding = mergeEncodings([firstEncoding, secondEncoding])\n\n    expect(encoding.getTokens()).toEqual(['my', 'name', 'is', 'john'])\n    expect(encoding.getOffsets()).toEqual([\n      [0, 2],\n      [3, 7],\n      [8, 10],\n      [0, 4],\n    ])\n  })\n\n  it('returns correct result when `growingOffsets` is `false`', async () => {\n    const firstEncoding = await tokenizer.encode('my name is', null)\n    const secondEncoding = await tokenizer.encode('john', null)\n    const encoding = mergeEncodings([firstEncoding, secondEncoding], false)\n\n    expect(encoding.getTokens()).toEqual(['my', 'name', 'is', 'john'])\n    expect(encoding.getOffsets()).toEqual([\n      [0, 2],\n      [3, 7],\n      [8, 10],\n      [0, 4],\n    ])\n  })\n\n  it('returns correct result when `growingOffsets` is `true`', async () => {\n    const firstEncoding = await tokenizer.encode('my name is', null)\n    const secondEncoding = await tokenizer.encode('john', null)\n    const encoding = mergeEncodings([firstEncoding, secondEncoding], true)\n\n    expect(encoding.getTokens()).toEqual(['my', 'name', 'is', 'john'])\n    expect(encoding.getOffsets()).toEqual([\n      [0, 2],\n      [3, 7],\n      [8, 10],\n      [10, 14],\n    ])\n  })\n})\n"
  },
  {
    "path": "bindings/node/npm/android-arm-eabi/README.md",
    "content": "# `tokenizers-android-arm-eabi`\n\nThis is the **armv7-linux-androideabi** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/android-arm-eabi/package.json",
    "content": "{\n  \"name\": \"tokenizers-android-arm-eabi\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"android\"\n  ],\n  \"cpu\": [\n    \"arm\"\n  ],\n  \"main\": \"tokenizers.android-arm-eabi.node\",\n  \"files\": [\n    \"tokenizers.android-arm-eabi.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/android-arm64/README.md",
    "content": "# `tokenizers-android-arm64`\n\nThis is the **aarch64-linux-android** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/android-arm64/package.json",
    "content": "{\n  \"name\": \"tokenizers-android-arm64\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"android\"\n  ],\n  \"cpu\": [\n    \"arm64\"\n  ],\n  \"main\": \"tokenizers.android-arm64.node\",\n  \"files\": [\n    \"tokenizers.android-arm64.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/darwin-arm64/README.md",
    "content": "# `tokenizers-darwin-arm64`\n\nThis is the **aarch64-apple-darwin** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/darwin-arm64/package.json",
    "content": "{\n  \"name\": \"tokenizers-darwin-arm64\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"darwin\"\n  ],\n  \"cpu\": [\n    \"arm64\"\n  ],\n  \"main\": \"tokenizers.darwin-arm64.node\",\n  \"files\": [\n    \"tokenizers.darwin-arm64.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/darwin-x64/README.md",
    "content": "# `tokenizers-darwin-x64`\n\nThis is the **x86_64-apple-darwin** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/darwin-x64/package.json",
    "content": "{\n  \"name\": \"tokenizers-darwin-x64\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"darwin\"\n  ],\n  \"cpu\": [\n    \"x64\"\n  ],\n  \"main\": \"tokenizers.darwin-x64.node\",\n  \"files\": [\n    \"tokenizers.darwin-x64.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/freebsd-x64/README.md",
    "content": "# `tokenizers-freebsd-x64`\n\nThis is the **x86_64-unknown-freebsd** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/freebsd-x64/package.json",
    "content": "{\n  \"name\": \"tokenizers-freebsd-x64\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"freebsd\"\n  ],\n  \"cpu\": [\n    \"x64\"\n  ],\n  \"main\": \"tokenizers.freebsd-x64.node\",\n  \"files\": [\n    \"tokenizers.freebsd-x64.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/linux-arm-gnueabihf/README.md",
    "content": "# `tokenizers-linux-arm-gnueabihf`\n\nThis is the **armv7-unknown-linux-gnueabihf** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/linux-arm-gnueabihf/package.json",
    "content": "{\n  \"name\": \"tokenizers-linux-arm-gnueabihf\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"linux\"\n  ],\n  \"cpu\": [\n    \"arm\"\n  ],\n  \"main\": \"tokenizers.linux-arm-gnueabihf.node\",\n  \"files\": [\n    \"tokenizers.linux-arm-gnueabihf.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/linux-arm64-gnu/README.md",
    "content": "# `tokenizers-linux-arm64-gnu`\n\nThis is the **aarch64-unknown-linux-gnu** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/linux-arm64-gnu/package.json",
    "content": "{\n  \"name\": \"tokenizers-linux-arm64-gnu\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"linux\"\n  ],\n  \"cpu\": [\n    \"arm64\"\n  ],\n  \"main\": \"tokenizers.linux-arm64-gnu.node\",\n  \"files\": [\n    \"tokenizers.linux-arm64-gnu.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\",\n  \"libc\": [\n    \"glibc\"\n  ]\n}"
  },
  {
    "path": "bindings/node/npm/linux-arm64-musl/README.md",
    "content": "# `tokenizers-linux-arm64-musl`\n\nThis is the **aarch64-unknown-linux-musl** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/linux-arm64-musl/package.json",
    "content": "{\n  \"name\": \"tokenizers-linux-arm64-musl\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"linux\"\n  ],\n  \"cpu\": [\n    \"arm64\"\n  ],\n  \"main\": \"tokenizers.linux-arm64-musl.node\",\n  \"files\": [\n    \"tokenizers.linux-arm64-musl.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\",\n  \"libc\": [\n    \"musl\"\n  ]\n}"
  },
  {
    "path": "bindings/node/npm/linux-x64-gnu/README.md",
    "content": "# `tokenizers-linux-x64-gnu`\n\nThis is the **x86_64-unknown-linux-gnu** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/linux-x64-gnu/package.json",
    "content": "{\n  \"name\": \"tokenizers-linux-x64-gnu\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"linux\"\n  ],\n  \"cpu\": [\n    \"x64\"\n  ],\n  \"main\": \"tokenizers.linux-x64-gnu.node\",\n  \"files\": [\n    \"tokenizers.linux-x64-gnu.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\",\n  \"libc\": [\n    \"glibc\"\n  ]\n}"
  },
  {
    "path": "bindings/node/npm/linux-x64-musl/README.md",
    "content": "# `tokenizers-linux-x64-musl`\n\nThis is the **x86_64-unknown-linux-musl** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/linux-x64-musl/package.json",
    "content": "{\n  \"name\": \"tokenizers-linux-x64-musl\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"linux\"\n  ],\n  \"cpu\": [\n    \"x64\"\n  ],\n  \"main\": \"tokenizers.linux-x64-musl.node\",\n  \"files\": [\n    \"tokenizers.linux-x64-musl.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\",\n  \"libc\": [\n    \"musl\"\n  ]\n}"
  },
  {
    "path": "bindings/node/npm/win32-arm64-msvc/README.md",
    "content": "# `tokenizers-win32-arm64-msvc`\n\nThis is the **aarch64-pc-windows-msvc** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/win32-arm64-msvc/package.json",
    "content": "{\n  \"name\": \"tokenizers-win32-arm64-msvc\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"win32\"\n  ],\n  \"cpu\": [\n    \"arm64\"\n  ],\n  \"main\": \"tokenizers.win32-arm64-msvc.node\",\n  \"files\": [\n    \"tokenizers.win32-arm64-msvc.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/win32-ia32-msvc/README.md",
    "content": "# `tokenizers-win32-ia32-msvc`\n\nThis is the **i686-pc-windows-msvc** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/win32-ia32-msvc/package.json",
    "content": "{\n  \"name\": \"tokenizers-win32-ia32-msvc\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"win32\"\n  ],\n  \"cpu\": [\n    \"ia32\"\n  ],\n  \"main\": \"tokenizers.win32-ia32-msvc.node\",\n  \"files\": [\n    \"tokenizers.win32-ia32-msvc.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/npm/win32-x64-msvc/README.md",
    "content": "# `tokenizers-win32-x64-msvc`\n\nThis is the **x86_64-pc-windows-msvc** binary for `tokenizers`\n"
  },
  {
    "path": "bindings/node/npm/win32-x64-msvc/package.json",
    "content": "{\n  \"name\": \"tokenizers-win32-x64-msvc\",\n  \"version\": \"0.13.4-rc1\",\n  \"os\": [\n    \"win32\"\n  ],\n  \"cpu\": [\n    \"x64\"\n  ],\n  \"main\": \"tokenizers.win32-x64-msvc.node\",\n  \"files\": [\n    \"tokenizers.win32-x64-msvc.node\"\n  ],\n  \"description\": \"Tokenizers platform specific bindings\",\n  \"keywords\": [\n    \"napi-rs\",\n    \"NAPI\",\n    \"N-API\",\n    \"Rust\",\n    \"node-addon\",\n    \"node-addon-api\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"repository\": \"tokenizers\"\n}"
  },
  {
    "path": "bindings/node/package.json",
    "content": "{\n  \"name\": \"tokenizers\",\n  \"version\": \"0.15.3-dev0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/huggingface/tokenizers.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/huggingface/tokenizers/issues\"\n  },\n  \"homepage\": \"https://github.com/huggingface/tokenizers/tree/master/bindings/node\",\n  \"author\": \"Anthony MOI <m.anthony.moi@gmail.com>\",\n  \"license\": \"Apache-2.0\",\n  \"description\": \"Provides an implementation of today's most used tokenizers, with a focus on performances and versatility.\",\n  \"files\": [\n    \"index.d.ts\",\n    \"index.js\"\n  ],\n  \"napi\": {\n    \"name\": \"tokenizers\",\n    \"triples\": {\n      \"defaults\": true,\n      \"additional\": [\n        \"x86_64-unknown-linux-musl\",\n        \"aarch64-unknown-linux-gnu\",\n        \"i686-pc-windows-msvc\",\n        \"armv7-unknown-linux-gnueabihf\",\n        \"aarch64-apple-darwin\",\n        \"aarch64-linux-android\",\n        \"x86_64-unknown-freebsd\",\n        \"aarch64-unknown-linux-musl\",\n        \"aarch64-pc-windows-msvc\",\n        \"armv7-linux-androideabi\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">= 10\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"artifacts\": \"napi artifacts\",\n    \"bench\": \"node -r @swc-node/register benchmark/bench.ts\",\n    \"build\": \"napi build --platform --release --pipe \\\"prettier -w\\\"\",\n    \"build:debug\": \"napi build --platform --pipe \\\"prettier -w\\\"\",\n    \"format\": \"run-p format:prettier format:rs format:toml\",\n    \"format:prettier\": \"prettier . -w\",\n    \"format:toml\": \"taplo format\",\n    \"format:rs\": \"cargo fmt\",\n    \"lint\": \"eslint . -c ./.eslintrc.yml\",\n    \"prepublishOnly\": \"napi prepublish -t npm\",\n    \"test\": \"jest\",\n    \"version\": \"napi version\"\n  },\n  \"devDependencies\": {\n    \"@napi-rs/cli\": \"^2.14.6\",\n    \"@swc-node/register\": \"^1.5.5\",\n    \"@swc/core\": \"^1.3.32\",\n    \"@taplo/cli\": \"^0.5.2\",\n    \"@types/jest\": \"^29.5.1\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.50.0\",\n    \"@typescript-eslint/parser\": \"^5.50.0\",\n    \"ava\": \"^5.1.1\",\n    \"benny\": \"^3.7.1\",\n    \"chalk\": \"^5.2.0\",\n    \"eslint\": \"^8.33.0\",\n    \"eslint-config-prettier\": \"^8.6.0\",\n    \"eslint-plugin-import\": \"^2.27.5\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"husky\": \"^8.0.3\",\n    \"jest\": \"^29.5.0\",\n    \"lint-staged\": \"^13.1.0\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"prettier\": \"^2.8.3\",\n    \"ts-jest\": \"^29.1.0\",\n    \"typescript\": \"^5.0.0\"\n  },\n  \"lint-staged\": {\n    \"*.@(js|ts|tsx)\": [\n      \"eslint -c .eslintrc.yml --fix\"\n    ],\n    \"*.@(js|ts|tsx|yml|yaml|md|json)\": [\n      \"prettier --write\"\n    ],\n    \"*.toml\": [\n      \"taplo format\"\n    ]\n  },\n  \"ava\": {\n    \"require\": [\n      \"@swc-node/register\"\n    ],\n    \"extensions\": [\n      \"ts\"\n    ],\n    \"timeout\": \"2m\",\n    \"workerThreads\": false,\n    \"environmentVariables\": {\n      \"TS_NODE_PROJECT\": \"./tsconfig.json\"\n    }\n  },\n  \"prettier\": {\n    \"printWidth\": 120,\n    \"semi\": false,\n    \"trailingComma\": \"all\",\n    \"singleQuote\": true,\n    \"arrowParens\": \"always\"\n  },\n  \"packageManager\": \"yarn@3.5.1\"\n}\n"
  },
  {
    "path": "bindings/node/rustfmt.toml",
    "content": "tab_spaces = 2\n"
  },
  {
    "path": "bindings/node/src/arc_rwlock_serde.rs",
    "content": "use serde::de::Deserializer;\nuse serde::ser::Serializer;\nuse serde::{Deserialize, Serialize};\nuse std::sync::{Arc, RwLock};\n\npub fn serialize<S, T>(val: &Option<Arc<RwLock<T>>>, s: S) -> Result<S::Ok, S::Error>\nwhere\n  S: Serializer,\n  T: Serialize,\n{\n  T::serialize(&*(val.clone().unwrap()).read().unwrap(), s)\n}\n\npub fn deserialize<'de, D, T>(d: D) -> Result<Option<Arc<RwLock<T>>>, D::Error>\nwhere\n  D: Deserializer<'de>,\n  T: Deserialize<'de>,\n{\n  Ok(Some(Arc::new(RwLock::new(T::deserialize(d)?))))\n}\n"
  },
  {
    "path": "bindings/node/src/decoders.rs",
    "content": "use crate::arc_rwlock_serde;\nuse serde::{Deserialize, Serialize};\nextern crate tokenizers as tk;\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\n\nuse std::sync::{Arc, RwLock};\n\nuse tk::decoders::DecoderWrapper;\n\n/// Decoder\n#[derive(Clone, Serialize, Deserialize)]\n#[napi]\npub struct Decoder {\n  #[serde(flatten, with = \"arc_rwlock_serde\")]\n  decoder: Option<Arc<RwLock<DecoderWrapper>>>,\n}\n\n#[napi]\nimpl Decoder {\n  #[napi]\n  pub fn decode(&self, tokens: Vec<String>) -> Result<String> {\n    use tk::Decoder;\n\n    self\n      .decoder\n      .as_ref()\n      .unwrap()\n      .read()\n      .unwrap()\n      .decode(tokens)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n}\n\nimpl tk::Decoder for Decoder {\n  fn decode_chain(&self, tokens: Vec<String>) -> tk::Result<Vec<String>> {\n    self\n      .decoder\n      .as_ref()\n      .ok_or(\"Uninitialized Decoder\")?\n      .read()\n      .unwrap()\n      .decode_chain(tokens)\n  }\n}\n\n#[napi]\npub fn bpe_decoder(suffix: Option<String>) -> Decoder {\n  let suffix = suffix.unwrap_or(\"</w>\".to_string());\n  let decoder = Some(Arc::new(RwLock::new(\n    tk::decoders::bpe::BPEDecoder::new(suffix).into(),\n  )));\n  Decoder { decoder }\n}\n\n#[napi]\npub fn byte_fallback_decoder() -> Decoder {\n  Decoder {\n    decoder: Some(Arc::new(RwLock::new(\n      tk::decoders::byte_fallback::ByteFallback::new().into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn ctc_decoder(\n  #[napi(ts_arg_type = \"string = '<pad>'\")] pad_token: Option<String>,\n  word_delimiter_token: Option<String>,\n  cleanup: Option<bool>,\n) -> Decoder {\n  let pad_token = pad_token.unwrap_or(\"<pad>\".to_string());\n  let word_delimiter_token = word_delimiter_token.unwrap_or(\"|\".to_string());\n  let cleanup = cleanup.unwrap_or(true);\n  let decoder = Some(Arc::new(RwLock::new(\n    tk::decoders::ctc::CTC::new(pad_token, word_delimiter_token, cleanup).into(),\n  )));\n  Decoder { decoder }\n}\n\n#[napi]\npub fn fuse_decoder() -> Decoder {\n  Decoder {\n    decoder: Some(Arc::new(RwLock::new(\n      tk::decoders::fuse::Fuse::new().into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn metaspace_decoder(\n  #[napi(ts_arg_type = \"string = '▁'\")] replacement: Option<String>,\n  #[napi(ts_arg_type = \"prepend_scheme = 'always'\")] prepend_scheme: Option<String>,\n  #[napi(ts_arg_type = \"split = true\")] split: Option<bool>,\n) -> Result<Decoder> {\n  use tk::pre_tokenizers::metaspace::PrependScheme;\n  let split = split.unwrap_or(true);\n  let replacement = replacement.unwrap_or(\"▁\".to_string());\n  if replacement.chars().count() != 1 {\n    return Err(Error::from_reason(\n      \"replacement is supposed to be a single char\",\n    ));\n  }\n  let replacement = replacement.chars().next().unwrap();\n  let prepend_scheme: PrependScheme =\n    match prepend_scheme.unwrap_or(String::from(\"always\")).as_str() {\n      \"always\" => PrependScheme::Always,\n      \"first\" => PrependScheme::First,\n      \"never\" => PrependScheme::Never,\n      _ => {\n        return Err(Error::from_reason(\n          \"prepend_scheme is supposed to be either 'always', 'first' or 'never'\",\n        ));\n      }\n    };\n  Ok(Decoder {\n    decoder: Some(Arc::new(RwLock::new(\n      tk::decoders::metaspace::Metaspace::new(replacement, prepend_scheme, split).into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn replace_decoder(pattern: String, content: String) -> Result<Decoder> {\n  Ok(Decoder {\n    decoder: Some(Arc::new(RwLock::new(\n      tk::normalizers::replace::Replace::new(pattern, content)\n        .map_err(|e| Error::from_reason(e.to_string()))?\n        .into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn sequence_decoder(decoders: Vec<&Decoder>) -> Decoder {\n  let sequence: Vec<tk::DecoderWrapper> = decoders\n    .into_iter()\n    .filter_map(|decoder| {\n      decoder\n        .decoder\n        .as_ref()\n        .map(|decoder| (**decoder).read().unwrap().clone())\n    })\n    .clone()\n    .collect();\n  Decoder {\n    decoder: Some(Arc::new(RwLock::new(tk::DecoderWrapper::Sequence(\n      tk::decoders::sequence::Sequence::new(sequence),\n    )))),\n  }\n}\n\n#[napi]\npub fn strip_decoder(content: String, left: u32, right: u32) -> Result<Decoder> {\n  let content: char = content.chars().next().ok_or(Error::from_reason(\n    \"Expected non empty string for strip pattern\",\n  ))?;\n  Ok(Decoder {\n    decoder: Some(Arc::new(RwLock::new(\n      tk::decoders::strip::Strip::new(content, left as usize, right as usize).into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn word_piece_decoder(\n  #[napi(ts_arg_type = \"string = '##'\")] prefix: Option<String>,\n  #[napi(ts_arg_type = \"bool = true\")] cleanup: Option<bool>,\n) -> Decoder {\n  let prefix = prefix.unwrap_or(\"##\".to_string());\n  let cleanup = cleanup.unwrap_or(true);\n  Decoder {\n    decoder: Some(Arc::new(RwLock::new(\n      tk::decoders::wordpiece::WordPiece::new(prefix, cleanup).into(),\n    ))),\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/encoding.rs",
    "content": "use crate::tokenizer::PaddingOptions;\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse tokenizers::utils::truncation::TruncationDirection;\nuse tokenizers::Encoding;\n\n#[napi(js_name = \"Encoding\")]\n#[derive(Clone, Default)]\npub struct JsEncoding {\n  pub(crate) encoding: Option<Encoding>,\n}\n\nimpl From<Encoding> for JsEncoding {\n  fn from(value: Encoding) -> Self {\n    Self {\n      encoding: Some(value),\n    }\n  }\n}\n\nimpl TryFrom<JsEncoding> for Encoding {\n  type Error = Error;\n\n  fn try_from(value: JsEncoding) -> Result<Self> {\n    value\n      .encoding\n      .ok_or(Error::from_reason(\"Uninitialized encoding\".to_string()))\n  }\n}\n\n#[napi(string_enum, js_name = \"TruncationDirection\")]\npub enum JsTruncationDirection {\n  Left,\n  Right,\n}\n\nimpl From<JsTruncationDirection> for TruncationDirection {\n  fn from(value: JsTruncationDirection) -> Self {\n    match value {\n      JsTruncationDirection::Left => TruncationDirection::Left,\n      JsTruncationDirection::Right => TruncationDirection::Right,\n    }\n  }\n}\n\nimpl TryFrom<String> for JsTruncationDirection {\n  type Error = Error;\n  fn try_from(value: String) -> Result<JsTruncationDirection> {\n    match value.as_str() {\n      \"left\" => Ok(JsTruncationDirection::Left),\n      \"right\" => Ok(JsTruncationDirection::Right),\n      s => Err(Error::from_reason(format!(\n        \"{s:?} is not a valid direction\"\n      ))),\n    }\n  }\n}\n\n#[napi(string_enum, js_name = \"TruncationStrategy\")]\npub enum JsTruncationStrategy {\n  LongestFirst,\n  OnlyFirst,\n  OnlySecond,\n}\n\nimpl From<JsTruncationStrategy> for tokenizers::TruncationStrategy {\n  fn from(value: JsTruncationStrategy) -> Self {\n    match value {\n      JsTruncationStrategy::LongestFirst => tokenizers::TruncationStrategy::LongestFirst,\n      JsTruncationStrategy::OnlyFirst => tokenizers::TruncationStrategy::OnlyFirst,\n      JsTruncationStrategy::OnlySecond => tokenizers::TruncationStrategy::OnlySecond,\n    }\n  }\n}\n\n#[napi]\nimpl JsEncoding {\n  #[napi(constructor)]\n  pub fn new() -> Self {\n    Self { encoding: None }\n  }\n\n  #[napi]\n  pub fn get_length(&self) -> u32 {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_ids()\n      .len() as u32\n  }\n\n  #[napi]\n  pub fn get_n_sequences(&self) -> u32 {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .n_sequences() as u32\n  }\n\n  #[napi]\n  pub fn get_ids(&self) -> Vec<u32> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_ids()\n      .to_vec()\n  }\n\n  #[napi]\n  pub fn get_type_ids(&self) -> Vec<u32> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_type_ids()\n      .to_vec()\n  }\n\n  #[napi]\n  pub fn get_attention_mask(&self) -> Vec<u32> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_attention_mask()\n      .to_vec()\n  }\n\n  #[napi]\n  pub fn get_special_tokens_mask(&self) -> Vec<u32> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_special_tokens_mask()\n      .to_vec()\n  }\n\n  #[napi]\n  pub fn get_tokens(&self) -> Vec<String> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_tokens()\n      .to_vec()\n  }\n\n  #[napi]\n  pub fn get_offsets(&self) -> Vec<Vec<u32>> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_offsets()\n      .iter()\n      .map(|(a, b)| vec![*a as u32, *b as u32])\n      .collect()\n  }\n\n  #[napi]\n  pub fn get_word_ids(&self) -> Vec<Option<u32>> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_word_ids()\n      .to_vec()\n  }\n\n  #[napi]\n  pub fn char_to_token(&self, pos: u32, seq_id: Option<u32>) -> Option<u32> {\n    let seq_id = seq_id.unwrap_or(0);\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .char_to_token(pos as usize, seq_id as usize)\n      .map(|i| i as u32)\n  }\n\n  #[napi]\n  pub fn char_to_word(&self, pos: u32, seq_id: Option<u32>) -> Option<u32> {\n    let seq_id = seq_id.unwrap_or(0);\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .char_to_word(pos as usize, seq_id as usize)\n  }\n\n  #[napi]\n  pub fn pad(&mut self, length: u32, options: Option<PaddingOptions>) -> Result<()> {\n    let params: tokenizers::PaddingParams = options.unwrap_or_default().try_into()?;\n    self.encoding.as_mut().expect(\"Uninitialized Encoding\").pad(\n      length as usize,\n      params.pad_id,\n      params.pad_type_id,\n      &params.pad_token,\n      params.direction,\n    );\n    Ok(())\n  }\n\n  #[napi]\n  pub fn truncate(\n    &mut self,\n    length: u32,\n    stride: Option<u32>,\n    direction: Option<Either<String, JsTruncationDirection>>,\n  ) -> Result<()> {\n    let stride = stride.unwrap_or_default();\n    let direction = match direction {\n      None => TruncationDirection::Left,\n      Some(Either::A(s)) => match s.as_str() {\n        \"left\" => TruncationDirection::Left,\n        \"right\" => TruncationDirection::Right,\n        d => {\n          return Err(Error::from_reason(format!(\n            \"{d} is not a valid truncation direction\"\n          )));\n        }\n      },\n      Some(Either::B(t)) => t.into(),\n    };\n    self\n      .encoding\n      .as_mut()\n      .expect(\"Uninitialized Encoding\")\n      .truncate(length as usize, stride as usize, direction);\n    Ok(())\n  }\n\n  #[napi(ts_return_type = \"[number, number] | null | undefined\")]\n  pub fn word_to_tokens(&self, env: Env, word: u32, seq_id: Option<u32>) -> Result<Option<Array>> {\n    let seq_id = seq_id.unwrap_or(0);\n\n    if let Some((a, b)) = self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .word_to_tokens(word, seq_id as usize)\n    {\n      let mut arr = env.create_array(2)?;\n      arr.set(0, env.create_uint32(a as u32)?)?;\n      arr.set(1, env.create_uint32(b as u32)?)?;\n      Ok(Some(arr))\n    } else {\n      Ok(None)\n    }\n  }\n  #[napi(ts_return_type = \"[number, number] | null | undefined\")]\n  pub fn word_to_chars(&self, env: Env, word: u32, seq_id: Option<u32>) -> Result<Option<Array>> {\n    let seq_id = seq_id.unwrap_or(0);\n\n    if let Some((a, b)) = self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .word_to_chars(word, seq_id as usize)\n    {\n      let mut arr = env.create_array(2)?;\n      arr.set(0, env.create_uint32(a as u32)?)?;\n      arr.set(1, env.create_uint32(b as u32)?)?;\n      Ok(Some(arr))\n    } else {\n      Ok(None)\n    }\n  }\n\n  #[napi(ts_return_type = \"[number, [number, number]] | null | undefined\")]\n  pub fn token_to_chars(&self, env: Env, token: u32) -> Result<Option<Array>> {\n    if let Some((_, (start, stop))) = self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .token_to_chars(token as usize)\n    {\n      let mut offsets = env.create_array(2)?;\n      offsets.set(0, env.create_uint32(start as u32)?)?;\n      offsets.set(1, env.create_uint32(stop as u32)?)?;\n      Ok(Some(offsets))\n    } else {\n      Ok(None)\n    }\n  }\n\n  #[napi]\n  pub fn token_to_word(&self, token: u32) -> Result<Option<u32>> {\n    if let Some((_, index)) = self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .token_to_word(token as usize)\n    {\n      Ok(Some(index))\n    } else {\n      Ok(None)\n    }\n  }\n\n  #[napi]\n  pub fn get_overflowing(&self) -> Vec<JsEncoding> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_overflowing()\n      .clone()\n      .into_iter()\n      .map(|enc| JsEncoding {\n        encoding: Some(enc),\n      })\n      .collect()\n  }\n\n  #[napi]\n  pub fn get_sequence_ids(&self) -> Vec<Option<u32>> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .get_sequence_ids()\n      .into_iter()\n      .map(|s| s.map(|id| id as u32))\n      .collect()\n  }\n\n  #[napi]\n  pub fn token_to_sequence(&self, token: u32) -> Option<u32> {\n    self\n      .encoding\n      .as_ref()\n      .expect(\"Uninitialized Encoding\")\n      .token_to_sequence(token as usize)\n      .map(|s| s as u32)\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/lib.rs",
    "content": "#![deny(clippy::all)]\n\npub const VERSION: &str = env!(\"CARGO_PKG_VERSION\");\n\nmod arc_rwlock_serde;\npub mod decoders;\npub mod encoding;\npub mod models;\npub mod normalizers;\npub mod pre_tokenizers;\npub mod processors;\npub mod tasks;\npub mod tokenizer;\npub mod trainers;\npub mod utils;\n"
  },
  {
    "path": "bindings/node/src/models.rs",
    "content": "use crate::arc_rwlock_serde;\nuse crate::tasks::models::{BPEFromFilesTask, WordLevelFromFilesTask, WordPieceFromFilesTask};\nuse crate::trainers::Trainer;\nuse ahash::AHashMap;\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse std::path::{Path, PathBuf};\nuse std::sync::{Arc, RwLock};\nuse tokenizers as tk;\nuse tokenizers::models::bpe::{BpeBuilder, Merges};\nuse tokenizers::models::wordlevel::WordLevelBuilder;\nuse tokenizers::models::wordpiece::WordPieceBuilder;\n\n#[napi]\n#[derive(Clone, Serialize, Deserialize)]\npub struct Model {\n  #[serde(flatten, with = \"arc_rwlock_serde\")]\n  pub(crate) model: Option<Arc<RwLock<tk::models::ModelWrapper>>>,\n}\n\nimpl<M> From<M> for Model\nwhere\n  M: Into<tk::models::ModelWrapper>,\n{\n  fn from(wrapper: M) -> Self {\n    Self {\n      model: Some(Arc::new(RwLock::new(wrapper.into()))),\n    }\n  }\n}\n\n#[napi(js_name = \"BPE\")]\npub struct Bpe {}\n\n#[napi]\nimpl Bpe {\n  #[napi(factory, ts_return_type = \"Model\")]\n  pub fn empty() -> Result<Model> {\n    let bpe = tk::models::bpe::BPE::default();\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(bpe.into()))),\n    })\n  }\n\n  #[napi(factory, ts_return_type = \"Model\")]\n  pub fn init(\n    vocab: HashMap<String, u32>,\n    merges: Merges,\n    options: Option<BpeOptions>,\n  ) -> Result<Model> {\n    let options = options.unwrap_or_default();\n    let vocab: AHashMap<_, _> = vocab.into_iter().collect();\n    let mut builder = tk::models::bpe::BPE::builder().vocab_and_merges(vocab, merges);\n    builder = options.apply_to_bpe_builder(builder);\n    let model = builder\n      .build()\n      .map_err(|e| Error::from_reason(e.to_string()))?;\n\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(model.into()))),\n    })\n  }\n\n  #[napi(ts_return_type = \"Promise<Model>\")]\n  pub fn from_file(\n    vocab: String,\n    merges: String,\n    options: Option<BpeOptions>,\n  ) -> AsyncTask<BPEFromFilesTask> {\n    let options = options.unwrap_or_default();\n    let mut builder = tk::models::bpe::BPE::from_file(&vocab, &merges);\n\n    builder = options.apply_to_bpe_builder(builder);\n\n    AsyncTask::new(BPEFromFilesTask {\n      builder: Some(builder),\n    })\n  }\n}\n\nimpl tk::Model for Model {\n  type Trainer = Trainer;\n\n  fn tokenize(&self, sequence: &str) -> tk::Result<Vec<tk::Token>> {\n    self\n      .model\n      .as_ref()\n      .ok_or(\"Uninitialized Model\")?\n      .read()\n      .unwrap()\n      .tokenize(sequence)\n  }\n\n  fn token_to_id(&self, token: &str) -> Option<u32> {\n    self.model.as_ref()?.read().unwrap().token_to_id(token)\n  }\n\n  fn id_to_token(&self, id: u32) -> Option<String> {\n    self.model.as_ref()?.read().unwrap().id_to_token(id)\n  }\n\n  fn get_vocab(&self) -> HashMap<String, u32> {\n    self\n      .model\n      .as_ref()\n      .expect(\"Uninitialized Model\")\n      .read()\n      .unwrap()\n      .get_vocab()\n  }\n\n  fn get_vocab_size(&self) -> usize {\n    self\n      .model\n      .as_ref()\n      .expect(\"Uninitialized Model\")\n      .read()\n      .unwrap()\n      .get_vocab_size()\n  }\n\n  fn save(&self, folder: &Path, name: Option<&str>) -> tk::Result<Vec<PathBuf>> {\n    self\n      .model\n      .as_ref()\n      .ok_or(\"Uninitialized Model\")?\n      .read()\n      .unwrap()\n      .save(folder, name)\n  }\n\n  fn get_trainer(&self) -> Self::Trainer {\n    self\n      .model\n      .as_ref()\n      .expect(\"Uninitialized Model\")\n      .read()\n      .unwrap()\n      .get_trainer()\n      .into()\n  }\n}\n\n#[derive(Default)]\n#[napi(object)]\npub struct BpeOptions {\n  pub cache_capacity: Option<u32>,\n  pub dropout: Option<f64>,\n  pub unk_token: Option<String>,\n  pub continuing_subword_prefix: Option<String>,\n  pub end_of_word_suffix: Option<String>,\n  pub fuse_unk: Option<bool>,\n  pub byte_fallback: Option<bool>,\n}\nimpl BpeOptions {\n  fn apply_to_bpe_builder(self, mut builder: BpeBuilder) -> BpeBuilder {\n    if let Some(cache_capacity) = self.cache_capacity {\n      builder = builder.cache_capacity(cache_capacity as usize);\n    }\n    if let Some(dropout) = self.dropout {\n      builder = builder.dropout(dropout as f32);\n    }\n    if let Some(unk_token) = self.unk_token {\n      builder = builder.unk_token(unk_token);\n    }\n    if let Some(continuing_subword_prefix) = self.continuing_subword_prefix {\n      builder = builder.continuing_subword_prefix(continuing_subword_prefix);\n    }\n    if let Some(end_of_word_suffix) = self.end_of_word_suffix {\n      builder = builder.end_of_word_suffix(end_of_word_suffix);\n    }\n    if let Some(fuse_unk) = self.fuse_unk {\n      builder = builder.fuse_unk(fuse_unk);\n    }\n    if let Some(byte_fallback) = self.byte_fallback {\n      builder = builder.byte_fallback(byte_fallback);\n    }\n\n    builder\n  }\n}\n\n#[derive(Default)]\n#[napi(object)]\npub struct WordPieceOptions {\n  pub unk_token: Option<String>,\n  pub continuing_subword_prefix: Option<String>,\n  pub max_input_chars_per_word: Option<u32>,\n}\n\nimpl WordPieceOptions {\n  fn apply_to_wordpiece_builder(self, mut builder: WordPieceBuilder) -> WordPieceBuilder {\n    if let Some(token) = self.unk_token {\n      builder = builder.unk_token(token);\n    }\n    if let Some(prefix) = self.continuing_subword_prefix {\n      builder = builder.continuing_subword_prefix(prefix);\n    }\n    if let Some(max) = self.max_input_chars_per_word {\n      builder = builder.max_input_chars_per_word(max as usize);\n    }\n\n    builder\n  }\n}\n\n#[napi]\npub struct WordPiece {}\n\n#[napi]\nimpl WordPiece {\n  #[napi(factory, ts_return_type = \"Model\")]\n  pub fn init(vocab: HashMap<String, u32>, options: Option<WordPieceOptions>) -> Result<Model> {\n    let options = options.unwrap_or_default();\n\n    let mut builder = tk::models::wordpiece::WordPiece::builder()\n      .vocab(vocab.into_iter().collect::<AHashMap<_, _>>());\n    builder = options.apply_to_wordpiece_builder(builder);\n    let model = builder\n      .build()\n      .map_err(|e| Error::from_reason(e.to_string()))?;\n\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(model.into()))),\n    })\n  }\n\n  #[napi(factory)]\n  pub fn empty() -> Model {\n    let wordpiece = tk::models::wordpiece::WordPiece::default();\n    Model {\n      model: Some(Arc::new(RwLock::new(wordpiece.into()))),\n    }\n  }\n\n  #[napi(ts_return_type = \"Promise<Model>\")]\n  pub fn from_file(\n    vocab: String,\n    options: Option<WordPieceOptions>,\n  ) -> AsyncTask<WordPieceFromFilesTask> {\n    let options = options.unwrap_or_default();\n    let mut builder = tk::models::wordpiece::WordPiece::from_file(&vocab);\n    builder = options.apply_to_wordpiece_builder(builder);\n    AsyncTask::new(WordPieceFromFilesTask {\n      builder: Some(builder),\n    })\n  }\n}\n\n#[derive(Default)]\n#[napi(object)]\npub struct WordLevelOptions {\n  pub unk_token: Option<String>,\n}\nimpl WordLevelOptions {\n  fn apply_to_wordlevel_builder(self, mut builder: WordLevelBuilder) -> WordLevelBuilder {\n    if let Some(token) = self.unk_token {\n      builder = builder.unk_token(token);\n    }\n\n    builder\n  }\n}\n\n#[napi]\npub struct WordLevel {}\n\n#[napi]\nimpl WordLevel {\n  #[napi(factory, ts_return_type = \"Model\")]\n  pub fn init(vocab: HashMap<String, u32>, options: Option<WordLevelOptions>) -> Result<Model> {\n    let options = options.unwrap_or_default();\n    let mut builder =\n      tk::models::wordlevel::WordLevel::builder().vocab(vocab.into_iter().collect());\n    builder = options.apply_to_wordlevel_builder(builder);\n    let model = builder\n      .build()\n      .map_err(|e| Error::from_reason(e.to_string()))?;\n\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(model.into()))),\n    })\n  }\n\n  #[napi(factory)]\n  pub fn empty() -> Model {\n    let wordlevel = tk::models::wordlevel::WordLevel::default();\n    Model {\n      model: Some(Arc::new(RwLock::new(wordlevel.into()))),\n    }\n  }\n\n  #[napi(ts_return_type = \"Promise<Model>\")]\n  pub fn from_file(\n    vocab: String,\n    options: Option<WordLevelOptions>,\n  ) -> AsyncTask<WordLevelFromFilesTask> {\n    let options = options.unwrap_or_default();\n    let mut builder = tk::models::wordlevel::WordLevel::builder().files(vocab);\n    builder = options.apply_to_wordlevel_builder(builder);\n    AsyncTask::new(WordLevelFromFilesTask {\n      builder: Some(builder),\n    })\n  }\n}\n\n#[derive(Default)]\n#[napi(object)]\npub struct UnigramOptions {\n  pub unk_id: Option<u32>,\n  pub byte_fallback: Option<bool>,\n}\n\n#[napi]\npub struct Unigram {}\n\n#[napi]\nimpl Unigram {\n  #[napi(factory, ts_return_type = \"Model\")]\n  pub fn init(vocab: Vec<(String, f64)>, options: Option<UnigramOptions>) -> Result<Model> {\n    let options = options.unwrap_or_default();\n\n    let unigram = tk::models::unigram::Unigram::from(\n      vocab,\n      options.unk_id.map(|u| u as usize),\n      options.byte_fallback.unwrap_or(false),\n    )\n    .map_err(|e| Error::from_reason(e.to_string()))?;\n\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(unigram.into()))),\n    })\n  }\n\n  #[napi(factory, ts_return_type = \"Model\")]\n  pub fn empty() -> Model {\n    let unigram = tk::models::unigram::Unigram::default();\n    Model {\n      model: Some(Arc::new(RwLock::new(unigram.into()))),\n    }\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/normalizers.rs",
    "content": "use crate::arc_rwlock_serde;\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse serde::{Deserialize, Serialize};\nuse std::sync::{Arc, RwLock};\nuse tk::normalizers::NormalizerWrapper;\nuse tk::NormalizedString;\nuse tokenizers as tk;\n\n/// Normalizer\n#[derive(Debug, Clone, Serialize, Deserialize)]\n#[napi]\npub struct Normalizer {\n  #[serde(flatten, with = \"arc_rwlock_serde\")]\n  normalizer: Option<Arc<RwLock<NormalizerWrapper>>>,\n}\n\n#[napi]\nimpl Normalizer {\n  #[napi]\n  pub fn normalize_string(&self, sequence: String) -> Result<String> {\n    use tk::Normalizer;\n\n    let mut normalized = NormalizedString::from(sequence);\n\n    self\n      .normalize(&mut normalized)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))?;\n\n    Ok(normalized.get().to_string())\n  }\n}\n\nimpl tk::Normalizer for Normalizer {\n  fn normalize(&self, normalized: &mut NormalizedString) -> tk::Result<()> {\n    self\n      .normalizer\n      .as_ref()\n      .ok_or(\"Uninitialized Normalizer\")?\n      .read()\n      .unwrap()\n      .normalize(normalized)?;\n    Ok(())\n  }\n}\n\n#[napi]\npub fn prepend_normalizer(prepend: String) -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::prepend::Prepend::new(prepend).into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn strip_accents_normalizer() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::strip::StripAccents.into(),\n    ))),\n  }\n}\n\n#[napi(object)]\n#[derive(Default)]\npub struct BertNormalizerOptions {\n  pub clean_text: Option<bool>,\n  pub handle_chinese_chars: Option<bool>,\n  pub strip_accents: Option<bool>,\n  pub lowercase: Option<bool>,\n}\n\n/// bert_normalizer(options?: {\n///   cleanText?: bool = true,\n///   handleChineseChars?: bool = true,\n///   stripAccents?: bool = true,\n///   lowercase?: bool = true\n/// })\n#[napi]\npub fn bert_normalizer(options: Option<BertNormalizerOptions>) -> Normalizer {\n  let options = options.unwrap_or_default();\n\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::bert::BertNormalizer::new(\n        options.clean_text.unwrap_or(true),\n        options.handle_chinese_chars.unwrap_or(true),\n        options.strip_accents,\n        options.lowercase.unwrap_or(true),\n      )\n      .into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn nfd_normalizer() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(tk::normalizers::unicode::NFD.into()))),\n  }\n}\n\n#[napi]\npub fn nfkd_normalizer() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(tk::normalizers::unicode::NFKD.into()))),\n  }\n}\n\n#[napi]\npub fn nfc_normalizer() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(tk::normalizers::unicode::NFC.into()))),\n  }\n}\n\n#[napi]\npub fn nfkc_normalizer() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(tk::normalizers::unicode::NFKC.into()))),\n  }\n}\n\n// /// strip(left?: boolean, right?: boolean)\n#[napi]\npub fn strip_normalizer(left: Option<bool>, right: Option<bool>) -> Normalizer {\n  let left = left.unwrap_or(true);\n  let right = right.unwrap_or(true);\n\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::strip::Strip::new(left, right).into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn sequence_normalizer(normalizers: Vec<&Normalizer>) -> Normalizer {\n  let mut sequence: Vec<NormalizerWrapper> = Vec::with_capacity(normalizers.len());\n  normalizers.into_iter().for_each(|normalizer| {\n    if let Some(normalizer) = &normalizer.normalizer {\n      sequence.push((**normalizer).read().unwrap().clone())\n    }\n  });\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(NormalizerWrapper::Sequence(\n      tk::normalizers::Sequence::new(sequence),\n    )))),\n  }\n}\n#[napi]\npub fn lowercase() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::utils::Lowercase.into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn replace(pattern: String, content: String) -> Result<Normalizer> {\n  Ok(Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::replace::Replace::new(pattern, content)\n        .map_err(|e| Error::from_reason(e.to_string()))?\n        .into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn nmt() -> Normalizer {\n  Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(tk::normalizers::unicode::Nmt.into()))),\n  }\n}\n\n#[napi]\npub fn precompiled(bytes: Vec<u8>) -> Result<Normalizer> {\n  Ok(Normalizer {\n    normalizer: Some(Arc::new(RwLock::new(\n      tk::normalizers::precompiled::Precompiled::from(&bytes)\n        .map_err(|e| Error::from_reason(e.to_string()))?\n        .into(),\n    ))),\n  })\n}\n"
  },
  {
    "path": "bindings/node/src/pre_tokenizers.rs",
    "content": "use crate::arc_rwlock_serde;\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse serde::{Deserialize, Serialize};\nuse std::sync::{Arc, RwLock};\nuse tk::pre_tokenizers::PreTokenizerWrapper;\nuse tk::PreTokenizedString;\nuse tk::SplitDelimiterBehavior;\nuse tokenizers as tk;\n\n#[napi(string_enum)]\npub enum JsSplitDelimiterBehavior {\n  Removed,\n  Isolated,\n  MergedWithPrevious,\n  MergedWithNext,\n  Contiguous,\n}\n\nimpl TryFrom<String> for JsSplitDelimiterBehavior {\n  type Error = Error;\n\n  fn try_from(value: String) -> Result<Self> {\n    match &value[..] {\n      \"removed\" => Ok(JsSplitDelimiterBehavior::Removed),\n      \"isolated\" => Ok(JsSplitDelimiterBehavior::Isolated),\n      \"mergedWithPrevious\" => Ok(JsSplitDelimiterBehavior::MergedWithPrevious),\n      \"mergedWithNext\" => Ok(JsSplitDelimiterBehavior::MergedWithNext),\n      \"contiguous\" => Ok(JsSplitDelimiterBehavior::Contiguous),\n      _ => Err(Error::from_reason(\n        \"Wrong value for SplitDelimiterBehavior, expected one of: \\\n                 `removed, isolated, mergedWithPrevious, mergedWithNext, contiguous`\"\n          .to_string(),\n      )),\n    }\n  }\n}\n\nimpl From<JsSplitDelimiterBehavior> for SplitDelimiterBehavior {\n  fn from(value: JsSplitDelimiterBehavior) -> Self {\n    match value {\n      JsSplitDelimiterBehavior::Removed => SplitDelimiterBehavior::Removed,\n      JsSplitDelimiterBehavior::Isolated => SplitDelimiterBehavior::Isolated,\n      JsSplitDelimiterBehavior::MergedWithPrevious => SplitDelimiterBehavior::MergedWithPrevious,\n      JsSplitDelimiterBehavior::MergedWithNext => SplitDelimiterBehavior::MergedWithNext,\n      JsSplitDelimiterBehavior::Contiguous => SplitDelimiterBehavior::Contiguous,\n    }\n  }\n}\n\n/// PreTokenizers\n#[derive(Clone, Debug, Serialize, Deserialize)]\n#[napi]\npub struct PreTokenizer {\n  #[serde(flatten, with = \"arc_rwlock_serde\")]\n  pretok: Option<Arc<RwLock<PreTokenizerWrapper>>>,\n}\n\nimpl tk::PreTokenizer for PreTokenizer {\n  fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> tk::Result<()> {\n    self\n      .pretok\n      .as_ref()\n      .ok_or(\"Uninitialized PreTokenizer\")?\n      .read()\n      .unwrap()\n      .pre_tokenize(pretokenized)?;\n\n    Ok(())\n  }\n}\n\n#[napi]\nimpl PreTokenizer {\n  #[napi(ts_return_type = \"[string, [number, number]][]\")]\n  pub fn pre_tokenize_string(&self, sequence: String, env: Env) -> Result<Vec<Array>> {\n    use tk::PreTokenizer;\n\n    let mut pretokenized = PreTokenizedString::from(sequence);\n\n    self\n      .pre_tokenize(&mut pretokenized)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))?;\n\n    pretokenized\n      .get_splits(tk::OffsetReferential::Original, tk::OffsetType::Char)\n      .into_iter()\n      .map(|(s, (start, end), _)| -> Result<Array> {\n        let mut arr = env.create_array(2)?;\n        let mut offset = env.create_array(2)?;\n        offset.set(0, env.create_uint32(start as u32)?)?;\n        offset.set(1, env.create_uint32(end as u32)?)?;\n        arr.set(0, env.create_string(s)?)?;\n        arr.set(1, offset)?;\n        Ok(arr)\n      })\n      .collect::<Result<Vec<_>>>()\n  }\n}\n\n/// byte_level(addPrefixSpace: bool = true, useRegex: bool = true)\n#[napi]\npub fn byte_level_pre_tokenizer(\n  add_prefix_space: Option<bool>,\n  use_regex: Option<bool>,\n) -> PreTokenizer {\n  let mut byte_level = tk::pre_tokenizers::byte_level::ByteLevel::default();\n  if let Some(add_prefix_space) = add_prefix_space {\n    byte_level = byte_level.add_prefix_space(add_prefix_space);\n  }\n  if let Some(use_regex) = use_regex {\n    byte_level = byte_level.use_regex(use_regex);\n  }\n\n  PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(byte_level.into()))),\n  }\n}\n\n#[napi]\npub fn byte_level_alphabet() -> Vec<String> {\n  tk::pre_tokenizers::byte_level::ByteLevel::alphabet()\n    .into_iter()\n    .map(|c| c.to_string())\n    .collect::<Vec<_>>()\n}\n\n#[napi]\npub fn whitespace_pre_tokenizer() -> PreTokenizer {\n  PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::whitespace::Whitespace.into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn whitespace_split_pre_tokenizer() -> PreTokenizer {\n  PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::whitespace::WhitespaceSplit.into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn bert_pre_tokenizer() -> PreTokenizer {\n  PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::bert::BertPreTokenizer.into(),\n    ))),\n  }\n}\n\n#[napi]\npub fn metaspace_pre_tokenizer(\n  #[napi(ts_arg_type = \"string = '▁'\")] replacement: Option<String>,\n  #[napi(ts_arg_type = \"prepend_scheme = 'always'\")] prepend_scheme: Option<String>,\n  #[napi(ts_arg_type = \"split = true\")] split: Option<bool>,\n) -> Result<PreTokenizer> {\n  use tk::pre_tokenizers::metaspace::PrependScheme;\n  let split = split.unwrap_or(true);\n  let replacement = replacement.unwrap_or(\"▁\".to_string());\n  if replacement.chars().count() != 1 {\n    return Err(Error::from_reason(\n      \"replacement is supposed to be a single char\",\n    ));\n  }\n  let replacement = replacement.chars().next().unwrap();\n  let prepend_scheme: PrependScheme =\n    match prepend_scheme.unwrap_or(String::from(\"always\")).as_str() {\n      \"always\" => PrependScheme::Always,\n      \"first\" => PrependScheme::First,\n      \"never\" => PrependScheme::Never,\n      _ => {\n        return Err(Error::from_reason(\n          \"prepend_scheme is supposed to be either 'always', 'first' or 'never'\",\n        ));\n      }\n    };\n\n  Ok(PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::metaspace::Metaspace::new(replacement, prepend_scheme, split).into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn split_pre_tokenizer(\n  pattern: String,\n  behavior: String,\n  invert: Option<bool>,\n) -> Result<PreTokenizer> {\n  let behavior: JsSplitDelimiterBehavior = behavior.try_into()?;\n  let invert = invert.unwrap_or(false);\n\n  Ok(PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::split::Split::new(pattern, behavior.into(), invert)\n        .map_err(|e| Error::from_reason(e.to_string()))?\n        .into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn punctuation_pre_tokenizer(behavior: Option<String>) -> Result<PreTokenizer> {\n  let behavior = match behavior {\n    Some(behavior) => behavior.try_into()?,\n    None => JsSplitDelimiterBehavior::Isolated,\n  };\n\n  Ok(PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::punctuation::Punctuation::new(behavior.into()).into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn sequence_pre_tokenizer(pre_tokenizers: Vec<&PreTokenizer>) -> PreTokenizer {\n  let mut sequence: Vec<PreTokenizerWrapper> = Vec::with_capacity(pre_tokenizers.len());\n  pre_tokenizers.into_iter().for_each(|pre_tokenizer| {\n    if let Some(pre_tokenizer) = &pre_tokenizer.pretok {\n      sequence.push((**pre_tokenizer).read().unwrap().clone())\n    }\n  });\n  PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(PreTokenizerWrapper::Sequence(\n      tk::pre_tokenizers::sequence::Sequence::new(sequence),\n    )))),\n  }\n}\n\n#[napi]\npub fn char_delimiter_split(delimiter: String) -> Result<PreTokenizer> {\n  if delimiter.chars().count() != 1 {\n    return Err(Error::from_reason(\n      \"delimiter is supposed to be a single char\",\n    ));\n  }\n  let delimiter = delimiter.chars().next().unwrap();\n\n  Ok(PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::delimiter::CharDelimiterSplit::new(delimiter).into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn digits_pre_tokenizer(individual_digits: Option<bool>) -> PreTokenizer {\n  let individual_digits = individual_digits.unwrap_or(false);\n\n  PreTokenizer {\n    pretok: Some(Arc::new(RwLock::new(\n      tk::pre_tokenizers::digits::Digits::new(individual_digits).into(),\n    ))),\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/processors.rs",
    "content": "use crate::arc_rwlock_serde;\nuse serde::{Deserialize, Serialize};\nextern crate tokenizers as tk;\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse std::sync::{Arc, RwLock};\n\nuse tk::processors::PostProcessorWrapper;\nuse tk::Encoding;\n\n#[derive(Clone, Serialize, Deserialize)]\n#[napi]\npub struct Processor {\n  #[serde(flatten, with = \"arc_rwlock_serde\")]\n  processor: Option<Arc<RwLock<PostProcessorWrapper>>>,\n}\n\nimpl tk::PostProcessor for Processor {\n  fn added_tokens(&self, is_pair: bool) -> usize {\n    self\n      .processor\n      .as_ref()\n      .expect(\"Uninitialized PostProcessor\")\n      .read()\n      .unwrap()\n      .added_tokens(is_pair)\n  }\n\n  fn process_encodings(\n    &self,\n    encodings: Vec<Encoding>,\n    add_special_tokens: bool,\n  ) -> tk::Result<Vec<Encoding>> {\n    self\n      .processor\n      .as_ref()\n      .ok_or(\"Uninitialized PostProcessor\")?\n      .read()\n      .unwrap()\n      .process_encodings(encodings, add_special_tokens)\n  }\n}\n\n#[napi]\npub fn bert_processing(sep: (String, u32), cls: (String, u32)) -> Result<Processor> {\n  Ok(Processor {\n    processor: Some(Arc::new(RwLock::new(\n      tk::processors::bert::BertProcessing::new(sep, cls).into(),\n    ))),\n  })\n}\n\n#[napi]\npub fn roberta_processing(\n  sep: (String, u32),\n  cls: (String, u32),\n  trim_offsets: Option<bool>,\n  add_prefix_space: Option<bool>,\n) -> Result<Processor> {\n  let trim_offsets = trim_offsets.unwrap_or(true);\n  let add_prefix_space = add_prefix_space.unwrap_or(true);\n\n  let mut processor = tk::processors::roberta::RobertaProcessing::new(sep, cls);\n  processor = processor.trim_offsets(trim_offsets);\n  processor = processor.add_prefix_space(add_prefix_space);\n\n  Ok(Processor {\n    processor: Some(Arc::new(RwLock::new(processor.into()))),\n  })\n}\n\n#[napi]\npub fn byte_level_processing(trim_offsets: Option<bool>) -> Result<Processor> {\n  let mut byte_level = tk::processors::byte_level::ByteLevel::default();\n\n  if let Some(trim_offsets) = trim_offsets {\n    byte_level = byte_level.trim_offsets(trim_offsets);\n  }\n\n  Ok(Processor {\n    processor: Some(Arc::new(RwLock::new(byte_level.into()))),\n  })\n}\n\n#[napi]\npub fn template_processing(\n  single: String,\n  pair: Option<String>,\n  special_tokens: Option<Vec<(String, u32)>>,\n) -> Result<Processor> {\n  let special_tokens = special_tokens.unwrap_or_default();\n  let mut builder = tk::processors::template::TemplateProcessing::builder();\n  builder.try_single(single).map_err(Error::from_reason)?;\n  builder.special_tokens(special_tokens);\n  if let Some(pair) = pair {\n    builder.try_pair(pair).map_err(Error::from_reason)?;\n  }\n  let processor = builder\n    .build()\n    .map_err(|e| Error::from_reason(e.to_string()))?;\n\n  Ok(Processor {\n    processor: Some(Arc::new(RwLock::new(processor.into()))),\n  })\n}\n\n#[napi]\npub fn sequence_processing(processors: Vec<&Processor>) -> Processor {\n  let sequence: Vec<tk::PostProcessorWrapper> = processors\n    .into_iter()\n    .filter_map(|processor| {\n      processor\n        .processor\n        .as_ref()\n        .map(|processor| (**processor).read().unwrap().clone())\n    })\n    .clone()\n    .collect();\n  Processor {\n    processor: Some(Arc::new(RwLock::new(PostProcessorWrapper::Sequence(\n      tk::processors::sequence::Sequence::new(sequence),\n    )))),\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/tasks/mod.rs",
    "content": "pub mod models;\npub mod tokenizer;\n"
  },
  {
    "path": "bindings/node/src/tasks/models.rs",
    "content": "extern crate tokenizers as tk;\n\nuse crate::models::Model;\nuse napi::bindgen_prelude::*;\nuse std::sync::{Arc, RwLock};\nuse tokenizers::models::bpe::{BpeBuilder, BPE};\nuse tokenizers::models::wordlevel::{WordLevel, WordLevelBuilder};\nuse tokenizers::models::wordpiece::{WordPiece, WordPieceBuilder};\n\npub struct BPEFromFilesTask {\n  pub(crate) builder: Option<BpeBuilder>,\n}\n\nimpl Task for BPEFromFilesTask {\n  type Output = BPE;\n  type JsValue = Model;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    self\n      .builder\n      .take()\n      .ok_or(Error::from_reason(\"Empty builder\".to_string()))?\n      .build()\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(output.into()))),\n    })\n  }\n}\n\npub struct WordPieceFromFilesTask {\n  pub(crate) builder: Option<WordPieceBuilder>,\n}\n\nimpl Task for WordPieceFromFilesTask {\n  type Output = WordPiece;\n  type JsValue = Model;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    self\n      .builder\n      .take()\n      .ok_or(Error::from_reason(\"Empty builder\".to_string()))?\n      .build()\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(output.into()))),\n    })\n  }\n}\npub struct WordLevelFromFilesTask {\n  pub(crate) builder: Option<WordLevelBuilder>,\n}\n\nimpl Task for WordLevelFromFilesTask {\n  type Output = WordLevel;\n  type JsValue = Model;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    self\n      .builder\n      .take()\n      .ok_or(Error::from_reason(\"Empty builder\".to_string()))?\n      .build()\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(Model {\n      model: Some(Arc::new(RwLock::new(output.into()))),\n    })\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/tasks/tokenizer.rs",
    "content": "extern crate tokenizers as tk;\n\nuse crate::encoding::*;\nuse crate::tokenizer::Tokenizer;\nuse napi::bindgen_prelude::*;\nuse tk::tokenizer::{EncodeInput, Encoding};\n\npub struct EncodeTask<'s> {\n  pub tokenizer: Tokenizer,\n  pub input: Option<EncodeInput<'s>>,\n  pub add_special_tokens: bool,\n}\n\nimpl Task for EncodeTask<'static> {\n  type Output = Encoding;\n  type JsValue = JsEncoding;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    self\n      .tokenizer\n      .tokenizer\n      .read()\n      .unwrap()\n      .encode_char_offsets(\n        self\n          .input\n          .take()\n          .ok_or(Error::from_reason(\"No provided input\"))?,\n        self.add_special_tokens,\n      )\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(JsEncoding {\n      encoding: Some(output),\n    })\n  }\n}\n\npub struct DecodeTask {\n  pub tokenizer: Tokenizer,\n  pub ids: Vec<u32>,\n  pub skip_special_tokens: bool,\n}\n\nimpl Task for DecodeTask {\n  type Output = String;\n  type JsValue = String;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    self\n      .tokenizer\n      .tokenizer\n      .read()\n      .unwrap()\n      .decode(&self.ids, self.skip_special_tokens)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(output)\n  }\n}\npub struct EncodeBatchTask<'s> {\n  pub tokenizer: Tokenizer,\n  pub inputs: Option<Vec<EncodeInput<'s>>>,\n  pub add_special_tokens: bool,\n}\n\nimpl Task for EncodeBatchTask<'static> {\n  type Output = Vec<Encoding>;\n  type JsValue = Vec<JsEncoding>;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    self\n      .tokenizer\n      .tokenizer\n      .read()\n      .unwrap()\n      .encode_batch_char_offsets(\n        self\n          .inputs\n          .take()\n          .ok_or(Error::from_reason(\"No provided input\"))?,\n        self.add_special_tokens,\n      )\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(\n      output\n        .into_iter()\n        .map(|encoding| JsEncoding {\n          encoding: Some(encoding),\n        })\n        .collect(),\n    )\n  }\n}\n\npub struct DecodeBatchTask {\n  pub tokenizer: Tokenizer,\n  pub ids: Vec<Vec<u32>>,\n  pub skip_special_tokens: bool,\n}\n\nimpl Task for DecodeBatchTask {\n  type Output = Vec<String>;\n  type JsValue = Vec<String>;\n\n  fn compute(&mut self) -> Result<Self::Output> {\n    let ids: Vec<_> = self.ids.iter().map(|s| s.as_slice()).collect();\n    self\n      .tokenizer\n      .tokenizer\n      .read()\n      .unwrap()\n      .decode_batch(&ids, self.skip_special_tokens)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  fn resolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> {\n    Ok(output)\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/tokenizer.rs",
    "content": "use crate::decoders::Decoder;\nuse crate::encoding::{JsEncoding, JsTruncationDirection, JsTruncationStrategy};\nuse crate::models::Model;\nuse crate::normalizers::Normalizer;\nuse crate::pre_tokenizers::PreTokenizer;\nuse crate::processors::Processor;\nuse crate::tasks::tokenizer::{DecodeBatchTask, DecodeTask, EncodeBatchTask, EncodeTask};\nuse crate::trainers::Trainer;\nuse std::collections::HashMap;\nuse tokenizers::Model as ModelTrait;\n\nuse napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse std::sync::{Arc, RwLock};\nuse tokenizers as tk;\n\n#[napi]\n#[derive(Default)]\npub enum PaddingDirection {\n  #[default]\n  Left,\n  Right,\n}\n\nimpl From<PaddingDirection> for tk::PaddingDirection {\n  fn from(w: PaddingDirection) -> Self {\n    match w {\n      PaddingDirection::Left => tk::PaddingDirection::Left,\n      PaddingDirection::Right => tk::PaddingDirection::Right,\n    }\n  }\n}\n\nimpl TryFrom<String> for PaddingDirection {\n  type Error = Error;\n  fn try_from(w: String) -> Result<Self> {\n    match w.as_str() {\n      \"left\" => Ok(PaddingDirection::Left),\n      \"right\" => Ok(PaddingDirection::Right),\n      s => Err(Error::from_reason(format!(\n        \"{s:?} is not a valid direction\"\n      ))),\n    }\n  }\n}\n\n#[napi(object)]\n#[derive(Default)]\npub struct PaddingOptions {\n  pub max_length: Option<u32>,\n  pub direction: Option<Either<String, PaddingDirection>>,\n  pub pad_to_multiple_of: Option<u32>,\n  pub pad_id: Option<u32>,\n  pub pad_type_id: Option<u32>,\n  pub pad_token: Option<String>,\n}\n\nimpl TryFrom<PaddingOptions> for tk::PaddingParams {\n  type Error = Error;\n  fn try_from(value: PaddingOptions) -> Result<Self> {\n    let direction = match value.direction {\n      Some(either) => match either {\n        Either::A(string) => {\n          let direction: PaddingDirection = string.try_into()?;\n          direction.into()\n        }\n        Either::B(direction) => direction.into(),\n      },\n      None => tk::PaddingDirection::Right,\n    };\n    Ok(Self {\n      pad_to_multiple_of: value.pad_to_multiple_of.map(|s| s as usize),\n      pad_id: value.pad_id.unwrap_or_default(),\n      pad_type_id: value.pad_type_id.unwrap_or_default(),\n      pad_token: value.pad_token.unwrap_or(\"[PAD]\".to_string()),\n      direction,\n      strategy: match value.max_length {\n        Some(length) => tk::PaddingStrategy::Fixed(length as usize),\n        None => tk::PaddingStrategy::BatchLongest,\n      },\n    })\n  }\n}\n\n#[napi(object)]\n#[derive(Default)]\npub struct EncodeOptions {\n  pub is_pretokenized: Option<bool>,\n  pub add_special_tokens: Option<bool>,\n}\n\n#[derive(Default)]\nstruct EncodeOptionsDef {\n  // TODO\n  // is_pretokenized: bool,\n  add_special_tokens: bool,\n}\n\nimpl From<EncodeOptions> for EncodeOptionsDef {\n  fn from(value: EncodeOptions) -> Self {\n    EncodeOptionsDef {\n      // TODO\n      // is_pretokenized: value.is_pretokenized.unwrap_or(false),\n      add_special_tokens: value.add_special_tokens.unwrap_or(true),\n    }\n  }\n}\n\n#[napi(object)]\n#[derive(Default)]\npub struct TruncationOptions {\n  pub max_length: Option<u32>,\n  pub strategy: Option<JsTruncationStrategy>,\n  pub direction: Option<Either<String, JsTruncationDirection>>,\n  pub stride: Option<u32>,\n}\n\nimpl TryFrom<TruncationOptions> for tk::TruncationParams {\n  type Error = Error;\n  fn try_from(value: TruncationOptions) -> Result<Self> {\n    let direction = match value.direction {\n      Some(either) => match either {\n        Either::A(string) => {\n          let direction: JsTruncationDirection = string.try_into()?;\n          direction.into()\n        }\n        Either::B(direction) => direction.into(),\n      },\n      None => Default::default(),\n    };\n    Ok(Self {\n      max_length: value.max_length.unwrap_or(0) as usize,\n      strategy: value.strategy.map(|s| s.into()).unwrap_or_default(),\n      direction,\n      stride: value.stride.unwrap_or_default() as usize,\n    })\n  }\n}\n\n#[napi(object)]\npub struct AddedTokenOptions {\n  pub single_word: Option<bool>,\n  pub left_strip: Option<bool>,\n  pub right_strip: Option<bool>,\n  pub normalized: Option<bool>,\n}\n\n#[napi]\n#[derive(Clone)]\npub struct AddedToken {\n  token: tk::AddedToken,\n}\n\n#[napi]\nimpl AddedToken {\n  #[napi(constructor)]\n  pub fn from(token: String, is_special: bool, options: Option<AddedTokenOptions>) -> Self {\n    let mut token = tk::AddedToken::from(token, is_special);\n    if let Some(options) = options {\n      if let Some(sw) = options.single_word {\n        token = token.single_word(sw);\n      }\n      if let Some(ls) = options.left_strip {\n        token = token.lstrip(ls);\n      }\n      if let Some(rs) = options.right_strip {\n        token = token.rstrip(rs);\n      }\n      if let Some(n) = options.normalized {\n        token = token.normalized(n);\n      }\n    }\n    Self { token }\n  }\n\n  #[napi]\n  pub fn get_content(&self) -> String {\n    self.token.content.clone()\n  }\n}\n\nimpl From<AddedToken> for tk::AddedToken {\n  fn from(v: AddedToken) -> Self {\n    v.token\n  }\n}\n\ntype RsTokenizer = tk::TokenizerImpl<Model, Normalizer, PreTokenizer, Processor, Decoder>;\n\n#[napi]\n#[derive(Clone)]\npub struct Tokenizer {\n  pub(crate) tokenizer: Arc<RwLock<RsTokenizer>>,\n}\n\n#[napi]\nimpl Tokenizer {\n  #[napi(constructor)]\n  pub fn new(model: &Model) -> Self {\n    Self {\n      tokenizer: Arc::new(RwLock::new(tk::TokenizerImpl::new((*model).clone()))),\n    }\n  }\n\n  #[napi]\n  pub fn set_pre_tokenizer(&mut self, pre_tokenizer: &PreTokenizer) {\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .with_pre_tokenizer(Some((*pre_tokenizer).clone()));\n  }\n\n  #[napi]\n  pub fn set_decoder(&mut self, decoder: &Decoder) {\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .with_decoder(Some((*decoder).clone()));\n  }\n\n  #[napi]\n  pub fn set_model(&mut self, model: &Model) {\n    self.tokenizer.write().unwrap().with_model((*model).clone());\n  }\n\n  #[napi]\n  pub fn set_post_processor(&mut self, post_processor: &Processor) {\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .with_post_processor(Some((*post_processor).clone()));\n  }\n\n  #[napi]\n  pub fn set_normalizer(&mut self, normalizer: &Normalizer) {\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .with_normalizer(Some((*normalizer).clone()));\n  }\n\n  #[napi]\n  pub fn save(&self, path: String, pretty: Option<bool>) -> Result<()> {\n    let pretty = pretty.unwrap_or(false);\n    self\n      .tokenizer\n      .read()\n      .unwrap()\n      .save(path, pretty)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))\n  }\n\n  #[napi]\n  pub fn add_added_tokens(&mut self, tokens: Vec<&AddedToken>) -> u32 {\n    let tokens: Vec<_> = tokens\n      .into_iter()\n      .map(|tok| (*tok).clone().into())\n      .collect();\n    self.tokenizer.write().unwrap().add_tokens(&tokens) as u32\n  }\n\n  #[napi]\n  pub fn add_tokens(&mut self, tokens: Vec<String>) -> u32 {\n    let tokens: Vec<_> = tokens\n      .into_iter()\n      .map(|tok| tk::AddedToken::from(tok, false))\n      .collect();\n    self.tokenizer.write().unwrap().add_tokens(&tokens) as u32\n  }\n\n  #[napi(ts_return_type = \"Promise<JsEncoding>\")]\n  pub fn encode(\n    &self,\n    #[napi(ts_arg_type = \"InputSequence\")] sentence: String,\n    #[napi(ts_arg_type = \"InputSequence | null\")] pair: Option<String>,\n    encode_options: Option<EncodeOptions>,\n  ) -> AsyncTask<EncodeTask<'static>> {\n    let options: EncodeOptionsDef = encode_options.unwrap_or_default().into();\n    let input: tk::EncodeInput = match pair {\n      Some(pair) => (sentence, pair).into(),\n      None => sentence.into(),\n    };\n\n    AsyncTask::new(EncodeTask {\n      tokenizer: (*self).clone(),\n      input: Some(input),\n      add_special_tokens: options.add_special_tokens,\n    })\n  }\n\n  #[napi(ts_return_type = \"Promise<JsEncoding[]>\")]\n  pub fn encode_batch(\n    &self,\n    #[napi(ts_arg_type = \"EncodeInput[]\")] sentences: Vec<String>,\n    encode_options: Option<EncodeOptions>,\n  ) -> AsyncTask<EncodeBatchTask<'static>> {\n    let options: EncodeOptionsDef = encode_options.unwrap_or_default().into();\n    let inputs: Vec<tk::EncodeInput> = sentences\n      .into_iter()\n      .map(|sentence| sentence.into())\n      .collect();\n\n    AsyncTask::new(EncodeBatchTask {\n      tokenizer: (*self).clone(),\n      inputs: Some(inputs),\n      add_special_tokens: options.add_special_tokens,\n    })\n  }\n\n  #[napi(ts_return_type = \"Promise<string>\")]\n  pub fn decode(&self, ids: Vec<u32>, skip_special_tokens: bool) -> AsyncTask<DecodeTask> {\n    AsyncTask::new(DecodeTask {\n      tokenizer: (*self).clone(),\n      ids,\n      skip_special_tokens,\n    })\n  }\n\n  #[napi(ts_return_type = \"Promise<string[]>\")]\n  pub fn decode_batch(\n    &self,\n    ids: Vec<Vec<u32>>,\n    skip_special_tokens: bool,\n  ) -> AsyncTask<DecodeBatchTask> {\n    AsyncTask::new(DecodeBatchTask {\n      tokenizer: (*self).clone(),\n      ids,\n      skip_special_tokens,\n    })\n  }\n\n  #[napi(factory)]\n  pub fn from_string(s: String) -> Result<Self> {\n    let tokenizer: tk::tokenizer::TokenizerImpl<\n      Model,\n      Normalizer,\n      PreTokenizer,\n      Processor,\n      Decoder,\n    > = s.parse().map_err(|e| Error::from_reason(format!(\"{e}\")))?;\n    Ok(Self {\n      tokenizer: Arc::new(RwLock::new(tokenizer)),\n    })\n  }\n\n  #[napi(factory)]\n  pub fn from_file(file: String) -> Result<Self> {\n    let tokenizer = tk::tokenizer::TokenizerImpl::from_file(file)\n      .map_err(|e| Error::from_reason(format!(\"Error loading from file{e}\")))?;\n    Ok(Self {\n      tokenizer: Arc::new(RwLock::new(tokenizer)),\n    })\n  }\n\n  #[napi]\n  pub fn add_special_tokens(&mut self, tokens: Vec<String>) {\n    let tokens: Vec<_> = tokens\n      .into_iter()\n      .map(|s| tk::AddedToken::from(s, true))\n      .collect();\n    self.tokenizer.write().unwrap().add_special_tokens(&tokens);\n  }\n\n  #[napi]\n  pub fn set_truncation(\n    &mut self,\n    max_length: u32,\n    options: Option<TruncationOptions>,\n  ) -> Result<()> {\n    let mut options: tk::TruncationParams = if let Some(options) = options {\n      options.try_into()?\n    } else {\n      Default::default()\n    };\n    options.max_length = max_length as usize;\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .with_truncation(Some(options))\n      .unwrap();\n    Ok(())\n  }\n\n  #[napi]\n  pub fn disable_truncation(&mut self) {\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .with_truncation(None)\n      .unwrap();\n  }\n\n  #[napi]\n  pub fn set_padding(&mut self, options: Option<PaddingOptions>) -> Result<()> {\n    let options = if let Some(options) = options {\n      Some(options.try_into()?)\n    } else {\n      None\n    };\n    self.tokenizer.write().unwrap().with_padding(options);\n    Ok(())\n  }\n\n  #[napi]\n  pub fn disable_padding(&mut self) {\n    self.tokenizer.write().unwrap().with_padding(None);\n  }\n\n  #[napi]\n  pub fn get_decoder(&self) -> Option<Decoder> {\n    self.tokenizer.read().unwrap().get_decoder().cloned()\n  }\n\n  #[napi]\n  pub fn get_normalizer(&self) -> Option<Normalizer> {\n    self.tokenizer.read().unwrap().get_normalizer().cloned()\n  }\n  #[napi]\n  pub fn get_pre_tokenizer(&self) -> Option<PreTokenizer> {\n    self.tokenizer.read().unwrap().get_pre_tokenizer().cloned()\n  }\n  #[napi]\n  pub fn get_post_processor(&self) -> Option<Processor> {\n    self.tokenizer.read().unwrap().get_post_processor().cloned()\n  }\n\n  #[napi]\n  pub fn get_vocab(&self, with_added_tokens: Option<bool>) -> HashMap<String, u32> {\n    let with_added_tokens = with_added_tokens.unwrap_or(true);\n    self.tokenizer.read().unwrap().get_vocab(with_added_tokens)\n  }\n\n  #[napi]\n  pub fn get_vocab_size(&self, with_added_tokens: Option<bool>) -> u32 {\n    self.get_vocab(with_added_tokens).len() as u32\n  }\n\n  #[napi]\n  pub fn id_to_token(&self, id: u32) -> Option<String> {\n    self.tokenizer.read().unwrap().id_to_token(id)\n  }\n\n  #[napi]\n  pub fn token_to_id(&self, token: String) -> Option<u32> {\n    self.tokenizer.read().unwrap().token_to_id(&token)\n  }\n\n  #[napi]\n  pub fn train(&mut self, files: Vec<String>) -> Result<()> {\n    let mut trainer: Trainer = self\n      .tokenizer\n      .read()\n      .unwrap()\n      .get_model()\n      .model\n      .as_ref()\n      .unwrap()\n      .read()\n      .unwrap()\n      .get_trainer()\n      .into();\n    self\n      .tokenizer\n      .write()\n      .unwrap()\n      .train_from_files(&mut trainer, files)\n      .map_err(|e| Error::from_reason(format!(\"{e}\")))?;\n    Ok(())\n  }\n\n  #[napi]\n  pub fn running_tasks(&self) -> u32 {\n    std::sync::Arc::strong_count(&self.tokenizer) as u32\n  }\n\n  #[napi]\n  pub fn post_process(\n    &self,\n    encoding: &JsEncoding,\n    pair: Option<&JsEncoding>,\n    add_special_tokens: Option<bool>,\n  ) -> Result<JsEncoding> {\n    let add_special_tokens = add_special_tokens.unwrap_or(true);\n\n    Ok(\n      self\n        .tokenizer\n        .read()\n        .unwrap()\n        .post_process(\n          (*encoding).clone().try_into()?,\n          if let Some(pair) = pair {\n            Some((*pair).clone().try_into()?)\n          } else {\n            None\n          },\n          add_special_tokens,\n        )\n        .map_err(|e| Error::from_reason(format!(\"{e}\")))?\n        .into(),\n    )\n  }\n}\n\n#[napi(object)]\n#[derive(Default)]\npub struct JsFromPretrainedParameters {\n  pub revision: Option<String>,\n  pub auth_token: Option<String>,\n}\n"
  },
  {
    "path": "bindings/node/src/trainers.rs",
    "content": "use crate::models::Model;\nuse napi_derive::napi;\nuse std::sync::{Arc, RwLock};\nuse tokenizers as tk;\nuse tokenizers::models::TrainerWrapper;\n\n#[napi]\npub struct Trainer {\n  trainer: Option<Arc<RwLock<TrainerWrapper>>>,\n}\n\nimpl From<TrainerWrapper> for Trainer {\n  fn from(trainer: TrainerWrapper) -> Self {\n    Self {\n      trainer: Some(Arc::new(RwLock::new(trainer))),\n    }\n  }\n}\n\nimpl tk::Trainer for Trainer {\n  type Model = Model;\n\n  fn should_show_progress(&self) -> bool {\n    self\n      .trainer\n      .as_ref()\n      .expect(\"Uninitialized Trainer\")\n      .read()\n      .unwrap()\n      .should_show_progress()\n  }\n\n  fn train(&self, model: &mut Self::Model) -> tk::Result<Vec<tk::AddedToken>> {\n    let special_tokens = self\n      .trainer\n      .as_ref()\n      .ok_or(\"Uninitialized Trainer\")?\n      .read()\n      .unwrap()\n      .train(\n        &mut model\n          .model\n          .as_ref()\n          .ok_or(\"Uninitialized Model\")?\n          .write()\n          .unwrap(),\n      )?;\n\n    Ok(special_tokens)\n  }\n\n  fn feed<I, S, F>(&mut self, iterator: I, process: F) -> tk::Result<()>\n  where\n    I: Iterator<Item = S> + Send,\n    S: AsRef<str> + Send,\n    F: Fn(&str) -> tk::Result<Vec<String>> + Sync,\n  {\n    self\n      .trainer\n      .as_ref()\n      .ok_or(\"Uninitialized Trainer\")?\n      .write()\n      .unwrap()\n      .feed(iterator, process)\n  }\n}\n"
  },
  {
    "path": "bindings/node/src/utils.rs",
    "content": "use napi::bindgen_prelude::*;\nuse napi_derive::napi;\nuse tokenizers as tk;\nuse tokenizers::Encoding;\n\nuse crate::encoding::JsEncoding;\n\n#[napi]\npub fn slice(s: String, begin_index: Option<i32>, end_index: Option<i32>) -> Result<String> {\n  let len = s.chars().count();\n\n  let get_index = |x: i32| -> usize {\n    if x >= 0 {\n      x as usize\n    } else {\n      (len as i32 + x) as usize\n    }\n  };\n\n  let begin_index = get_index(begin_index.unwrap_or(0));\n  let end_index = get_index(end_index.unwrap_or(len as i32));\n\n  if let Some(slice) = tk::tokenizer::normalizer::get_range_of(&s, begin_index..end_index) {\n    Ok(slice.to_string())\n  } else {\n    Err(Error::new(\n      Status::GenericFailure,\n      \"Error in offsets\".to_string(),\n    ))\n  }\n}\n\n#[napi]\npub fn merge_encodings(\n  encodings: Vec<&JsEncoding>,\n  growing_offsets: Option<bool>,\n) -> Result<JsEncoding> {\n  let growing_offsets = growing_offsets.unwrap_or(false);\n\n  let encodings: Vec<_> = encodings\n    .into_iter()\n    .map(|enc| enc.encoding.to_owned().unwrap())\n    .collect();\n\n  let new_encoding = Encoding::merge(encodings, growing_offsets);\n  let js_encoding = JsEncoding {\n    encoding: Some(new_encoding),\n  };\n\n  Ok(js_encoding)\n}\n"
  },
  {
    "path": "bindings/node/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"strict\": true,\n    \"moduleResolution\": \"node\",\n    \"module\": \"CommonJS\",\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\".\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "bindings/node/types.ts",
    "content": "export type TextInputSequence = string\nexport type PreTokenizedInputSequence = string[]\nexport type InputSequence = TextInputSequence | PreTokenizedInputSequence\n\nexport type TextEncodeInput = TextInputSequence | [TextInputSequence, TextInputSequence]\nexport type PreTokenizedEncodeInput = PreTokenizedInputSequence | [PreTokenizedInputSequence, PreTokenizedInputSequence]\nexport type EncodeInput = TextEncodeInput | PreTokenizedEncodeInput\n"
  },
  {
    "path": "bindings/python/.cargo/config.toml",
    "content": "[target.x86_64-apple-darwin]\nrustflags = [\n  \"-C\", \"link-arg=-undefined\",\n  \"-C\", \"link-arg=dynamic_lookup\",\n  \"-C\", \"link-arg=-mmacosx-version-min=10.11\",\n]\n\n[target.aarch64-apple-darwin]\nrustflags = [\n  \"-C\", \"link-arg=-undefined\",\n  \"-C\", \"link-arg=dynamic_lookup\",\n  \"-C\", \"link-arg=-mmacosx-version-min=10.11\",\n]\n"
  },
  {
    "path": "bindings/python/.gitignore",
    "content": "data\n"
  },
  {
    "path": "bindings/python/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [0.13.2] \n\n- [#1096] Python 3.11 support\n\n## [0.13.1] \n\n- [#1072] Fixing Roberta type ids.\n\n## [0.13.0] \n\n- [#956] PyO3 version upgrade\n- [#1055] M1 automated builds\n- [#1008] `Decoder` is now a composable trait, but without being backward incompatible\n- [#1047, #1051, #1052] `Processor` is now a composable trait, but without being backward incompatible\n\nBoth trait changes warrant a \"major\" number since, despite best efforts to not break backward\n  compatibility, the code is different enough that we cannot be exactly sure.\n\n## [0.12.1] \n\n- [#938] **Reverted breaking change**. https://github.com/huggingface/transformers/issues/16520\n\n## [0.12.0] YANKED\n\nBump minor version because of a breaking change.\n\n- [#938] [REVERTED IN 0.12.1] **Breaking change**. Decoder trait is modified to be composable. This is only breaking if you are using decoders on their own. tokenizers should be error free.\n- [#939] Making the regex in `ByteLevel` pre_tokenizer optional (necessary for BigScience)\n\n- [#952] Fixed the vocabulary size of UnigramTrainer output (to respect added tokens)\n- [#954] Fixed not being able to save vocabularies with holes in vocab (ConvBert). Yell warnings instead, but stop panicking.\n- [#962] Fix tests for python 3.10\n- [#961] Added link for Ruby port of `tokenizers`\n\n## [0.11.6]\n\n- [#919] Fixing single_word AddedToken. (regression from 0.11.2)\n- [#916] Deserializing faster `added_tokens` by loading them in batch.\n\n## [0.11.5]\n\n- [#895] Build `python 3.10` wheels.\n\n## [0.11.4]\n\n- [#884] Fixing bad deserialization following inclusion of a default for Punctuation\n\n## [0.11.3]\n\n- [#882] Fixing Punctuation deserialize without argument.\n- [#868] Fixing missing direction in TruncationParams\n- [#860] Adding TruncationSide to TruncationParams\n\n## [0.11.0]\n\n### Fixed\n\n- [#585] Conda version should now work on old CentOS\n- [#844] Fixing interaction between `is_pretokenized` and `trim_offsets`.\n- [#851] Doc links\n\n### Added\n- [#657]: Add SplitDelimiterBehavior customization to Punctuation constructor\n- [#845]: Documentation for `Decoders`.\n\n### Changed\n- [#850]: Added a feature gate to enable disabling `http` features\n- [#718]: Fix `WordLevel` tokenizer determinism during training\n- [#762]: Add a way to specify the unknown token in `SentencePieceUnigramTokenizer`\n- [#770]: Improved documentation for `UnigramTrainer`\n- [#780]: Add `Tokenizer.from_pretrained` to load tokenizers from the Hugging Face Hub\n- [#793]: Saving a pretty JSON file by default when saving a tokenizer\n\n## [0.10.3]\n\n### Fixed\n- [#686]: Fix SPM conversion process for whitespace deduplication\n- [#707]: Fix stripping strings containing Unicode characters\n\n### Added\n- [#693]: Add a CTC Decoder for Wave2Vec models\n\n### Removed\n- [#714]: Removed support for Python 3.5\n\n## [0.10.2]\n\n### Fixed\n- [#652]: Fix offsets for `Precompiled` corner case\n- [#656]: Fix BPE `continuing_subword_prefix`\n- [#674]: Fix `Metaspace` serialization problems\n\n## [0.10.1]\n\n### Fixed\n- [#616]: Fix SentencePiece tokenizers conversion\n- [#617]: Fix offsets produced by Precompiled Normalizer (used by tokenizers converted from SPM)\n- [#618]: Fix Normalizer.normalize with `PyNormalizedStringRefMut`\n- [#620]: Fix serialization/deserialization for overlapping models\n- [#621]: Fix `ByteLevel` instantiation from a previously saved state (using `__getstate__()`)\n\n## [0.10.0]\n\n### Added\n- [#508]: Add a Visualizer for notebooks to help understand how the tokenizers work\n- [#519]: Add a `WordLevelTrainer` used to train a `WordLevel` model\n- [#533]: Add support for conda builds\n- [#542]: Add Split pre-tokenizer to easily split using a pattern\n- [#544]: Ability to train from memory. This also improves the integration with `datasets`\n- [#590]: Add getters/setters for components on BaseTokenizer\n- [#574]: Add `fust_unk` option to SentencePieceBPETokenizer\n\n### Changed\n- [#509]: Automatically stubbing the `.pyi` files\n- [#519]: Each `Model` can return its associated `Trainer` with `get_trainer()`\n- [#530]: The various attributes on each component can be get/set (ie.\n`tokenizer.model.dropout = 0.1`)\n- [#538]: The API Reference has been improved and is now up-to-date.\n\n### Fixed\n- [#519]: During training, the `Model` is now trained in-place. This fixes several bugs that were\nforcing to reload the `Model` after a training.\n- [#539]: Fix `BaseTokenizer` enable_truncation docstring\n\n## [0.9.4]\n\n### Fixed\n- [#492]: Fix `from_file` on `BertWordPieceTokenizer`\n- [#498]: Fix the link to download `sentencepiece_model_pb2.py`\n- [#500]: Fix a typo in the docs quicktour\n\n### Changed\n- [#506]: Improve Encoding mappings for pairs of sequence\n\n## [0.9.3]\n\n### Fixed\n- [#470]: Fix hanging error when training with custom component\n- [#476]: TemplateProcessing serialization is now deterministic\n- [#481]: Fix SentencePieceBPETokenizer.from_files\n\n### Added\n- [#477]: UnicodeScripts PreTokenizer to avoid merges between various scripts\n- [#480]: Unigram now accepts an `initial_alphabet` and handles `special_tokens` correctly\n\n## [0.9.2]\n\n### Fixed\n- [#464]: Fix a problem with RobertaProcessing being deserialized as BertProcessing\n\n## [0.9.1]\n\n### Fixed\n- [#459]: Fix a problem with deserialization\n\n## [0.9.0]\n\n### Fixed\n- [#362]: Fix training deadlock with Python components.\n- [#363]: Fix a crash when calling `.train` with some non-existent files\n- [#355]: Remove a lot of possible crashes\n- [#389]: Improve truncation (crash and consistency)\n\n### Added\n- [#379]: Add the ability to call `encode`/`encode_batch` with numpy arrays\n- [#292]: Support for the Unigram algorithm\n- [#378], [#394], [#416], [#417]: Many new Normalizer and PreTokenizer\n- [#403]: Add `TemplateProcessing` `PostProcessor`.\n- [#420]: Ability to fuse the \"unk\" token in BPE.\n\n### Changed\n- [#360]: Lots of improvements related to words/alignment tracking\n- [#426]: Improvements on error messages thanks to PyO3 0.12\n\n## [0.8.1]\n\n### Fixed\n- [#333]: Fix deserialization of `AddedToken`, where the content was not restored properly\n\n### Changed\n- [#329]: Improved warning and behavior when we detect a fork\n- [#330]: BertNormalizer now keeps the same behavior than the original implementation when\n`strip_accents` is not specified.\n\n## [0.8.0]\n\n### Highlights of this release\n- We can now encode both pre-tokenized inputs, and raw strings. This is especially usefull when\nprocessing datasets that are already pre-tokenized like for NER (Name Entity Recognition), and helps\nwhile applying labels to each word.\n- Full tokenizer serialization. It is now easy to save a tokenizer to a single JSON file, to later\nload it back with just one line of code. That's what sharing a Tokenizer means now: 1 line of code.\n- With the serialization comes the compatibility with `Pickle`! The Tokenizer, all of its components,\nEncodings, everything can be pickled!\n- Training a tokenizer is now even faster (up to 5-10x) than before!\n- Compatibility with `multiprocessing`, even when using the `fork` start method. Since this library\nmakes heavy use of the multithreading capacities of our computers to allows a very fast tokenization,\nthis led to problems (deadlocks) when used with `multiprocessing`. This version now allows to\ndisable the parallelism, and will warn you if this is necessary.\n- And a lot of other improvements, and fixes.\n\n### Fixed\n- [#286]: Fix various crash when training a BPE model\n- [#309]: Fixed a few bugs related to additional vocabulary/tokens\n\n### Added\n- [#272]: Serialization of the `Tokenizer` and all the parts (`PreTokenizer`, `Normalizer`, ...).\nThis adds some methods to easily save/load an entire tokenizer (`from_str`, `from_file`).\n- [#273]: `Tokenizer` and its parts are now pickable\n- [#289]: Ability to pad to a multiple of a specified value. This is especially useful to ensure\nactivation of the Tensor Cores, while ensuring padding to a multiple of 8. Use with\n`enable_padding(pad_to_multiple_of=8)` for example.\n- [#298]: Ability to get the currently set truncation/padding params\n- [#311]: Ability to enable/disable the parallelism using the `TOKENIZERS_PARALLELISM` environment\nvariable. This is especially usefull when using `multiprocessing` capabilities, with the `fork`\nstart method, which happens to be the default on Linux systems. Without disabling the parallelism,\nthe process dead-locks while encoding. (Cf [#187] for more information)\n\n### Changed\n- Improved errors generated during truncation: When the provided max length is too low are\nnow handled properly.\n- [#249] `encode` and `encode_batch` now accept pre-tokenized inputs. When the input is pre-tokenized,\nthe argument `is_pretokenized=True` must be specified.\n- [#276]: Improve BPE training speeds, by reading files sequentially, but parallelizing the\nprocessing of each file\n- [#280]: Use `onig` for byte-level pre-tokenization to remove all the differences with the original\nimplementation from GPT-2\n- [#309]: Improved the management of the additional vocabulary. This introduces an option\n`normalized`, controlling whether a token should be extracted from the normalized version of the\ninput text.\n\n## [0.7.0]\n\n### Changed\n- Only one progress bar while reading files during training. This is better for use-cases with\na high number of files as it avoids having too many progress bars on screen. Also avoids reading the\nsize of each file before starting to actually read these files, as this process could take really\nlong.\n- [#193]: `encode` and `encode_batch` now take a new optional argument, specifying whether we\nshould add the special tokens. This is activated by default.\n- [#197]: `original_str` and `normalized_str` have been removed from the `Encoding` returned by\n`encode` and `encode_batch`. This brings a reduction of 70% of the memory footprint.\n- [#197]: The offsets provided on `Encoding` are now relative to the original string, and not the\nnormalized one anymore.\n- The added token given to `add_special_tokens` or `add_tokens` on a `Tokenizer`, or while using\n`train(special_tokens=...)` can now be instances of `AddedToken` to provide more control over these\ntokens.\n- [#136]: Updated Pyo3 version\n- [#136]: Static methods `Model.from_files` and `Model.empty` are removed in favor of using\nconstructors.\n- [#239]: `CharBPETokenizer` now corresponds to OpenAI GPT BPE implementation by default.\n\n### Added\n- [#188]: `ByteLevel` is also a `PostProcessor` now and handles trimming the offsets if activated.\nThis avoids the unintuitive inclusion of the whitespaces in the produced offsets, even if these\nwhitespaces are part of the actual token.\nIt has been added to `ByteLevelBPETokenizer` but it is off by default (`trim_offsets=False`).\n- [#236]: `RobertaProcessing` also handles trimming the offsets.\n- [#234]: New alignment mappings on the `Encoding`. Provide methods to easily convert between `char`\nor `word` (input space) and `token` (output space).\n- `post_process` can be called on the `Tokenizer`\n- [#208]: Ability to retrieve the vocabulary from the `Tokenizer` with\n`get_vocab(with_added_tokens: bool)`\n- [#136] Models can now be instantiated through object constructors.\n\n### Fixed\n- [#193]: Fix some issues with the offsets being wrong with the `ByteLevel` BPE:\n\t- when `add_prefix_space=True`\n\t- [#156]: when a Unicode character gets split-up in multiple byte-level characters\n- Fix a bug where offsets were wrong when there was any added tokens in the sequence being encoded.\n- [#175]: Fix a bug that prevented the addition of more than a certain amount of tokens (even if\nnot advised, but that's not the question).\n- [#205]: Trim the decoded string in `BPEDecoder` used by `CharBPETokenizer`\n\n### How to migrate\n- Add the `ByteLevel` `PostProcessor` to your byte-level BPE tokenizers if relevant. If you are\nusing `ByteLevelBPETokenizer`, this option is disabled by default (`trim_offsets=False`).\n- `BertWordPieceTokenizer` option to `add_special_tokens` must now be given to `encode` or\n`encode_batch`\n- Access to the `original_str` on the `Encoding` has been removed. The original string is the input\nof `encode` so it didn't make sense to keep it here.\n- No need to call `original_str.offsets(offsets[N])` to convert offsets to the original string. They\nare now relative to the original string by default.\n- Access to the `normalized_str` on the `Encoding` has been removed. Can be retrieved by calling\n`normalize(sequence)` on the `Tokenizer`\n- Change `Model.from_files` and `Model.empty` to use constructor. The model constructor should take\nthe same arguments as the old methods. (ie `BPE(vocab, merges)` or `BPE()`)\n- If you were using the `CharBPETokenizer` and want to keep the same behavior as before, set\n`bert_normalizer=False` and `split_on_whitespace_only=True`.\n\n## [0.6.0]\n\n### Changed\n- [#165]: Big improvements in speed for BPE (Both training and tokenization)\n\n### Fixed\n- [#160]: Some default tokens were missing from `BertWordPieceTokenizer`\n- [#156]: There was a bug in ByteLevel PreTokenizer that caused offsets to be wrong if a char got\nsplit up in multiple bytes.\n- [#174]: The `longest_first` truncation strategy had a bug\n\n## [0.5.2]\n- [#163]: Do not open all files directly while training\n\n### Fixed\n- We introduced a bug related to the saving of the WordPiece model in 0.5.1: The `vocab.txt` file\nwas named `vocab.json`. This is now fixed.\n- The `WordLevel` model was also saving its vocabulary to the wrong format.\n\n## [0.5.1]\n\n### Changed\n- `name` argument is now optional when saving a `Model`'s vocabulary. When the name is not\nspecified, the files get a more generic naming, like `vocab.json` or `merges.txt`.\n\n## [0.5.0]\n\n### Changed\n- [#145]: `BertWordPieceTokenizer` now cleans up some tokenization artifacts while decoding\n- [#149]: `ByteLevelBPETokenizer` now has `dropout`.\n- `do_lowercase` has been changed to `lowercase` for consistency between the different tokenizers.\n(Especially `ByteLevelBPETokenizer` and `CharBPETokenizer`)\n- [#139]: Expose `__len__` on `Encoding`\n- Improved padding performances.\n\n### Added\n- Added a new `Strip` normalizer\n\n### Fixed\n- [#145]: Decoding was buggy on `BertWordPieceTokenizer`.\n- [#152]: Some documentation and examples were still using the old `BPETokenizer`\n\n### How to migrate\n- Use `lowercase` when initializing `ByteLevelBPETokenizer` or `CharBPETokenizer` instead of\n`do_lowercase`.\n\n## [0.4.2]\n\n### Fixed\n- [#137]: Fix a bug in the class `WordPieceTrainer` that prevented `BertWordPieceTokenizer` from\nbeing trained.\n\n## [0.4.1]\n\n### Fixed\n- [#134]: Fix a bug related to the punctuation in BertWordPieceTokenizer\n\n## [0.4.0]\n\n### Changed\n- [#131]: Replaced all .new() class methods by a proper __new__ implementation\n- Improved typings\n\n### How to migrate\n- Remove all `.new` on all classe instanciations\n\n## [0.3.0]\n\n### Changed\n- BPETokenizer has been renamed to CharBPETokenizer for clarity.\n- Improve truncation/padding and the handling of overflowing tokens. Now when a sequence gets\ntruncated, we provide a list of overflowing `Encoding` that are ready to be processed by a language\nmodel, just as the main `Encoding`.\n- Provide mapping to the original string offsets using:\n```\noutput = tokenizer.encode(...)\nprint(output.original_str.offsets(output.offsets[3]))\n```\n- [#99]: Exposed the vocabulary size on all tokenizers\n\n### Added\n- Added `CharDelimiterSplit`: a new `PreTokenizer` that allows splitting sequences on the given\ndelimiter (Works like `.split(delimiter)`)\n- Added `WordLevel`: a new model that simply maps `tokens` to their `ids`.\n\n### Fixed\n- Fix a bug with IndexableString\n- Fix a bug with truncation\n\n### How to migrate\n- Rename `BPETokenizer` to `CharBPETokenizer`\n- `Encoding.overflowing` is now a List instead of a `Optional[Encoding]`\n\n## [0.2.1]\n\n### Fixed\n- Fix a bug with the IDs associated with added tokens.\n- Fix a bug that was causing crashes in Python 3.5\n\n[#1096]: https://github.com/huggingface/tokenizers/pull/1096\n[#1072]: https://github.com/huggingface/tokenizers/pull/1072\n[#956]: https://github.com/huggingface/tokenizers/pull/956\n[#1008]: https://github.com/huggingface/tokenizers/pull/1008\n[#1009]: https://github.com/huggingface/tokenizers/pull/1009\n[#1047]: https://github.com/huggingface/tokenizers/pull/1047\n[#1055]: https://github.com/huggingface/tokenizers/pull/1055\n[#1051]: https://github.com/huggingface/tokenizers/pull/1051\n[#1052]: https://github.com/huggingface/tokenizers/pull/1052\n[#938]: https://github.com/huggingface/tokenizers/pull/938\n[#939]: https://github.com/huggingface/tokenizers/pull/939\n[#952]: https://github.com/huggingface/tokenizers/pull/952\n[#954]: https://github.com/huggingface/tokenizers/pull/954\n[#962]: https://github.com/huggingface/tokenizers/pull/962\n[#961]: https://github.com/huggingface/tokenizers/pull/961\n[#960]: https://github.com/huggingface/tokenizers/pull/960\n[#919]: https://github.com/huggingface/tokenizers/pull/919\n[#916]: https://github.com/huggingface/tokenizers/pull/916\n[#895]: https://github.com/huggingface/tokenizers/pull/895\n[#884]: https://github.com/huggingface/tokenizers/pull/884\n[#882]: https://github.com/huggingface/tokenizers/pull/882\n[#868]: https://github.com/huggingface/tokenizers/pull/868\n[#860]: https://github.com/huggingface/tokenizers/pull/860\n[#850]: https://github.com/huggingface/tokenizers/pull/850\n[#844]: https://github.com/huggingface/tokenizers/pull/844\n[#845]: https://github.com/huggingface/tokenizers/pull/845\n[#851]: https://github.com/huggingface/tokenizers/pull/851\n[#585]: https://github.com/huggingface/tokenizers/pull/585\n[#793]: https://github.com/huggingface/tokenizers/pull/793\n[#780]: https://github.com/huggingface/tokenizers/pull/780\n[#770]: https://github.com/huggingface/tokenizers/pull/770\n[#762]: https://github.com/huggingface/tokenizers/pull/762\n[#718]: https://github.com/huggingface/tokenizers/pull/718\n[#714]: https://github.com/huggingface/tokenizers/pull/714\n[#707]: https://github.com/huggingface/tokenizers/pull/707\n[#693]: https://github.com/huggingface/tokenizers/pull/693\n[#686]: https://github.com/huggingface/tokenizers/pull/686\n[#674]: https://github.com/huggingface/tokenizers/pull/674\n[#657]: https://github.com/huggingface/tokenizers/pull/657\n[#656]: https://github.com/huggingface/tokenizers/pull/656\n[#652]: https://github.com/huggingface/tokenizers/pull/652\n[#621]: https://github.com/huggingface/tokenizers/pull/621\n[#620]: https://github.com/huggingface/tokenizers/pull/620\n[#618]: https://github.com/huggingface/tokenizers/pull/618\n[#617]: https://github.com/huggingface/tokenizers/pull/617\n[#616]: https://github.com/huggingface/tokenizers/pull/616\n[#590]: https://github.com/huggingface/tokenizers/pull/590\n[#574]: https://github.com/huggingface/tokenizers/pull/574\n[#544]: https://github.com/huggingface/tokenizers/pull/544\n[#542]: https://github.com/huggingface/tokenizers/pull/542\n[#539]: https://github.com/huggingface/tokenizers/pull/539\n[#538]: https://github.com/huggingface/tokenizers/pull/538\n[#533]: https://github.com/huggingface/tokenizers/pull/533\n[#530]: https://github.com/huggingface/tokenizers/pull/530\n[#519]: https://github.com/huggingface/tokenizers/pull/519\n[#509]: https://github.com/huggingface/tokenizers/pull/509\n[#508]: https://github.com/huggingface/tokenizers/pull/508\n[#506]: https://github.com/huggingface/tokenizers/pull/506\n[#500]: https://github.com/huggingface/tokenizers/pull/500\n[#498]: https://github.com/huggingface/tokenizers/pull/498\n[#492]: https://github.com/huggingface/tokenizers/pull/492\n[#481]: https://github.com/huggingface/tokenizers/pull/481\n[#480]: https://github.com/huggingface/tokenizers/pull/480\n[#477]: https://github.com/huggingface/tokenizers/pull/477\n[#476]: https://github.com/huggingface/tokenizers/pull/476\n[#470]: https://github.com/huggingface/tokenizers/pull/470\n[#464]: https://github.com/huggingface/tokenizers/pull/464\n[#459]: https://github.com/huggingface/tokenizers/pull/459\n[#420]: https://github.com/huggingface/tokenizers/pull/420\n[#417]: https://github.com/huggingface/tokenizers/pull/417\n[#416]: https://github.com/huggingface/tokenizers/pull/416\n[#403]: https://github.com/huggingface/tokenizers/pull/403\n[#394]: https://github.com/huggingface/tokenizers/pull/394\n[#389]: https://github.com/huggingface/tokenizers/pull/389\n[#379]: https://github.com/huggingface/tokenizers/pull/379\n[#378]: https://github.com/huggingface/tokenizers/pull/378\n[#363]: https://github.com/huggingface/tokenizers/pull/363\n[#362]: https://github.com/huggingface/tokenizers/pull/362\n[#360]: https://github.com/huggingface/tokenizers/pull/360\n[#355]: https://github.com/huggingface/tokenizers/pull/355\n[#333]: https://github.com/huggingface/tokenizers/pull/333\n[#330]: https://github.com/huggingface/tokenizers/pull/330\n[#329]: https://github.com/huggingface/tokenizers/pull/329\n[#311]: https://github.com/huggingface/tokenizers/pull/311\n[#309]: https://github.com/huggingface/tokenizers/pull/309\n[#292]: https://github.com/huggingface/tokenizers/pull/292\n[#289]: https://github.com/huggingface/tokenizers/pull/289\n[#286]: https://github.com/huggingface/tokenizers/pull/286\n[#280]: https://github.com/huggingface/tokenizers/pull/280\n[#276]: https://github.com/huggingface/tokenizers/pull/276\n[#273]: https://github.com/huggingface/tokenizers/pull/273\n[#272]: https://github.com/huggingface/tokenizers/pull/272\n[#249]: https://github.com/huggingface/tokenizers/pull/249\n[#239]: https://github.com/huggingface/tokenizers/pull/239\n[#236]: https://github.com/huggingface/tokenizers/pull/236\n[#234]: https://github.com/huggingface/tokenizers/pull/234\n[#208]: https://github.com/huggingface/tokenizers/pull/208\n[#205]: https://github.com/huggingface/tokenizers/issues/205\n[#197]: https://github.com/huggingface/tokenizers/pull/197\n[#193]: https://github.com/huggingface/tokenizers/pull/193\n[#190]: https://github.com/huggingface/tokenizers/pull/190\n[#188]: https://github.com/huggingface/tokenizers/pull/188\n[#187]: https://github.com/huggingface/tokenizers/issues/187\n[#175]: https://github.com/huggingface/tokenizers/issues/175\n[#174]: https://github.com/huggingface/tokenizers/issues/174\n[#165]: https://github.com/huggingface/tokenizers/pull/165\n[#163]: https://github.com/huggingface/tokenizers/issues/163\n[#160]: https://github.com/huggingface/tokenizers/issues/160\n[#156]: https://github.com/huggingface/tokenizers/pull/156\n[#152]: https://github.com/huggingface/tokenizers/issues/152\n[#149]: https://github.com/huggingface/tokenizers/issues/149\n[#145]: https://github.com/huggingface/tokenizers/issues/145\n[#139]: https://github.com/huggingface/tokenizers/issues/139\n[#137]: https://github.com/huggingface/tokenizers/issues/137\n[#134]: https://github.com/huggingface/tokenizers/issues/134\n[#131]: https://github.com/huggingface/tokenizers/issues/131\n[#99]: https://github.com/huggingface/tokenizers/pull/99\n"
  },
  {
    "path": "bindings/python/Cargo.toml",
    "content": "[package]\nname = \"tokenizers-python\"\nversion = \"0.22.3-dev.0\"\nauthors = [\"Anthony MOI <m.anthony.moi@gmail.com>\"]\nedition = \"2021\"\n\n[lib]\nname = \"tokenizers\"\ncrate-type = [\"cdylib\"]\n\n[dependencies]\nrayon = \"1.10\"\nserde = { version = \"1.0\", features = [\"rc\", \"derive\"] }\nserde_json = \"1.0\"\nlibc = \"0.2\"\nenv_logger = \"0.11\"\npyo3 = { version = \"0.28.2\",default-features = false, features = [\"abi3\", \"abi3-py39\", \"py-clone\", \"experimental-inspect\"] }\npyo3-async-runtimes = { version = \"0.28.0\", features = [\"tokio-runtime\"] }\ntokio = { version = \"1.47.1\", features = [\"rt\", \"rt-multi-thread\", \"macros\", \"signal\"] }\nonce_cell = \"1.19.0\"\nnumpy = \"0.28\"\nndarray = \"0.16\"\nitertools = \"0.14\"\nahash = { version = \"0.8.11\", features = [\"serde\"] }\npyo3-ffi = \"0.28.2\"\n\n[dependencies.tokenizers]\npath = \"../../tokenizers\"\n\n[dev-dependencies]\ntempfile = \"3.10\"\npyo3 = { version = \"0.28.2\", features = [\"auto-initialize\"] }\n\n\n[features]\ndefault = [\"ext-module\"]\next-module = [\"pyo3/extension-module\"]\n"
  },
  {
    "path": "bindings/python/MANIFEST.in",
    "content": "include Cargo.toml\ninclude pyproject.toml\ninclude rust-toolchain\ninclude ../../LICENSE\nrecursive-include src *\nrecursive-include tokenizers-lib *\nrecursive-exclude tokenizers-lib/target *\n"
  },
  {
    "path": "bindings/python/Makefile",
    "content": ".PHONY: style check-style test\n\nDATA_DIR = data\n\ndir_guard=@mkdir -p $(@D)\ncheck_dirs := examples py_src/tokenizers tests\n\n# Format source code automatically\nstyle:\n\tcargo run --manifest-path tools/stub-gen/Cargo.toml\n\tpython stub.py\n\truff check  $(check_dirs) --fix \n\truff format $(check_dirs)\n\tty check py_src --exclude py_src/tokenizers/implementations \n\n# Check the source code is formatted correctly\ncheck-style:\n\tpython stub.py --check\n\truff check $(check_dirs)\n\truff format --check $(check_dirs)\n\tty check py_src --exclude py_src/tokenizers/implementations \n\nTESTS_RESOURCES = $(DATA_DIR)/small.txt $(DATA_DIR)/roberta.json\n\n# Launch the test suite\ntest: $(TESTS_RESOURCES)\n\tpip install pytest pytest-asyncio requests setuptools_rust numpy pyarrow datasets\n\tpython -m pytest -s -v tests\n\tcargo test --no-default-features\n\n$(DATA_DIR)/big.txt :\n\t$(dir_guard)\n\twget https://norvig.com/big.txt -O $@\n\n$(DATA_DIR)/small.txt : $(DATA_DIR)/big.txt\n\thead -100 $(DATA_DIR)/big.txt > $@\n\n$(DATA_DIR)/roberta.json :\n\t$(dir_guard)\n\twget https://huggingface.co/roberta-large/raw/main/tokenizer.json -O $@\n"
  },
  {
    "path": "bindings/python/README.md",
    "content": "<p align=\"center\">\n    <br>\n    <img src=\"https://huggingface.co/landing/assets/tokenizers/tokenizers-logo.png\" width=\"600\"/>\n    <br>\n<p>\n<p align=\"center\">\n    <a href=\"https://badge.fury.io/py/tokenizers\">\n         <img alt=\"Build\" src=\"https://badge.fury.io/py/tokenizers.svg\">\n    </a>\n    <a href=\"https://github.com/huggingface/tokenizers/blob/master/LICENSE\">\n        <img alt=\"GitHub\" src=\"https://img.shields.io/github/license/huggingface/tokenizers.svg?color=blue\">\n    </a>\n</p>\n<br>\n\n# Tokenizers\n\nProvides an implementation of today's most used tokenizers, with a focus on performance and\nversatility.\n\nBindings over the [Rust](https://github.com/huggingface/tokenizers/tree/master/tokenizers) implementation.\nIf you are interested in the High-level design, you can go check it there.\n\nOtherwise, let's dive in!\n\n## Main features:\n\n - Train new vocabularies and tokenize using 4 pre-made tokenizers (Bert WordPiece and the 3\n   most common BPE versions).\n - Extremely fast (both training and tokenization), thanks to the Rust implementation. Takes\n   less than 20 seconds to tokenize a GB of text on a server's CPU.\n - Easy to use, but also extremely versatile.\n - Designed for research and production.\n - Normalization comes with alignments tracking. It's always possible to get the part of the\n   original sentence that corresponds to a given token.\n - Does all the pre-processing: Truncate, Pad, add the special tokens your model needs.\n\n### Installation\n\n#### With pip:\n\n```bash\npip install tokenizers\n```\n\n#### From sources:\n\nTo use this method, you need to have the Rust installed:\n\n```bash\n# Install with:\ncurl https://sh.rustup.rs -sSf | sh -s -- -y\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\n```\n\nOnce Rust is installed, you can compile doing the following\n\n```bash\ngit clone https://github.com/huggingface/tokenizers\ncd tokenizers/bindings/python\n\n# Create a virtual env (you can use yours as well)\npython -m venv .env\nsource .env/bin/activate\n\n# Install `tokenizers` in the current virtual env\npip install -e .\n```\n\n### Load a pretrained tokenizer from the Hub\n\n```python\nfrom tokenizers import Tokenizer\n\ntokenizer = Tokenizer.from_pretrained(\"bert-base-cased\")\n```\n\n### Using the provided Tokenizers\n\nWe provide some pre-build tokenizers to cover the most common cases. You can easily load one of\nthese using some `vocab.json` and `merges.txt` files:\n\n```python\nfrom tokenizers import CharBPETokenizer\n\n# Initialize a tokenizer\nvocab = \"./path/to/vocab.json\"\nmerges = \"./path/to/merges.txt\"\ntokenizer = CharBPETokenizer(vocab, merges)\n\n# And then encode:\nencoded = tokenizer.encode(\"I can feel the magic, can you?\")\nprint(encoded.ids)\nprint(encoded.tokens)\n```\n\nAnd you can train them just as simply:\n\n```python\nfrom tokenizers import CharBPETokenizer\n\n# Initialize a tokenizer\ntokenizer = CharBPETokenizer()\n\n# Then train it!\ntokenizer.train([ \"./path/to/files/1.txt\", \"./path/to/files/2.txt\" ])\n\n# Now, let's use it:\nencoded = tokenizer.encode(\"I can feel the magic, can you?\")\n\n# And finally save it somewhere\ntokenizer.save(\"./path/to/directory/my-bpe.tokenizer.json\")\n```\n\n#### Provided Tokenizers\n\n - `CharBPETokenizer`: The original BPE\n - `ByteLevelBPETokenizer`: The byte level version of the BPE\n - `SentencePieceBPETokenizer`: A BPE implementation compatible with the one used by SentencePiece\n - `BertWordPieceTokenizer`: The famous Bert tokenizer, using WordPiece\n\nAll of these can be used and trained as explained above!\n\n### Build your own\n\nWhenever these provided tokenizers don't give you enough freedom, you can build your own tokenizer,\nby putting all the different parts you need together.\nYou can check how we implemented the [provided tokenizers](https://github.com/huggingface/tokenizers/tree/master/bindings/python/py_src/tokenizers/implementations) and adapt them easily to your own needs.\n\n#### Building a byte-level BPE\n\nHere is an example showing how to build your own byte-level BPE by putting all the different pieces\ntogether, and then saving it to a single file:\n\n```python\nfrom tokenizers import Tokenizer, models, pre_tokenizers, decoders, trainers, processors\n\n# Initialize a tokenizer\ntokenizer = Tokenizer(models.BPE())\n\n# Customize pre-tokenization and decoding\ntokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=True)\ntokenizer.decoder = decoders.ByteLevel()\ntokenizer.post_processor = processors.ByteLevel(trim_offsets=True)\n\n# And then train\ntrainer = trainers.BpeTrainer(\n    vocab_size=20000,\n    min_frequency=2,\n    initial_alphabet=pre_tokenizers.ByteLevel.alphabet()\n)\ntokenizer.train([\n    \"./path/to/dataset/1.txt\",\n    \"./path/to/dataset/2.txt\",\n    \"./path/to/dataset/3.txt\"\n], trainer=trainer)\n\n# And Save it\ntokenizer.save(\"byte-level-bpe.tokenizer.json\", pretty=True)\n```\n\nNow, when you want to use this tokenizer, this is as simple as:\n\n```python\nfrom tokenizers import Tokenizer\n\ntokenizer = Tokenizer.from_file(\"byte-level-bpe.tokenizer.json\")\n\nencoded = tokenizer.encode(\"I can feel the magic, can you?\")\n```\n\n### Typing support and stub generation\n\nThe compiled PyO3 extension does not expose type annotations, so editors and type checkers would otherwise see most objects as `Any`. To provide full typing support, we use a two-step stub generation process:\n\n1. **Rust introspection** (`tools/stub-gen/`): Uses `pyo3-introspection` to analyze the compiled extension and generate `.pyi` stub files\n2. **Python enrichment** (`stub.py`): Adds docstrings from the runtime module and generates forwarding `__init__.py` shims\n\n#### Running stub generation\n\nThe easiest way to regenerate stubs is via `make style`:\n\n```bash\ncd bindings/python\nmake style\n```\n\nThis will:\n1. Build the extension with `maturin develop --release`\n2. Run introspection to generate `.pyi` files\n3. Enrich stubs with docstrings via `stub.py`\n4. Format with `ruff`\n\n#### Running manually\n\nTo run the stub generator directly:\n\n```bash\ncd bindings/python\ncargo run --manifest-path tools/stub-gen/Cargo.toml\npython stub.py\n```\n\nThe stub generator automatically:\n- Builds the extension using maturin\n- Copies the built `.so` to the project root for introspection\n- Detects and sets `PYTHONHOME` for embedded Python (handles uv/venv environments)\n- Generates stubs to `py_src/tokenizers/`\n\n#### Troubleshooting\n\nIf you encounter Python initialization errors, you can manually set `PYTHONHOME`:\n\n```bash\nexport PYTHONHOME=$(python3 -c 'import sys; print(sys.base_prefix)')\ncargo run --manifest-path tools/stub-gen/Cargo.toml\n```\n"
  },
  {
    "path": "bindings/python/benches/test_tiktoken.py",
    "content": "import os\nimport time\nimport argparse\nfrom datasets import load_dataset\nfrom tiktoken.load import load_tiktoken_bpe  # type: ignore[import]\nimport tiktoken  # type: ignore[import]\nfrom tokenizers import Tokenizer\nfrom huggingface_hub import hf_hub_download\nfrom typing import Tuple, List\nfrom multiprocessing import Process\n\nMODEL_ID = \"meta-llama/Meta-Llama-3.1-8B\"\nDATASET = \"facebook/xnli\"\nDATASET_CONFIG = \"all_languages\"\nDEFAULT_THREADS = [2**i for i in range(8) if 2**i <= os.cpu_count()]\n\n\ndef format_byte_size(num_bytes: int) -> Tuple[str, str]:\n    \"\"\"Convert bytes to a human-readable format (KB, MB, GB).\"\"\"\n    num_bytes_f = float(num_bytes)\n    for unit in [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"]:\n        if num_bytes_f < 1024:\n            return f\"{num_bytes_f:.2f} {unit}\", unit\n        num_bytes_f /= 1024\n    return f\"{num_bytes_f:.2f} PB\", \"PB\"\n\n\ndef benchmark_batch(model: str, documents: list[str], num_threads: int, document_length: float) -> None:\n    os.environ[\"RAYON_NUM_THREADS\"] = str(num_threads)\n    num_bytes = sum(map(len, map(str.encode, documents)))\n    readable_size, unit = format_byte_size(num_bytes)\n    print(f\"==============\")\n    print(\n        f\"num_threads: {num_threads}, data size: {readable_size}, documents: {len(documents)} Avg Length: {document_length:.0f}\"\n    )\n    filename = hf_hub_download(MODEL_ID, \"original/tokenizer.model\")\n    mergeable_ranks = load_tiktoken_bpe(filename)\n    pat_str = r\"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}{1,3}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+\"\n    num_reserved_special_tokens = 256\n    special_tokens = [\n        \"<|begin_of_text|>\",\n        \"<|end_of_text|>\",\n        \"<|reserved_special_token_0|>\",\n        \"<|reserved_special_token_1|>\",\n        \"<|reserved_special_token_2|>\",\n        \"<|reserved_special_token_3|>\",\n        \"<|start_header_id|>\",\n        \"<|end_header_id|>\",\n        \"<|reserved_special_token_4|>\",\n        \"<|eot_id|>\",  # end of turn\n    ] + [f\"<|reserved_special_token_{i}|>\" for i in range(5, num_reserved_special_tokens - 5)]\n    num_base_tokens = len(mergeable_ranks)\n    special_tokens = {token: num_base_tokens + i for i, token in enumerate(special_tokens)}\n    enc = tiktoken.Encoding(\n        name=model,\n        pat_str=pat_str,\n        mergeable_ranks=mergeable_ranks,\n        special_tokens=special_tokens,\n    )\n    out = enc.encode(\"This is a test\")\n\n    hf_enc = Tokenizer.from_pretrained(model)\n    out2 = hf_enc.encode(\"This is a test\", add_special_tokens=False).ids\n\n    assert out == out2, \"sanity check\"\n\n    start = time.perf_counter_ns()\n    enc.encode_ordinary_batch(documents, num_threads=num_threads)\n    end = time.perf_counter_ns()\n\n    readable_size, unit = format_byte_size(num_bytes / (end - start) * 1e9)\n    print(f\"tiktoken \\t{readable_size}  / s\")\n\n    start = time.perf_counter_ns()\n    hf_enc.encode_batch_fast(documents)\n    end = time.perf_counter_ns()\n    readable_size, unit = format_byte_size(num_bytes / (end - start) * 1e9)\n    print(f\"huggingface \\t{readable_size} / s\")\n\n\ndef test(model: str, dataset: str, dataset_config: str, threads: List[int]):\n    dataset_xnli = load_dataset(dataset, dataset_config)\n\n    input_lengths = [(10, False, True), (10_000, False, True), (10_000, False, False)]\n\n    for num_threads in threads:\n        for length, fuse, long in input_lengths:\n            documents = []\n            for i, item in enumerate(dataset_xnli[\"train\"]):\n                if i >= length:\n                    break\n                if long:\n                    documents.append(\"\".join(item[\"premise\"].values()))\n                else:\n                    documents.append(item[\"premise\"][\"en\"])\n            if fuse:\n                documents = [\"\".join(documents)]\n\n            document_length = sum(len(d) for d in documents) / len(documents)\n\n            # Rayon thread pool is global to a process, we need to launch\n            # separate processes in order to accurately use the correct number of threads.\n            # Otherwise, we're simply running tokenizers in whatever tests comes first.\n            # tokenizers does NOT provide a method to change the number of threads during\n            # runtime.\n            p = Process(target=benchmark_batch, args=(model, documents, num_threads, document_length))\n            p.start()\n            p.join()\n\n            # benchmark_batch(model, documents, num_threads)\n\n\ndef main():\n    parser = argparse.ArgumentParser(\n        prog=\"bench_tokenizer\",\n        description=\"Getting a feel for speed when tokenizing\",\n    )\n    parser.add_argument(\"-m\", \"--model\", default=MODEL_ID, type=str)\n    parser.add_argument(\"-d\", \"--dataset\", default=DATASET, type=str)\n    parser.add_argument(\"-ds\", \"--dataset-config\", default=DATASET_CONFIG, type=str)\n    parser.add_argument(\"-t\", \"--threads\", nargs=\"+\", default=DEFAULT_THREADS, type=int)\n    args = parser.parse_args()\n    test(args.model, args.dataset, args.dataset_config, args.threads)\n\n\n# Call the function to run the benchmark\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "bindings/python/conftest.py",
    "content": "import pytest\n\n\ndef pytest_addoption(parser):\n    parser.addoption(\"--runslow\", action=\"store_true\", default=False, help=\"run slow tests\")\n\n\ndef pytest_configure(config):\n    config.addinivalue_line(\"markers\", \"slow: mark test as slow to run\")\n\n\ndef pytest_collection_modifyitems(config, items):\n    if config.getoption(\"--runslow\"):\n        # --runslow given in cli: do not skip slow tests\n        return\n    skip_slow = pytest.mark.skip(reason=\"need --runslow option to run\")\n    for item in items:\n        if \"slow\" in item.keywords:\n            item.add_marker(skip_slow)\n"
  },
  {
    "path": "bindings/python/docs/pyo3.md",
    "content": "# PyO3 Usage Notes\n\n## Why we take `self_: PyRef<'_, Self>`\n\nMost of the Python-facing structs are declared with `#[pyclass(extends = ...)]`. The actual data (for example the `processor` field in `PyPostProcessor`) lives in the base class, while the derived Rust structs are often just markers so that Python sees a proper subclass. When we implement a method on the subclass, we still need to reach into the base storage without downcasting a `PyAny` or re-wrapping objects.\n\nUsing `self_: PyRef<'_, Self>` gives us a borrowed reference to the Python-owned value that keeps the GIL lifetime, reference counts, and the inheritance chain intact. With it we can call `self_.as_ref()` to view the base `PyPostProcessor` directly and access shared helpers like the processor getters/setters. If we used a plain `&self` we would only see the zero-sized derived struct and would have to convert through a super type just to touch the processors, which adds boilerplate and loses the link to the Python inheritance model. This is the PyO3 equivalent of Python’s `super()`—it keeps the Rust type information while letting us operate on the underlying parent.\n"
  },
  {
    "path": "bindings/python/examples/custom_components.py",
    "content": "from typing import List\n\nimport jieba\nfrom tokenizers import NormalizedString, PreTokenizedString, Regex, Tokenizer\nfrom tokenizers.decoders import Decoder\nfrom tokenizers.models import BPE\nfrom tokenizers.normalizers import Normalizer\nfrom tokenizers.pre_tokenizers import PreTokenizer\n\n\nclass JiebaPreTokenizer:\n    def jieba_split(self, i: int, normalized_string: NormalizedString) -> List[NormalizedString]:\n        splits = []\n        # we need to call `str(normalized_string)` because jieba expects a str,\n        # not a NormalizedString\n        for token, start, stop in jieba.tokenize(str(normalized_string)):\n            splits.append(normalized_string[start:stop])\n\n        return splits\n        # We can also easily do it in one line:\n        # return [normalized_string[w[1] : w[2]] for w in jieba.tokenize(str(normalized_string))]\n\n    def odd_number_split(self, i: int, normalized_string: NormalizedString) -> List[NormalizedString]:\n        # Just an odd example...\n        splits = []\n        last = 0\n        for i, char in enumerate(str(normalized_string)):\n            if char.isnumeric() and int(char) % 2 == 1:\n                splits.append(normalized_string[last:i])\n                last = i\n        # Don't forget the last one\n        splits.append(normalized_string[last:])\n        return splits\n\n    def pre_tokenize(self, pretok: PreTokenizedString):\n        # Let's call split on the PreTokenizedString to split using `self.jieba_split`\n        pretok.split(self.jieba_split)\n        # Here we can call `pretok.split` multiple times if we want to apply\n        # different algorithm, but we generally just need to call it once.\n        pretok.split(self.odd_number_split)\n\n\nclass CustomDecoder:\n    def decode(self, tokens: List[str]) -> str:\n        return \"\".join(tokens)\n\n\nclass CustomNormalizer:\n    def normalize(self, normalized: NormalizedString):\n        # Most of these can be replaced by a `Sequence` combining some provided Normalizer,\n        # (ie Sequence([ NFKC(), Replace(Regex(\"\\s+\"), \" \"), Lowercase() ])\n        # and it should be the preferred way. That being said, here is an example of the kind\n        # of things that can be done here:\n        normalized.nfkc()\n        normalized.filter(lambda char: not char.isnumeric())\n        normalized.replace(Regex(\"\\s+\"), \" \")\n        normalized.lowercase()\n\n\n# This section shows how to attach these custom components to the Tokenizer\ntok = Tokenizer(BPE())\ntok.normalizer = Normalizer.custom(CustomNormalizer())\ntok.pre_tokenizer = PreTokenizer.custom(JiebaPreTokenizer())\ntok.decoder = Decoder.custom(CustomDecoder())\n\ninput = \"永和服装饰品有限公司\"\nprint(\"PreTokenize:\", input)\nprint(tok.pre_tokenizer.pre_tokenize_str(input))\n# [('永和', (0, 2)), ('服装', (2, 4)), ('饰品', (4, 6)), ('有限公司', (6, 10))]\n\ninput = \"112233\"\nprint(\"PreTokenize:\", input)\nprint(tok.pre_tokenizer.pre_tokenize_str(input))\n# [('1', (0, 1)), ('122', (1, 4)), ('3', (4, 5)), ('3', (5, 6))]\n\ninput = \"1234 ℌ𝔢𝔩𝔩𝔬    𝔱𝔥𝔢𝔯𝔢 𝓂𝓎 𝒹ℯ𝒶𝓇 𝕕𝕖𝕒𝕣    𝕗𝕣𝕚𝕖𝕟𝕕!\"\nprint(\"Normalize:\", input)\nprint(tok.normalizer.normalize_str(input))\n# \" hello there my dear dear friend!\"\n"
  },
  {
    "path": "bindings/python/examples/example.py",
    "content": "import argparse\nimport logging\nimport time\n\nfrom tqdm import tqdm\n\nfrom tokenizers import Tokenizer, decoders, pre_tokenizers\nfrom tokenizers.models import BPE, WordPiece\nfrom tokenizers.normalizers import BertNormalizer\nfrom tokenizers.processors import BertProcessing\nfrom transformers import BertTokenizer, GPT2Tokenizer  # type: ignore[import]\n\nlogging.getLogger(\"transformers\").disabled = True\nlogging.getLogger(\"transformers.tokenization_utils\").disabled = True\n\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"--type\", default=\"gpt2\", type=str, help=\"The type of tokenizer (bert|gpt2)\")\nparser.add_argument(\"--file\", default=None, type=str, help=\"The file to encode\")\nparser.add_argument(\"--vocab\", default=None, type=str, required=True, help=\"The vocab file\")\nparser.add_argument(\"--merges\", default=None, type=str, help=\"The merges.txt file\")\nparser.add_argument(\"--debug\", action=\"store_true\", help=\"Verbose output\")\nargs = parser.parse_args()\n\nif args.type == \"gpt2\" and args.merges is None:\n    raise Exception(\"Expected merges.txt file\")\n\nif args.file is not None:\n    with open(args.file, \"r\") as fp:\n        text = [line.strip() for line in fp]\nelse:\n    text = \"\"\"\nThe Zen of Python, by Tim Peters\nBeautiful is better than ugly.\nExplicit is better than implicit.\nSimple is better than complex.\nComplex is better than complicated.\nFlat is better than nested.\nSparse is better than dense.\nReadability counts.\nSpecial cases aren't special enough to break the rules.\nAlthough practicality beats purity.\nErrors should never pass silently.\nUnless explicitly silenced.\nIn the face of ambiguity, refuse the temptation to guess.\nThere should be one-- and preferably only one --obvious way to do it.\nAlthough that way may not be obvious at first unless you're Dutch.\nNow is better than never.\nAlthough never is often better than *right* now.\nIf the implementation is hard to explain, it's a bad idea.\nIf the implementation is easy to explain, it may be a good idea.\nNamespaces are one honking great idea -- let's do more of those!\n\"\"\".split(\"\\n\")\n\nif args.type == \"gpt2\":\n    print(\"Running GPT-2 tokenizer\")\n    tok_p = GPT2Tokenizer.from_pretrained(\"gpt2\")\n\n    # Create a Tokenizer using BPE\n    tok_r = Tokenizer(BPE(args.vocab, args.merges))\n    # Use ByteLevel PreTokenizer\n    tok_r.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False)\n    # Use ByteLevel Decoder\n    tok_r.decoder = decoders.ByteLevel()\nelif args.type == \"bert\":\n    print(\"Running Bert tokenizer\")\n    tok_p = BertTokenizer.from_pretrained(args.vocab)\n\n    tok_r = Tokenizer(WordPiece(args.vocab, unk_token=\"[UNK]\", max_input_chars_per_word=100))\n    tok_r.normalizer = BertNormalizer(\n        clean_text=True,\n        handle_chinese_chars=True,\n        strip_accents=True,\n        lowercase=True,\n    )\n    # tok_r.pre_tokenizer = pre_tokenizers.Whitespace()\n    tok_r.pre_tokenizer = pre_tokenizers.BertPreTokenizer()\n    tok_r.decoder = decoders.WordPiece()\n    tok_r.post_processor = BertProcessing(\n        (\"[SEP]\", tok_r.token_to_id(\"[SEP]\")),\n        (\"[CLS]\", tok_r.token_to_id(\"[CLS]\")),\n    )\nelse:\n    raise Exception(f\"Unknown type {args.type}\")\n\n\ndef tokenize_r():\n    return tok_r.encode_batch(text)\n\n\ndef tokenize_p():\n    return [tok_p.encode(sentence, add_special_tokens=True) for sentence in tqdm(text)]\n\n\nprint(f\"Tokenizing {len(text)} lines\")\n\n# Rust version\nstart = time.time()\nencoded_r = tokenize_r()\nend = time.time()\ntime_r = end - start\nprint(f\"Rust tokenizer took: {time_r} sec\")\n\n# Python version\nstart = time.time()\nencoded_p = tokenize_p()\nend = time.time()\ntime_p = end - start\nprint(f\"Transformer tokenizer took: {time_p} sec\")\n\nprint(f\"SpeedUp Ratio: {time_p / time_r}\")\n\nids_r = [sentence.ids for sentence in encoded_r]\ndiff_ids = 0\nfor i in range(0, len(encoded_r)):\n    if encoded_r[i].ids != encoded_p[i]:\n        diff_ids += 1\n        if args.debug:\n            print(encoded_r[i].ids)\n            print(encoded_p[i])\n            print(encoded_r[i].tokens)\n            print(tok_p.tokenize(text[i]))\n            print(text[i])\n            print(\"\")\nprint(f\"Ids differences: {diff_ids}\")\n\ndecoded_r = tok_r.decode_batch([sentence.ids for sentence in encoded_r], False)\ndecoded_p = [tok_p.decode(en) for en in encoded_p]\ndiff_decoded = 0\nfor i in range(0, len(text)):\n    if decoded_r[i] != decoded_p[i]:\n        diff_decoded += 1\n        if args.debug:\n            print(f\"Original:  {text[i]}\")\n            print(f\"Rust:      {decoded_r[i]}\")\n            print(f\"Python:    {decoded_p[i]}\")\n            print(\"\")\nprint(f\"Decoding differences: {diff_decoded}\")\n"
  },
  {
    "path": "bindings/python/examples/train_bert_wordpiece.py",
    "content": "import argparse\nimport glob\n\nfrom tokenizers import BertWordPieceTokenizer\n\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\n    \"--files\",\n    default=None,\n    metavar=\"path\",\n    type=str,\n    required=True,\n    help=\"The files to use as training; accept '**/*.txt' type of patterns \\\n                          if enclosed in quotes\",\n)\nparser.add_argument(\n    \"--out\",\n    default=\"./\",\n    type=str,\n    help=\"Path to the output directory, where the files will be saved\",\n)\nparser.add_argument(\"--name\", default=\"bert-wordpiece\", type=str, help=\"The name of the output vocab files\")\nargs = parser.parse_args()\n\nfiles = glob.glob(args.files)\nif not files:\n    print(f\"File does not exist: {args.files}\")\n    exit(1)\n\n\n# Initialize an empty tokenizer\ntokenizer = BertWordPieceTokenizer(\n    clean_text=True,\n    handle_chinese_chars=True,\n    strip_accents=True,\n    lowercase=True,\n)\n\n# And then train\ntokenizer.train(\n    files,\n    vocab_size=10000,\n    min_frequency=2,\n    show_progress=True,\n    special_tokens=[\"[PAD]\", \"[UNK]\", \"[CLS]\", \"[SEP]\", \"[MASK]\"],\n    limit_alphabet=1000,\n    wordpieces_prefix=\"##\",\n)\n\n# Save the files\ntokenizer.save_model(args.out, args.name)\n"
  },
  {
    "path": "bindings/python/examples/train_bytelevel_bpe.py",
    "content": "import argparse\nimport glob\nfrom os.path import join\n\nfrom tokenizers import ByteLevelBPETokenizer\n\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\n    \"--files\",\n    default=None,\n    metavar=\"path\",\n    type=str,\n    required=True,\n    help=\"The files to use as training; accept '**/*.txt' type of patterns \\\n                          if enclosed in quotes\",\n)\nparser.add_argument(\n    \"--out\",\n    default=\"./\",\n    type=str,\n    help=\"Path to the output directory, where the files will be saved\",\n)\nparser.add_argument(\"--name\", default=\"bpe-bytelevel\", type=str, help=\"The name of the output vocab files\")\nargs = parser.parse_args()\n\nfiles = glob.glob(args.files)\nif not files:\n    print(f\"File does not exist: {args.files}\")\n    exit(1)\n\n\n# Initialize an empty tokenizer\ntokenizer = ByteLevelBPETokenizer(add_prefix_space=True)\n\n# And then train\ntokenizer.train(\n    files,\n    vocab_size=10000,\n    min_frequency=2,\n    show_progress=True,\n    special_tokens=[\"<s>\", \"<pad>\", \"</s>\"],\n)\n\n# Save the files\ntokenizer.save_model(args.out, args.name)\n\n# Restoring model from learned vocab/merges\ntokenizer = ByteLevelBPETokenizer(\n    join(args.out, \"{}-vocab.json\".format(args.name)),\n    join(args.out, \"{}-merges.txt\".format(args.name)),\n    add_prefix_space=True,\n)\n\n# Test encoding\nprint(tokenizer.encode(\"Training ByteLevel BPE is very easy\").tokens)\n"
  },
  {
    "path": "bindings/python/examples/train_with_datasets.py",
    "content": "import datasets\n\nfrom tokenizers import Tokenizer, models, normalizers, pre_tokenizers\n\n\n# Build a tokenizer\nbpe_tokenizer = Tokenizer(models.BPE())\nbpe_tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()\nbpe_tokenizer.normalizer = normalizers.Lowercase()\n\n# Initialize a dataset\ndataset = datasets.load_dataset(\"wikitext\", \"wikitext-103-raw-v1\", split=\"train\")\n\n\n# Build an iterator over this dataset\ndef batch_iterator():\n    batch_size = 1000\n    for batch in dataset.iter(batch_size=batch_size):  # type: ignore[attr-defined]\n        yield batch[\"text\"]\n\n\n# And finally train\nbpe_tokenizer.train_from_iterator(batch_iterator(), length=len(dataset))  # type: ignore[arg-type]\n"
  },
  {
    "path": "bindings/python/examples/using_the_visualizer.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"--2020-12-04 09:25:00--  https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt\\n\",\n      \"Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'\\n\",\n      \"Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.104.253\\n\",\n      \"Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.104.253|:443... connected.\\n\",\n      \"HTTP request sent, awaiting response... 200 OK\\n\",\n      \"Length: 231508 (226K) [text/plain]\\n\",\n      \"Saving to: ‘/tmp/bert-base-uncased-vocab.txt’\\n\",\n      \"\\n\",\n      \"/tmp/bert-base-unca 100%[===================>] 226.08K  --.-KB/s    in 0.06s   \\n\",\n      \"\\n\",\n      \"2020-12-04 09:25:00 (3.87 MB/s) - ‘/tmp/bert-base-uncased-vocab.txt’ saved [231508/231508]\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!wget https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt -O /tmp/bert-base-uncased-vocab.txt\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from tokenizers import BertWordPieceTokenizer\\n\",\n    \"from tokenizers.tools import EncodingVisualizer\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"EncodingVisualizer.unk_token_regex.search(\\\"aaa[udsnk]aaa\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"\\\"\\\"Mathias Bynens 'Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞': Whenever you’re working on a piece of JavaScript code that deals with strings or regular expressions in some way, just add a unit test that contains a pile of poo (💩) in a string, 💩💩💩💩💩💩💩💩💩💩💩💩 and see if anything breaks. It’s a quick, fun, and easy way to see if your code supports astral symbols. Once you’ve found a Unicode-related bug in your code, all you need to do is apply the techniques discussed in this post to fix it.\\\"\\\"\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tokenizer = BertWordPieceTokenizer(\\\"/tmp/bert-base-uncased-vocab.txt\\\", lowercase=True)\\n\",\n    \"visualizer = EncodingVisualizer(tokenizer=tokenizer)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Visualizing Tokens With No Annotations\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"\\n\",\n       \"    <html>\\n\",\n       \"        <head>\\n\",\n       \"            <style>\\n\",\n       \"                .tokenized-text {\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:2rem;\\n\",\n       \"    max-height: 400px;\\n\",\n       \"    overflow-y: auto;\\n\",\n       \"    box-sizing:border-box;\\n\",\n       \"    line-height:4rem; /* Lots of space between lines */\\n\",\n       \"    font-family: \\\"Roboto Light\\\", \\\"Ubuntu Light\\\", \\\"Ubuntu\\\", monospace;\\n\",\n       \"    box-shadow: 2px 2px 2px rgba(0,0,0,0.2);\\n\",\n       \"    background-color: rgba(0,0,0,0.01);\\n\",\n       \"    letter-spacing:2px; /* Give some extra separation between chars */\\n\",\n       \"}\\n\",\n       \".non-token{\\n\",\n       \"    /* White space and other things the tokenizer ignores*/\\n\",\n       \"    white-space: pre;\\n\",\n       \"    letter-spacing:4px;\\n\",\n       \"    border-top:1px solid #A0A0A0; /* A gentle border on top and bottom makes tabs more ovious*/\\n\",\n       \"    border-bottom:1px solid #A0A0A0;\\n\",\n       \"    line-height: 1rem;\\n\",\n       \"    height: calc(100% - 2px);\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".token {\\n\",\n       \"    white-space: pre;\\n\",\n       \"    position:relative;\\n\",\n       \"    color:black;\\n\",\n       \"    letter-spacing:2px;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation{\\n\",\n       \"    white-space:nowrap; /* Important - ensures that annotations appears even if the annotated text wraps a line */\\n\",\n       \"    border-radius:4px;\\n\",\n       \"    position:relative;\\n\",\n       \"    width:fit-content;\\n\",\n       \"}\\n\",\n       \".annotation:before {\\n\",\n       \"    /*The before holds the text and the after holds the background*/\\n\",\n       \"    z-index:1000; /* Make sure this is above the background */\\n\",\n       \"    content:attr(data-label); /* The annotations label is on a data attribute */\\n\",\n       \"    color:white;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* These make it so an annotation doesn't stretch beyond the annotated text if the label is longer*/\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:after {\\n\",\n       \"    content:attr(data-label); /* The content defines the width of the annotation*/\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* Nast hack below:\\n\",\n       \"    We set the annotations color in code because we don't know the colors at css time.\\n\",\n       \"    But you can't pass a color as a data attribute to get it into the pseudo element (this thing)\\n\",\n       \"    So to get around that, annotations have the color set on them with a style attribute and then we\\n\",\n       \"    can get the color with currentColor.\\n\",\n       \"    Annotations wrap tokens and tokens set the color back to black\\n\",\n       \"     */\\n\",\n       \"    background-color: currentColor;\\n\",\n       \"}\\n\",\n       \".annotation:hover::after, .annotation:hover::before{\\n\",\n       \"    /* When the user hovers over an annotation expand the label to display in full\\n\",\n       \"     */\\n\",\n       \"    min-width: fit-content;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:hover{\\n\",\n       \"    /* Emphasize the annotation start end with a border on hover*/\\n\",\n       \"    border-color: currentColor;\\n\",\n       \"    border: 2px solid;\\n\",\n       \"}\\n\",\n       \".special-token:not(:empty){\\n\",\n       \"    /*\\n\",\n       \"    A none empty special token is like UNK (as opposed to CLS which has no representation in the text )\\n\",\n       \"     */\\n\",\n       \"    position:relative;\\n\",\n       \"}\\n\",\n       \".special-token:empty::before{\\n\",\n       \"    /* Special tokens that don't have text are displayed as pseudo elements so we dont select them with the mouse*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    background:#202020;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    color:white;\\n\",\n       \"    margin: 0 0.25rem;\\n\",\n       \"    padding: 0.25rem;\\n\",\n       \"    border-radius:4px\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".special-token:not(:empty):before {\\n\",\n       \"    /* Special tokens that have text (UNK) are displayed above the actual text*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    position:absolute;\\n\",\n       \"    bottom:1.75rem;\\n\",\n       \"    min-width:100%;\\n\",\n       \"    width:100%;\\n\",\n       \"    height:1rem;\\n\",\n       \"    line-height:1rem;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    color:white;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    background:#202020;\\n\",\n       \"    border-radius:10%;\\n\",\n       \"}\\n\",\n       \"/*\\n\",\n       \"We want to alternate the color of tokens, but we can't use nth child because tokens might be broken up by annotations\\n\",\n       \"instead we apply even and odd class at generation time and color them that way\\n\",\n       \" */\\n\",\n       \".even-token{\\n\",\n       \"    background:#DCDCDC\\t;\\n\",\n       \"    border: 1px solid #DCDCDC;\\n\",\n       \"}\\n\",\n       \".odd-token{\\n\",\n       \"    background:#A0A0A0;\\n\",\n       \"    border: 1px solid #A0A0A0;\\n\",\n       \"}\\n\",\n       \".even-token.multi-token,.odd-token.multi-token{\\n\",\n       \"    background:  repeating-linear-gradient(\\n\",\n       \"    45deg,\\n\",\n       \"    transparent,\\n\",\n       \"    transparent 1px,\\n\",\n       \"    #ccc 1px,\\n\",\n       \"    #ccc 1px\\n\",\n       \"    ),\\n\",\n       \"    /* on \\\"bottom\\\" */\\n\",\n       \"    linear-gradient(\\n\",\n       \"    to bottom,\\n\",\n       \"    #FFB6C1,\\n\",\n       \"    #999\\n\",\n       \"    );\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".multi-token:hover::after {\\n\",\n       \"    content:\\\"This char has more than 1 token\\\"; /* The content defines the width of the annotation*/\\n\",\n       \"    color:white;\\n\",\n       \"    background-color: black;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    left:0;\\n\",\n       \"    width:fit-content; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"            </style>\\n\",\n       \"        </head>\\n\",\n       \"        <body>\\n\",\n       \"            <div class=\\\"tokenized-text\\\" dir=auto>\\n\",\n       \"            <span class=\\\"token odd-token\\\"  >Mathias</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >By</span><span class=\\\"token odd-token\\\"  >nen</span><span class=\\\"token even-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >'</span><span class=\\\"token even-token\\\"  >Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A</span><span class=\\\"non-token\\\"  >̴̵̜̰͔ͫ͗͢</span><span class=\\\"token odd-token\\\"  >L</span><span class=\\\"non-token\\\"  >̠ͨͧͩ͘</span><span class=\\\"token even-token\\\"  >G̴̻͈͍͔̹̑͗̎̅͛́O</span><span class=\\\"non-token\\\"  >̵̨̹̻̝̳͂̌̌͘</span><span class=\\\"token odd-token\\\"  >!</span><span class=\\\"non-token\\\"  >͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞</span><span class=\\\"token even-token\\\"  >'</span><span class=\\\"token odd-token\\\"  >:</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Whenever</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >re</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >working</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >on</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >piece</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >of</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >Java</span><span class=\\\"token even-token\\\"  >Script</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >code</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >that</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >deals</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >with</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >strings</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >or</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >regular</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >expressions</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >some</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >way</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >just</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >add</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >unit</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >test</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >that</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >contains</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >pile</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >of</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >po</span><span class=\\\"token even-token\\\"  >o</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >(</span><span class=\\\"token even-token special-token\\\"  data-stok=\\\"[UNK]\\\" >💩</span><span class=\\\"token odd-token\\\"  >)</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >string</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token special-token\\\"  data-stok=\\\"[UNK]\\\" >💩💩💩💩💩💩💩💩💩💩💩💩</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >and</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >see</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >if</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >anything</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >breaks</span><span class=\\\"token even-token\\\"  >.</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >It</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >quick</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >fun</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >and</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >easy</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >way</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >see</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >if</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >your</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >code</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >supports</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >as</span><span class=\\\"token odd-token\\\"  >tral</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >symbols</span><span class=\\\"token odd-token\\\"  >.</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Once</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >ve</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >found</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Unicode</span><span class=\\\"token odd-token\\\"  >-</span><span class=\\\"token even-token\\\"  >related</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >bug</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >your</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >code</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >all</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >need</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >do</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >is</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >apply</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >the</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >techniques</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >discussed</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >this</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >post</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >fix</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >it</span><span class=\\\"token even-token\\\"  >.</span>\\n\",\n       \"            </div>\\n\",\n       \"        </body>\\n\",\n       \"    </html>\\n\",\n       \"    \"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"visualizer(text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Visualizing Tokens With Aligned Annotations\\n\",\n    \"First we make some annotations with the Annotation class\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from tokenizers.tools import Annotation\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"anno1 = Annotation(start=0, end=2, label=\\\"foo\\\")\\n\",\n    \"anno2 = Annotation(start=2, end=4, label=\\\"bar\\\")\\n\",\n    \"anno3 = Annotation(start=6, end=8, label=\\\"poo\\\")\\n\",\n    \"anno4 = Annotation(start=9, end=12, label=\\\"shoe\\\")\\n\",\n    \"annotations = [\\n\",\n    \"    anno1,\\n\",\n    \"    anno2,\\n\",\n    \"    anno3,\\n\",\n    \"    anno4,\\n\",\n    \"    Annotation(start=23, end=30, label=\\\"random tandem bandem sandem landem fandom\\\"),\\n\",\n    \"    Annotation(start=63, end=70, label=\\\"foo\\\"),\\n\",\n    \"    Annotation(start=80, end=95, label=\\\"bar\\\"),\\n\",\n    \"    Annotation(start=120, end=128, label=\\\"bar\\\"),\\n\",\n    \"    Annotation(start=152, end=155, label=\\\"poo\\\"),\\n\",\n    \"]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"\\n\",\n       \"    <html>\\n\",\n       \"        <head>\\n\",\n       \"            <style>\\n\",\n       \"                .tokenized-text {\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:2rem;\\n\",\n       \"    max-height: 400px;\\n\",\n       \"    overflow-y: auto;\\n\",\n       \"    box-sizing:border-box;\\n\",\n       \"    line-height:4rem; /* Lots of space between lines */\\n\",\n       \"    font-family: \\\"Roboto Light\\\", \\\"Ubuntu Light\\\", \\\"Ubuntu\\\", monospace;\\n\",\n       \"    box-shadow: 2px 2px 2px rgba(0,0,0,0.2);\\n\",\n       \"    background-color: rgba(0,0,0,0.01);\\n\",\n       \"    letter-spacing:2px; /* Give some extra separation between chars */\\n\",\n       \"}\\n\",\n       \".non-token{\\n\",\n       \"    /* White space and other things the tokenizer ignores*/\\n\",\n       \"    white-space: pre;\\n\",\n       \"    letter-spacing:4px;\\n\",\n       \"    border-top:1px solid #A0A0A0; /* A gentle border on top and bottom makes tabs more ovious*/\\n\",\n       \"    border-bottom:1px solid #A0A0A0;\\n\",\n       \"    line-height: 1rem;\\n\",\n       \"    height: calc(100% - 2px);\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".token {\\n\",\n       \"    white-space: pre;\\n\",\n       \"    position:relative;\\n\",\n       \"    color:black;\\n\",\n       \"    letter-spacing:2px;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation{\\n\",\n       \"    white-space:nowrap; /* Important - ensures that annotations appears even if the annotated text wraps a line */\\n\",\n       \"    border-radius:4px;\\n\",\n       \"    position:relative;\\n\",\n       \"    width:fit-content;\\n\",\n       \"}\\n\",\n       \".annotation:before {\\n\",\n       \"    /*The before holds the text and the after holds the background*/\\n\",\n       \"    z-index:1000; /* Make sure this is above the background */\\n\",\n       \"    content:attr(data-label); /* The annotations label is on a data attribute */\\n\",\n       \"    color:white;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* These make it so an annotation doesn't stretch beyond the annotated text if the label is longer*/\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:after {\\n\",\n       \"    content:attr(data-label); /* The content defines the width of the annotation*/\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* Nast hack below:\\n\",\n       \"    We set the annotations color in code because we don't know the colors at css time.\\n\",\n       \"    But you can't pass a color as a data attribute to get it into the pseudo element (this thing)\\n\",\n       \"    So to get around that, annotations have the color set on them with a style attribute and then we\\n\",\n       \"    can get the color with currentColor.\\n\",\n       \"    Annotations wrap tokens and tokens set the color back to black\\n\",\n       \"     */\\n\",\n       \"    background-color: currentColor;\\n\",\n       \"}\\n\",\n       \".annotation:hover::after, .annotation:hover::before{\\n\",\n       \"    /* When the user hovers over an annotation expand the label to display in full\\n\",\n       \"     */\\n\",\n       \"    min-width: fit-content;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:hover{\\n\",\n       \"    /* Emphasize the annotation start end with a border on hover*/\\n\",\n       \"    border-color: currentColor;\\n\",\n       \"    border: 2px solid;\\n\",\n       \"}\\n\",\n       \".special-token:not(:empty){\\n\",\n       \"    /*\\n\",\n       \"    A none empty special token is like UNK (as opposed to CLS which has no representation in the text )\\n\",\n       \"     */\\n\",\n       \"    position:relative;\\n\",\n       \"}\\n\",\n       \".special-token:empty::before{\\n\",\n       \"    /* Special tokens that don't have text are displayed as pseudo elements so we dont select them with the mouse*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    background:#202020;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    color:white;\\n\",\n       \"    margin: 0 0.25rem;\\n\",\n       \"    padding: 0.25rem;\\n\",\n       \"    border-radius:4px\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".special-token:not(:empty):before {\\n\",\n       \"    /* Special tokens that have text (UNK) are displayed above the actual text*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    position:absolute;\\n\",\n       \"    bottom:1.75rem;\\n\",\n       \"    min-width:100%;\\n\",\n       \"    width:100%;\\n\",\n       \"    height:1rem;\\n\",\n       \"    line-height:1rem;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    color:white;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    background:#202020;\\n\",\n       \"    border-radius:10%;\\n\",\n       \"}\\n\",\n       \"/*\\n\",\n       \"We want to alternate the color of tokens, but we can't use nth child because tokens might be broken up by annotations\\n\",\n       \"instead we apply even and odd class at generation time and color them that way\\n\",\n       \" */\\n\",\n       \".even-token{\\n\",\n       \"    background:#DCDCDC\\t;\\n\",\n       \"    border: 1px solid #DCDCDC;\\n\",\n       \"}\\n\",\n       \".odd-token{\\n\",\n       \"    background:#A0A0A0;\\n\",\n       \"    border: 1px solid #A0A0A0;\\n\",\n       \"}\\n\",\n       \".even-token.multi-token,.odd-token.multi-token{\\n\",\n       \"    background:  repeating-linear-gradient(\\n\",\n       \"    45deg,\\n\",\n       \"    transparent,\\n\",\n       \"    transparent 1px,\\n\",\n       \"    #ccc 1px,\\n\",\n       \"    #ccc 1px\\n\",\n       \"    ),\\n\",\n       \"    /* on \\\"bottom\\\" */\\n\",\n       \"    linear-gradient(\\n\",\n       \"    to bottom,\\n\",\n       \"    #FFB6C1,\\n\",\n       \"    #999\\n\",\n       \"    );\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".multi-token:hover::after {\\n\",\n       \"    content:\\\"This char has more than 1 token\\\"; /* The content defines the width of the annotation*/\\n\",\n       \"    color:white;\\n\",\n       \"    background-color: black;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    left:0;\\n\",\n       \"    width:fit-content; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"            </style>\\n\",\n       \"        </head>\\n\",\n       \"        <body>\\n\",\n       \"            <div class=\\\"tokenized-text\\\" dir=auto>\\n\",\n       \"            <span class=\\\"annotation\\\" style=\\\"color:hsl(61,32%,64%\\\" data-label=\\\"foo\\\"><span class=\\\"token odd-token\\\"  >Ma</span></span><span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"bar\\\"><span class=\\\"token odd-token\\\"  >th</span></span><span class=\\\"token odd-token\\\"  >ia</span><span class=\\\"annotation\\\" style=\\\"color:hsl(112,32%,64%\\\" data-label=\\\"poo\\\"><span class=\\\"token odd-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span></span><span class=\\\"token even-token\\\"  >B</span><span class=\\\"annotation\\\" style=\\\"color:hsl(214,32%,64%\\\" data-label=\\\"shoe\\\"><span class=\\\"token even-token\\\"  >y</span><span class=\\\"token odd-token\\\"  >ne</span></span><span class=\\\"token odd-token\\\"  >n</span><span class=\\\"token even-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >'</span><span class=\\\"token even-token\\\"  >Z͑ͫ̓ͪ̂ͫ</span><span class=\\\"annotation\\\" style=\\\"color:hsl(163,32%,64%\\\" data-label=\\\"random tandem bandem sandem landem fandom\\\"><span class=\\\"token even-token\\\"  >̽͏̴̙̤̞͉</span></span><span class=\\\"token even-token\\\"  >͚̯̞̠͍A</span><span class=\\\"non-token\\\"  >̴̵̜̰͔ͫ͗͢</span><span class=\\\"token odd-token\\\"  >L</span><span class=\\\"non-token\\\"  >̠ͨͧͩ͘</span><span class=\\\"token even-token\\\"  >G̴̻͈͍͔̹̑͗̎̅͛́</span><span class=\\\"annotation\\\" style=\\\"color:hsl(61,32%,64%\\\" data-label=\\\"foo\\\"><span class=\\\"token even-token\\\"  >O</span><span class=\\\"non-token\\\"  >̵̨͂̌̌͘</span></span><span class=\\\"non-token\\\"  >̹̻̝̳</span><span class=\\\"token odd-token\\\"  >!</span><span class=\\\"non-token\\\"  >̿̋ͥͥ̂</span><span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"bar\\\"><span class=\\\"non-token\\\"  >͖̬̰̙̗ͣ̐́́͜͞</span><span class=\\\"token even-token\\\"  >'</span><span class=\\\"token odd-token\\\"  >:</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >W</span></span><span class=\\\"token even-token\\\"  >henever</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >re</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >working</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >on</span><span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"bar\\\"><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >piece</span></span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >of</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >Java</span><span class=\\\"token even-token\\\"  >Script</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >code</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >that</span><span class=\\\"annotation\\\" style=\\\"color:hsl(112,32%,64%\\\" data-label=\\\"poo\\\"><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >de</span></span><span class=\\\"token odd-token\\\"  >als</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >with</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >strings</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >or</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >regular</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >expressions</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >some</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >way</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >just</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >add</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >unit</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >test</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >that</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >contains</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >pile</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >of</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >po</span><span class=\\\"token even-token\\\"  >o</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >(</span><span class=\\\"token even-token special-token\\\"  data-stok=\\\"[UNK]\\\" >💩</span><span class=\\\"token odd-token\\\"  >)</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >string</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token special-token\\\"  data-stok=\\\"[UNK]\\\" >💩💩💩💩💩💩💩💩💩💩💩💩</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >and</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >see</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >if</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >anything</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >breaks</span><span class=\\\"token even-token\\\"  >.</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >It</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >quick</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >fun</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >and</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >easy</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >way</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >see</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >if</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >your</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >code</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >supports</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >as</span><span class=\\\"token odd-token\\\"  >tral</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >symbols</span><span class=\\\"token odd-token\\\"  >.</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Once</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >ve</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >found</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Unicode</span><span class=\\\"token odd-token\\\"  >-</span><span class=\\\"token even-token\\\"  >related</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >bug</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >your</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >code</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >all</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >need</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >do</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >is</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >apply</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >the</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >techniques</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >discussed</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >this</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >post</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >fix</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >it</span><span class=\\\"token even-token\\\"  >.</span>\\n\",\n       \"            </div>\\n\",\n       \"        </body>\\n\",\n       \"    </html>\\n\",\n       \"    \"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"visualizer(text, annotations=annotations)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using A Custom Annotation Format\\n\",\n    \"Every system has its own representation of annotations. That's why we can instantiate the EncodingVisualizer with a convertion function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[{'startPlace': 0, 'endPlace': 3, 'theTag': '0'},\\n\",\n       \" {'startPlace': 4, 'endPlace': 7, 'theTag': '4'},\\n\",\n       \" {'startPlace': 8, 'endPlace': 11, 'theTag': '8'},\\n\",\n       \" {'startPlace': 12, 'endPlace': 15, 'theTag': '12'},\\n\",\n       \" {'startPlace': 16, 'endPlace': 19, 'theTag': '16'}]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"funnyAnnotations = [dict(startPlace=i, endPlace=i + 3, theTag=str(i)) for i in range(0, 20, 4)]\\n\",\n    \"funnyAnnotations\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def converter(funny):\\n\",\n    \"    return Annotation(start=funny[\\\"startPlace\\\"], end=funny[\\\"endPlace\\\"], label=funny[\\\"theTag\\\"])\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"visualizer = EncodingVisualizer(tokenizer=tokenizer, default_to_notebook=True, annotation_converter=converter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"\\n\",\n       \"    <html>\\n\",\n       \"        <head>\\n\",\n       \"            <style>\\n\",\n       \"                .tokenized-text {\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:2rem;\\n\",\n       \"    max-height: 400px;\\n\",\n       \"    overflow-y: auto;\\n\",\n       \"    box-sizing:border-box;\\n\",\n       \"    line-height:4rem; /* Lots of space between lines */\\n\",\n       \"    font-family: \\\"Roboto Light\\\", \\\"Ubuntu Light\\\", \\\"Ubuntu\\\", monospace;\\n\",\n       \"    box-shadow: 2px 2px 2px rgba(0,0,0,0.2);\\n\",\n       \"    background-color: rgba(0,0,0,0.01);\\n\",\n       \"    letter-spacing:2px; /* Give some extra separation between chars */\\n\",\n       \"}\\n\",\n       \".non-token{\\n\",\n       \"    /* White space and other things the tokenizer ignores*/\\n\",\n       \"    white-space: pre;\\n\",\n       \"    letter-spacing:4px;\\n\",\n       \"    border-top:1px solid #A0A0A0; /* A gentle border on top and bottom makes tabs more ovious*/\\n\",\n       \"    border-bottom:1px solid #A0A0A0;\\n\",\n       \"    line-height: 1rem;\\n\",\n       \"    height: calc(100% - 2px);\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".token {\\n\",\n       \"    white-space: pre;\\n\",\n       \"    position:relative;\\n\",\n       \"    color:black;\\n\",\n       \"    letter-spacing:2px;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation{\\n\",\n       \"    white-space:nowrap; /* Important - ensures that annotations appears even if the annotated text wraps a line */\\n\",\n       \"    border-radius:4px;\\n\",\n       \"    position:relative;\\n\",\n       \"    width:fit-content;\\n\",\n       \"}\\n\",\n       \".annotation:before {\\n\",\n       \"    /*The before holds the text and the after holds the background*/\\n\",\n       \"    z-index:1000; /* Make sure this is above the background */\\n\",\n       \"    content:attr(data-label); /* The annotations label is on a data attribute */\\n\",\n       \"    color:white;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* These make it so an annotation doesn't stretch beyond the annotated text if the label is longer*/\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:after {\\n\",\n       \"    content:attr(data-label); /* The content defines the width of the annotation*/\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* Nast hack below:\\n\",\n       \"    We set the annotations color in code because we don't know the colors at css time.\\n\",\n       \"    But you can't pass a color as a data attribute to get it into the pseudo element (this thing)\\n\",\n       \"    So to get around that, annotations have the color set on them with a style attribute and then we\\n\",\n       \"    can get the color with currentColor.\\n\",\n       \"    Annotations wrap tokens and tokens set the color back to black\\n\",\n       \"     */\\n\",\n       \"    background-color: currentColor;\\n\",\n       \"}\\n\",\n       \".annotation:hover::after, .annotation:hover::before{\\n\",\n       \"    /* When the user hovers over an annotation expand the label to display in full\\n\",\n       \"     */\\n\",\n       \"    min-width: fit-content;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:hover{\\n\",\n       \"    /* Emphasize the annotation start end with a border on hover*/\\n\",\n       \"    border-color: currentColor;\\n\",\n       \"    border: 2px solid;\\n\",\n       \"}\\n\",\n       \".special-token:not(:empty){\\n\",\n       \"    /*\\n\",\n       \"    A none empty special token is like UNK (as opposed to CLS which has no representation in the text )\\n\",\n       \"     */\\n\",\n       \"    position:relative;\\n\",\n       \"}\\n\",\n       \".special-token:empty::before{\\n\",\n       \"    /* Special tokens that don't have text are displayed as pseudo elements so we dont select them with the mouse*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    background:#202020;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    color:white;\\n\",\n       \"    margin: 0 0.25rem;\\n\",\n       \"    padding: 0.25rem;\\n\",\n       \"    border-radius:4px\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".special-token:not(:empty):before {\\n\",\n       \"    /* Special tokens that have text (UNK) are displayed above the actual text*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    position:absolute;\\n\",\n       \"    bottom:1.75rem;\\n\",\n       \"    min-width:100%;\\n\",\n       \"    width:100%;\\n\",\n       \"    height:1rem;\\n\",\n       \"    line-height:1rem;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    color:white;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    background:#202020;\\n\",\n       \"    border-radius:10%;\\n\",\n       \"}\\n\",\n       \"/*\\n\",\n       \"We want to alternate the color of tokens, but we can't use nth child because tokens might be broken up by annotations\\n\",\n       \"instead we apply even and odd class at generation time and color them that way\\n\",\n       \" */\\n\",\n       \".even-token{\\n\",\n       \"    background:#DCDCDC\\t;\\n\",\n       \"    border: 1px solid #DCDCDC;\\n\",\n       \"}\\n\",\n       \".odd-token{\\n\",\n       \"    background:#A0A0A0;\\n\",\n       \"    border: 1px solid #A0A0A0;\\n\",\n       \"}\\n\",\n       \".even-token.multi-token,.odd-token.multi-token{\\n\",\n       \"    background:  repeating-linear-gradient(\\n\",\n       \"    45deg,\\n\",\n       \"    transparent,\\n\",\n       \"    transparent 1px,\\n\",\n       \"    #ccc 1px,\\n\",\n       \"    #ccc 1px\\n\",\n       \"    ),\\n\",\n       \"    /* on \\\"bottom\\\" */\\n\",\n       \"    linear-gradient(\\n\",\n       \"    to bottom,\\n\",\n       \"    #FFB6C1,\\n\",\n       \"    #999\\n\",\n       \"    );\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".multi-token:hover::after {\\n\",\n       \"    content:\\\"This char has more than 1 token\\\"; /* The content defines the width of the annotation*/\\n\",\n       \"    color:white;\\n\",\n       \"    background-color: black;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    left:0;\\n\",\n       \"    width:fit-content; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"            </style>\\n\",\n       \"        </head>\\n\",\n       \"        <body>\\n\",\n       \"            <div class=\\\"tokenized-text\\\" dir=auto>\\n\",\n       \"            <span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"0\\\"><span class=\\\"token odd-token\\\"  >Mat</span></span><span class=\\\"token odd-token\\\"  >h</span><span class=\\\"annotation\\\" style=\\\"color:hsl(163,32%,64%\\\" data-label=\\\"4\\\"><span class=\\\"token odd-token\\\"  >ias</span></span><span class=\\\"non-token\\\"  > </span><span class=\\\"annotation\\\" style=\\\"color:hsl(214,32%,64%\\\" data-label=\\\"8\\\"><span class=\\\"token even-token\\\"  >By</span><span class=\\\"token odd-token\\\"  >n</span></span><span class=\\\"token odd-token\\\"  >e</span><span class=\\\"annotation\\\" style=\\\"color:hsl(61,32%,64%\\\" data-label=\\\"12\\\"><span class=\\\"token odd-token\\\"  >n</span><span class=\\\"token even-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span></span><span class=\\\"token odd-token\\\"  >'</span><span class=\\\"annotation\\\" style=\\\"color:hsl(112,32%,64%\\\" data-label=\\\"16\\\"><span class=\\\"token even-token\\\"  >Z͑ͫ</span></span><span class=\\\"token even-token\\\"  >̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A</span><span class=\\\"non-token\\\"  >̴̵̜̰͔ͫ͗͢</span><span class=\\\"token odd-token\\\"  >L</span><span class=\\\"non-token\\\"  >̠ͨͧͩ͘</span><span class=\\\"token even-token\\\"  >G̴̻͈͍͔̹̑͗̎̅͛́O</span><span class=\\\"non-token\\\"  >̵̨̹̻̝̳͂̌̌͘</span><span class=\\\"token odd-token\\\"  >!</span><span class=\\\"non-token\\\"  >͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞</span><span class=\\\"token even-token\\\"  >'</span><span class=\\\"token odd-token\\\"  >:</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Whenever</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >re</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >working</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >on</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >piece</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >of</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >Java</span><span class=\\\"token even-token\\\"  >Script</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >code</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >that</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >deals</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >with</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >strings</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >or</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >regular</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >expressions</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >some</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >way</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >just</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >add</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >unit</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >test</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >that</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >contains</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >pile</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >of</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >po</span><span class=\\\"token even-token\\\"  >o</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >(</span><span class=\\\"token even-token special-token\\\"  data-stok=\\\"[UNK]\\\" >💩</span><span class=\\\"token odd-token\\\"  >)</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >string</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token special-token\\\"  data-stok=\\\"[UNK]\\\" >💩💩💩💩💩💩💩💩💩💩💩💩</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >and</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >see</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >if</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >anything</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >breaks</span><span class=\\\"token even-token\\\"  >.</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >It</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >s</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >quick</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >fun</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >and</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >easy</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >way</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >see</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >if</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >your</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >code</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >supports</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >as</span><span class=\\\"token odd-token\\\"  >tral</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >symbols</span><span class=\\\"token odd-token\\\"  >.</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Once</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"token even-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >ve</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >found</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >a</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >Unicode</span><span class=\\\"token odd-token\\\"  >-</span><span class=\\\"token even-token\\\"  >related</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >bug</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >your</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >code</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >all</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >you</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >need</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >do</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >is</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >apply</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >the</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >techniques</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >discussed</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >in</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >this</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >post</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >to</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token even-token\\\"  >fix</span><span class=\\\"non-token\\\"  > </span><span class=\\\"token odd-token\\\"  >it</span><span class=\\\"token even-token\\\"  >.</span>\\n\",\n       \"            </div>\\n\",\n       \"        </body>\\n\",\n       \"    </html>\\n\",\n       \"    \"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"visualizer(text, annotations=funnyAnnotations)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Trying with Roberta\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"--2020-12-04 09:25:00--  https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-vocab.json\\n\",\n      \"Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'\\n\",\n      \"Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.226.19\\n\",\n      \"Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.226.19|:443... connected.\\n\",\n      \"HTTP request sent, awaiting response... 200 OK\\n\",\n      \"Length: 898823 (878K) [application/json]\\n\",\n      \"Saving to: ‘/tmp/roberta-base-vocab.json’\\n\",\n      \"\\n\",\n      \"/tmp/roberta-base-v 100%[===================>] 877.76K  4.35MB/s    in 0.2s    \\n\",\n      \"\\n\",\n      \"2020-12-04 09:25:00 (4.35 MB/s) - ‘/tmp/roberta-base-vocab.json’ saved [898823/898823]\\n\",\n      \"\\n\",\n      \"--2020-12-04 09:25:00--  https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-merges.txt\\n\",\n      \"Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'\\n\",\n      \"Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.104.253\\n\",\n      \"Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.104.253|:443... connected.\\n\",\n      \"HTTP request sent, awaiting response... 200 OK\\n\",\n      \"Length: 456318 (446K) [text/plain]\\n\",\n      \"Saving to: ‘/tmp/roberta-base-merges.txt’\\n\",\n      \"\\n\",\n      \"/tmp/roberta-base-m 100%[===================>] 445.62K  --.-KB/s    in 0.1s    \\n\",\n      \"\\n\",\n      \"2020-12-04 09:25:01 (4.04 MB/s) - ‘/tmp/roberta-base-merges.txt’ saved [456318/456318]\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!wget \\\"https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-vocab.json\\\" -O /tmp/roberta-base-vocab.json\\n\",\n    \"!wget \\\"https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-merges.txt\\\" -O /tmp/roberta-base-merges.txt\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"\\n\",\n       \"    <html>\\n\",\n       \"        <head>\\n\",\n       \"            <style>\\n\",\n       \"                .tokenized-text {\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:2rem;\\n\",\n       \"    max-height: 400px;\\n\",\n       \"    overflow-y: auto;\\n\",\n       \"    box-sizing:border-box;\\n\",\n       \"    line-height:4rem; /* Lots of space between lines */\\n\",\n       \"    font-family: \\\"Roboto Light\\\", \\\"Ubuntu Light\\\", \\\"Ubuntu\\\", monospace;\\n\",\n       \"    box-shadow: 2px 2px 2px rgba(0,0,0,0.2);\\n\",\n       \"    background-color: rgba(0,0,0,0.01);\\n\",\n       \"    letter-spacing:2px; /* Give some extra separation between chars */\\n\",\n       \"}\\n\",\n       \".non-token{\\n\",\n       \"    /* White space and other things the tokenizer ignores*/\\n\",\n       \"    white-space: pre;\\n\",\n       \"    letter-spacing:4px;\\n\",\n       \"    border-top:1px solid #A0A0A0; /* A gentle border on top and bottom makes tabs more ovious*/\\n\",\n       \"    border-bottom:1px solid #A0A0A0;\\n\",\n       \"    line-height: 1rem;\\n\",\n       \"    height: calc(100% - 2px);\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".token {\\n\",\n       \"    white-space: pre;\\n\",\n       \"    position:relative;\\n\",\n       \"    color:black;\\n\",\n       \"    letter-spacing:2px;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation{\\n\",\n       \"    white-space:nowrap; /* Important - ensures that annotations appears even if the annotated text wraps a line */\\n\",\n       \"    border-radius:4px;\\n\",\n       \"    position:relative;\\n\",\n       \"    width:fit-content;\\n\",\n       \"}\\n\",\n       \".annotation:before {\\n\",\n       \"    /*The before holds the text and the after holds the background*/\\n\",\n       \"    z-index:1000; /* Make sure this is above the background */\\n\",\n       \"    content:attr(data-label); /* The annotations label is on a data attribute */\\n\",\n       \"    color:white;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%;\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* These make it so an annotation doesn't stretch beyond the annotated text if the label is longer*/\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:after {\\n\",\n       \"    content:attr(data-label); /* The content defines the width of the annotation*/\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"\\n\",\n       \"    left:0;\\n\",\n       \"    width:100%; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"    /* Nast hack below:\\n\",\n       \"    We set the annotations color in code because we don't know the colors at css time.\\n\",\n       \"    But you can't pass a color as a data attribute to get it into the pseudo element (this thing)\\n\",\n       \"    So to get around that, annotations have the color set on them with a style attribute and then we\\n\",\n       \"    can get the color with currentColor.\\n\",\n       \"    Annotations wrap tokens and tokens set the color back to black\\n\",\n       \"     */\\n\",\n       \"    background-color: currentColor;\\n\",\n       \"}\\n\",\n       \".annotation:hover::after, .annotation:hover::before{\\n\",\n       \"    /* When the user hovers over an annotation expand the label to display in full\\n\",\n       \"     */\\n\",\n       \"    min-width: fit-content;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".annotation:hover{\\n\",\n       \"    /* Emphasize the annotation start end with a border on hover*/\\n\",\n       \"    border-color: currentColor;\\n\",\n       \"    border: 2px solid;\\n\",\n       \"}\\n\",\n       \".special-token:not(:empty){\\n\",\n       \"    /*\\n\",\n       \"    A none empty special token is like UNK (as opposed to CLS which has no representation in the text )\\n\",\n       \"     */\\n\",\n       \"    position:relative;\\n\",\n       \"}\\n\",\n       \".special-token:empty::before{\\n\",\n       \"    /* Special tokens that don't have text are displayed as pseudo elements so we dont select them with the mouse*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    background:#202020;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    color:white;\\n\",\n       \"    margin: 0 0.25rem;\\n\",\n       \"    padding: 0.25rem;\\n\",\n       \"    border-radius:4px\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".special-token:not(:empty):before {\\n\",\n       \"    /* Special tokens that have text (UNK) are displayed above the actual text*/\\n\",\n       \"    content:attr(data-stok);\\n\",\n       \"    position:absolute;\\n\",\n       \"    bottom:1.75rem;\\n\",\n       \"    min-width:100%;\\n\",\n       \"    width:100%;\\n\",\n       \"    height:1rem;\\n\",\n       \"    line-height:1rem;\\n\",\n       \"    font-size:1rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    color:white;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    background:#202020;\\n\",\n       \"    border-radius:10%;\\n\",\n       \"}\\n\",\n       \"/*\\n\",\n       \"We want to alternate the color of tokens, but we can't use nth child because tokens might be broken up by annotations\\n\",\n       \"instead we apply even and odd class at generation time and color them that way\\n\",\n       \" */\\n\",\n       \".even-token{\\n\",\n       \"    background:#DCDCDC\\t;\\n\",\n       \"    border: 1px solid #DCDCDC;\\n\",\n       \"}\\n\",\n       \".odd-token{\\n\",\n       \"    background:#A0A0A0;\\n\",\n       \"    border: 1px solid #A0A0A0;\\n\",\n       \"}\\n\",\n       \".even-token.multi-token,.odd-token.multi-token{\\n\",\n       \"    background:  repeating-linear-gradient(\\n\",\n       \"    45deg,\\n\",\n       \"    transparent,\\n\",\n       \"    transparent 1px,\\n\",\n       \"    #ccc 1px,\\n\",\n       \"    #ccc 1px\\n\",\n       \"    ),\\n\",\n       \"    /* on \\\"bottom\\\" */\\n\",\n       \"    linear-gradient(\\n\",\n       \"    to bottom,\\n\",\n       \"    #FFB6C1,\\n\",\n       \"    #999\\n\",\n       \"    );\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \".multi-token:hover::after {\\n\",\n       \"    content:\\\"This char has more than 1 token\\\"; /* The content defines the width of the annotation*/\\n\",\n       \"    color:white;\\n\",\n       \"    background-color: black;\\n\",\n       \"    position:absolute;\\n\",\n       \"    font-size:0.75rem;\\n\",\n       \"    text-align:center;\\n\",\n       \"    font-weight:bold;\\n\",\n       \"    text-overflow:ellipsis;\\n\",\n       \"    top:1.75rem;\\n\",\n       \"    line-height:0;\\n\",\n       \"    overflow: hidden;\\n\",\n       \"    white-space: nowrap;\\n\",\n       \"    left:0;\\n\",\n       \"    width:fit-content; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\\n\",\n       \"    padding:0.5rem 0;\\n\",\n       \"}\\n\",\n       \"\\n\",\n       \"            </style>\\n\",\n       \"        </head>\\n\",\n       \"        <body>\\n\",\n       \"            <div class=\\\"tokenized-text\\\" dir=auto>\\n\",\n       \"            <span class=\\\"annotation\\\" style=\\\"color:hsl(61,32%,64%\\\" data-label=\\\"foo\\\"><span class=\\\"token even-token\\\"  >Ma</span></span><span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"bar\\\"><span class=\\\"token even-token\\\"  >th</span></span><span class=\\\"token odd-token\\\"  >ia</span><span class=\\\"annotation\\\" style=\\\"color:hsl(112,32%,64%\\\" data-label=\\\"poo\\\"><span class=\\\"token odd-token\\\"  >s</span><span class=\\\"token even-token\\\"  > </span></span><span class=\\\"token even-token\\\"  >B</span><span class=\\\"annotation\\\" style=\\\"color:hsl(214,32%,64%\\\" data-label=\\\"shoe\\\"><span class=\\\"token odd-token\\\"  >yn</span><span class=\\\"token even-token\\\"  >e</span></span><span class=\\\"token even-token\\\"  >ns</span><span class=\\\"token odd-token\\\"  > '</span><span class=\\\"token even-token\\\"  >Z</span><span class=\\\"token multi-token odd-token\\\"  >͑</span><span class=\\\"token multi-token odd-token\\\"  >ͫ</span><span class=\\\"token multi-token odd-token\\\"  >̓</span><span class=\\\"token multi-token odd-token\\\"  >ͪ</span><span class=\\\"token multi-token odd-token\\\"  >̂</span><span class=\\\"token multi-token odd-token\\\"  >ͫ</span><span class=\\\"annotation\\\" style=\\\"color:hsl(163,32%,64%\\\" data-label=\\\"random tandem bandem sandem landem fandom\\\"><span class=\\\"token multi-token odd-token\\\"  >̽</span><span class=\\\"token multi-token odd-token\\\"  >͏</span><span class=\\\"token multi-token odd-token\\\"  >̴</span><span class=\\\"token multi-token odd-token\\\"  >̙</span><span class=\\\"token multi-token odd-token\\\"  >̤</span><span class=\\\"token multi-token odd-token\\\"  >̞</span><span class=\\\"token multi-token odd-token\\\"  >͉</span></span><span class=\\\"token multi-token odd-token\\\"  >͚</span><span class=\\\"token multi-token odd-token\\\"  >̯</span><span class=\\\"token multi-token odd-token\\\"  >̞</span><span class=\\\"token multi-token odd-token\\\"  >̠</span><span class=\\\"token multi-token odd-token\\\"  >͍</span><span class=\\\"token odd-token\\\"  >A</span><span class=\\\"token multi-token even-token\\\"  >ͫ</span><span class=\\\"token multi-token even-token\\\"  >͗</span><span class=\\\"token multi-token even-token\\\"  >̴</span><span class=\\\"token multi-token even-token\\\"  >͢</span><span class=\\\"token multi-token even-token\\\"  >̵</span><span class=\\\"token multi-token even-token\\\"  >̜</span><span class=\\\"token multi-token even-token\\\"  >̰</span><span class=\\\"token multi-token even-token\\\"  >͔</span><span class=\\\"token even-token\\\"  >L</span><span class=\\\"token multi-token odd-token\\\"  >ͨ</span><span class=\\\"token multi-token odd-token\\\"  >ͧ</span><span class=\\\"token multi-token odd-token\\\"  >ͩ</span><span class=\\\"token multi-token odd-token\\\"  >͘</span><span class=\\\"token multi-token odd-token\\\"  >̠</span><span class=\\\"token odd-token\\\"  >G</span><span class=\\\"token multi-token even-token\\\"  >̑</span><span class=\\\"token multi-token even-token\\\"  >͗</span><span class=\\\"token multi-token even-token\\\"  >̎</span><span class=\\\"token multi-token even-token\\\"  >̅</span><span class=\\\"token multi-token even-token\\\"  >͛</span><span class=\\\"token multi-token even-token\\\"  >́</span><span class=\\\"token multi-token even-token\\\"  >̴</span><span class=\\\"token multi-token even-token\\\"  >̻</span><span class=\\\"token multi-token even-token\\\"  >͈</span><span class=\\\"token multi-token even-token\\\"  >͍</span><span class=\\\"token multi-token even-token\\\"  >͔</span><span class=\\\"token multi-token even-token\\\"  >̹</span><span class=\\\"annotation\\\" style=\\\"color:hsl(61,32%,64%\\\" data-label=\\\"foo\\\"><span class=\\\"token even-token\\\"  >O</span><span class=\\\"token multi-token odd-token\\\"  >͂</span><span class=\\\"token multi-token odd-token\\\"  >̌</span><span class=\\\"token multi-token odd-token\\\"  >̌</span><span class=\\\"token multi-token odd-token\\\"  >͘</span><span class=\\\"token multi-token odd-token\\\"  >̨</span><span class=\\\"token multi-token odd-token\\\"  >̵</span></span><span class=\\\"token multi-token odd-token\\\"  >̹</span><span class=\\\"token multi-token odd-token\\\"  >̻</span><span class=\\\"token multi-token odd-token\\\"  >̝</span><span class=\\\"token multi-token odd-token\\\"  >̳</span><span class=\\\"token odd-token\\\"  >!</span><span class=\\\"token multi-token even-token\\\"  >̿</span><span class=\\\"token multi-token even-token\\\"  >̋</span><span class=\\\"token multi-token even-token\\\"  >ͥ</span><span class=\\\"token multi-token even-token\\\"  >ͥ</span><span class=\\\"token multi-token even-token\\\"  >̂</span><span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"bar\\\"><span class=\\\"token multi-token even-token\\\"  >ͣ</span><span class=\\\"token multi-token even-token\\\"  >̐</span><span class=\\\"token multi-token even-token\\\"  >́</span><span class=\\\"token multi-token even-token\\\"  >́</span><span class=\\\"token multi-token even-token\\\"  >͞</span><span class=\\\"token multi-token even-token\\\"  >͜</span><span class=\\\"token multi-token even-token\\\"  >͖</span><span class=\\\"token multi-token even-token\\\"  >̬</span><span class=\\\"token multi-token even-token\\\"  >̰</span><span class=\\\"token multi-token even-token\\\"  >̙</span><span class=\\\"token multi-token even-token\\\"  >̗</span><span class=\\\"token even-token\\\"  >':</span><span class=\\\"token odd-token\\\"  > W</span></span><span class=\\\"token odd-token\\\"  >henever</span><span class=\\\"token even-token\\\"  > you</span><span class=\\\"token multi-token odd-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >re</span><span class=\\\"token even-token\\\"  > working</span><span class=\\\"token odd-token\\\"  > on</span><span class=\\\"annotation\\\" style=\\\"color:hsl(10,32%,64%\\\" data-label=\\\"bar\\\"><span class=\\\"token even-token\\\"  > a</span><span class=\\\"token odd-token\\\"  > piece</span></span><span class=\\\"token even-token\\\"  > of</span><span class=\\\"token odd-token\\\"  > JavaScript</span><span class=\\\"token even-token\\\"  > code</span><span class=\\\"token odd-token\\\"  > that</span><span class=\\\"annotation\\\" style=\\\"color:hsl(112,32%,64%\\\" data-label=\\\"poo\\\"><span class=\\\"token even-token\\\"  > de</span></span><span class=\\\"token even-token\\\"  >als</span><span class=\\\"token odd-token\\\"  > with</span><span class=\\\"token even-token\\\"  > strings</span><span class=\\\"token odd-token\\\"  > or</span><span class=\\\"token even-token\\\"  > regular</span><span class=\\\"token odd-token\\\"  > expressions</span><span class=\\\"token even-token\\\"  > in</span><span class=\\\"token odd-token\\\"  > some</span><span class=\\\"token even-token\\\"  > way</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"token even-token\\\"  > just</span><span class=\\\"token odd-token\\\"  > add</span><span class=\\\"token even-token\\\"  > a</span><span class=\\\"token odd-token\\\"  > unit</span><span class=\\\"token even-token\\\"  > test</span><span class=\\\"token odd-token\\\"  > that</span><span class=\\\"token even-token\\\"  > contains</span><span class=\\\"token odd-token\\\"  > a</span><span class=\\\"token even-token\\\"  > pile</span><span class=\\\"token odd-token\\\"  > of</span><span class=\\\"token even-token\\\"  > po</span><span class=\\\"token odd-token\\\"  >o</span><span class=\\\"token even-token\\\"  > (</span><span class=\\\"token multi-token odd-token\\\"  >💩</span><span class=\\\"token even-token\\\"  >)</span><span class=\\\"token odd-token\\\"  > in</span><span class=\\\"token even-token\\\"  > a</span><span class=\\\"token odd-token\\\"  > string</span><span class=\\\"token even-token\\\"  >,</span><span class=\\\"token odd-token\\\"  > 💩</span><span class=\\\"token multi-token even-token\\\"  >💩</span><span class=\\\"token multi-token odd-token\\\"  >💩</span><span class=\\\"token multi-token even-token\\\"  >💩</span><span class=\\\"token multi-token odd-token\\\"  >💩</span><span class=\\\"token multi-token even-token\\\"  >💩</span><span class=\\\"token multi-token odd-token\\\"  >💩</span><span class=\\\"token multi-token even-token\\\"  >💩</span><span class=\\\"token multi-token odd-token\\\"  >💩</span><span class=\\\"token multi-token even-token\\\"  >💩</span><span class=\\\"token multi-token odd-token\\\"  >💩</span><span class=\\\"token multi-token even-token\\\"  >💩</span><span class=\\\"token odd-token\\\"  > and</span><span class=\\\"token even-token\\\"  > see</span><span class=\\\"token odd-token\\\"  > if</span><span class=\\\"token even-token\\\"  > anything</span><span class=\\\"token odd-token\\\"  > breaks</span><span class=\\\"token even-token\\\"  >.</span><span class=\\\"token odd-token\\\"  > It</span><span class=\\\"token multi-token even-token\\\"  >’</span><span class=\\\"token even-token\\\"  >s</span><span class=\\\"token odd-token\\\"  > a</span><span class=\\\"token even-token\\\"  > quick</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"token even-token\\\"  > fun</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"token even-token\\\"  > and</span><span class=\\\"token odd-token\\\"  > easy</span><span class=\\\"token even-token\\\"  > way</span><span class=\\\"token odd-token\\\"  > to</span><span class=\\\"token even-token\\\"  > see</span><span class=\\\"token odd-token\\\"  > if</span><span class=\\\"token even-token\\\"  > your</span><span class=\\\"token odd-token\\\"  > code</span><span class=\\\"token even-token\\\"  > supports</span><span class=\\\"token odd-token\\\"  > ast</span><span class=\\\"token even-token\\\"  >ral</span><span class=\\\"token odd-token\\\"  > symbols</span><span class=\\\"token even-token\\\"  >.</span><span class=\\\"token odd-token\\\"  > Once</span><span class=\\\"token even-token\\\"  > you</span><span class=\\\"token multi-token odd-token\\\"  >’</span><span class=\\\"token odd-token\\\"  >ve</span><span class=\\\"token even-token\\\"  > found</span><span class=\\\"token odd-token\\\"  > a</span><span class=\\\"token even-token\\\"  > Unicode</span><span class=\\\"token odd-token\\\"  >-</span><span class=\\\"token even-token\\\"  >related</span><span class=\\\"token odd-token\\\"  > bug</span><span class=\\\"token even-token\\\"  > in</span><span class=\\\"token odd-token\\\"  > your</span><span class=\\\"token even-token\\\"  > code</span><span class=\\\"token odd-token\\\"  >,</span><span class=\\\"token even-token\\\"  > all</span><span class=\\\"token odd-token\\\"  > you</span><span class=\\\"token even-token\\\"  > need</span><span class=\\\"token odd-token\\\"  > to</span><span class=\\\"token even-token\\\"  > do</span><span class=\\\"token odd-token\\\"  > is</span><span class=\\\"token even-token\\\"  > apply</span><span class=\\\"token odd-token\\\"  > the</span><span class=\\\"token even-token\\\"  > techniques</span><span class=\\\"token odd-token\\\"  > discussed</span><span class=\\\"token even-token\\\"  > in</span><span class=\\\"token odd-token\\\"  > this</span><span class=\\\"token even-token\\\"  > post</span><span class=\\\"token odd-token\\\"  > to</span><span class=\\\"token even-token\\\"  > fix</span><span class=\\\"token odd-token\\\"  > it</span><span class=\\\"token even-token\\\"  >.</span>\\n\",\n       \"            </div>\\n\",\n       \"        </body>\\n\",\n       \"    </html>\\n\",\n       \"    \"\n      ],\n      \"text/plain\": [\n       \"<IPython.core.display.HTML object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from tokenizers import ByteLevelBPETokenizer\\n\",\n    \"\\n\",\n    \"roberta_tokenizer = ByteLevelBPETokenizer.from_file(\\\"/tmp/roberta-base-vocab.json\\\", \\\"/tmp/roberta-base-merges.txt\\\")\\n\",\n    \"roberta_visualizer = EncodingVisualizer(tokenizer=roberta_tokenizer, default_to_notebook=True)\\n\",\n    \"roberta_visualizer(text, annotations=annotations)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.3\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/__init__.py",
    "content": "from enum import Enum\nfrom typing import List, Tuple, Union\n\n\nOffsets = Tuple[int, int]\n\nTextInputSequence = str\n\"\"\"A :obj:`str` that represents an input sequence \"\"\"\n\nPreTokenizedInputSequence = Union[List[str], Tuple[str]]\n\"\"\"A pre-tokenized input sequence. Can be one of:\n\n    - A :obj:`List` of :obj:`str`\n    - A :obj:`Tuple` of :obj:`str`\n\"\"\"\n\nTextEncodeInput = Union[\n    TextInputSequence,\n    Tuple[TextInputSequence, TextInputSequence],\n    List[TextInputSequence],\n]\n\"\"\"Represents a textual input for encoding. Can be either:\n\n    - A single sequence: :data:`~tokenizers.TextInputSequence`\n    - A pair of sequences:\n\n      - A :obj:`Tuple` of :data:`~tokenizers.TextInputSequence`\n      - Or a :obj:`List` of :data:`~tokenizers.TextInputSequence` of size 2\n\"\"\"\n\nPreTokenizedEncodeInput = Union[\n    PreTokenizedInputSequence,\n    Tuple[PreTokenizedInputSequence, PreTokenizedInputSequence],\n    List[PreTokenizedInputSequence],\n]\n\"\"\"Represents a pre-tokenized input for encoding. Can be either:\n\n    - A single sequence: :data:`~tokenizers.PreTokenizedInputSequence`\n    - A pair of sequences:\n\n      - A :obj:`Tuple` of :data:`~tokenizers.PreTokenizedInputSequence`\n      - Or a :obj:`List` of :data:`~tokenizers.PreTokenizedInputSequence` of size 2\n\"\"\"\n\nInputSequence = Union[TextInputSequence, PreTokenizedInputSequence]\n\"\"\"Represents all the possible types of input sequences for encoding. Can be:\n\n    - When ``is_pretokenized=False``: :data:`~TextInputSequence`\n    - When ``is_pretokenized=True``: :data:`~PreTokenizedInputSequence`\n\"\"\"\n\nEncodeInput = Union[TextEncodeInput, PreTokenizedEncodeInput]\n\"\"\"Represents all the possible types of input for encoding. Can be:\n\n    - When ``is_pretokenized=False``: :data:`~TextEncodeInput`\n    - When ``is_pretokenized=True``: :data:`~PreTokenizedEncodeInput`\n\"\"\"\n\n\nclass OffsetReferential(Enum):\n    ORIGINAL = \"original\"\n    NORMALIZED = \"normalized\"\n\n\nclass OffsetType(Enum):\n    BYTE = \"byte\"\n    CHAR = \"char\"\n\n\nclass SplitDelimiterBehavior(Enum):\n    REMOVED = \"removed\"\n    ISOLATED = \"isolated\"\n    MERGED_WITH_PREVIOUS = \"merged_with_previous\"\n    MERGED_WITH_NEXT = \"merged_with_next\"\n    CONTIGUOUS = \"contiguous\"\n\n\nfrom .tokenizers import (\n    AddedToken,\n    Encoding,\n    NormalizedString,\n    PreTokenizedString,\n    Regex,\n    Token,\n    Tokenizer,\n    decoders,\n    models,\n    normalizers,\n    pre_tokenizers,\n    processors,\n    trainers,\n    __version__,\n)\nfrom .implementations import (\n    BertWordPieceTokenizer,\n    ByteLevelBPETokenizer,\n    CharBPETokenizer,\n    SentencePieceBPETokenizer,\n    SentencePieceUnigramTokenizer,\n)\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/__init__.pyi",
    "content": "import _typeshed\nimport tokenizers\nimport tokenizers.decoders\nimport tokenizers.models\nimport tokenizers.normalizers\nimport tokenizers.pre_tokenizers\nimport tokenizers.processors\nimport tokenizers.trainers\nimport typing\n\n__version__: typing.Final[str]\n\nclass AddedToken:\n    def __eq__(self, /, other: tokenizers.AddedToken) -> bool:\n        \"\"\"Return self==value.\"\"\"\n        ...\n    def __ge__(self, /, other: tokenizers.AddedToken) -> bool:\n        \"\"\"Return self>=value.\"\"\"\n        ...\n    def __getstate__(self, /) -> typing.Any: ...\n    def __gt__(self, /, other: tokenizers.AddedToken) -> bool:\n        \"\"\"Return self>value.\"\"\"\n        ...\n    def __hash__(self, /) -> int:\n        \"\"\"Return hash(self).\"\"\"\n        ...\n    def __le__(self, /, other: tokenizers.AddedToken) -> bool:\n        \"\"\"Return self<=value.\"\"\"\n        ...\n    def __lt__(self, /, other: tokenizers.AddedToken) -> bool:\n        \"\"\"Return self<value.\"\"\"\n        ...\n    def __ne__(self, /, other: tokenizers.AddedToken) -> bool:\n        \"\"\"Return self!=value.\"\"\"\n        ...\n    def __new__(cls, /, content: str | None = None, **kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    @property\n    def content(self, /) -> str:\n        \"\"\"Get the content of this :obj:`AddedToken`\"\"\"\n        ...\n    @content.setter\n    def content(self, /, content: str) -> None:\n        \"\"\"Get the content of this :obj:`AddedToken`\"\"\"\n        ...\n    @property\n    def lstrip(self, /) -> bool:\n        \"\"\"Get the value of the :obj:`lstrip` option\"\"\"\n        ...\n    @property\n    def normalized(self, /) -> bool:\n        \"\"\"Get the value of the :obj:`normalized` option\"\"\"\n        ...\n    @property\n    def rstrip(self, /) -> bool:\n        \"\"\"Get the value of the :obj:`rstrip` option\"\"\"\n        ...\n    @property\n    def single_word(self, /) -> bool:\n        \"\"\"Get the value of the :obj:`single_word` option\"\"\"\n        ...\n    @property\n    def special(self, /) -> bool:\n        \"\"\"Get the value of the :obj:`special` option\"\"\"\n        ...\n    @special.setter\n    def special(self, /, special: bool) -> None:\n        \"\"\"Get the value of the :obj:`special` option\"\"\"\n        ...\n\nclass Encoding:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __len__(self, /) -> int:\n        \"\"\"Return len(self).\"\"\"\n        ...\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    @property\n    def attention_mask(self, /) -> typing.Any:\n        \"\"\"\n        The attention mask\n\n        This indicates to the LM which tokens should be attended to, and which should not.\n        This is especially important when batching sequences, where we need to applying\n        padding.\n\n        Returns:\n           :obj:`List[int]`: The attention mask\n        \"\"\"\n        ...\n    def char_to_token(self, /, char_pos: int, sequence_index: int = 0) -> typing.Any:\n        \"\"\"\n        Get the token that contains the char at the given position in the input sequence.\n\n        Args:\n            char_pos (:obj:`int`):\n                The position of a char in the input string\n            sequence_index (:obj:`int`, defaults to :obj:`0`):\n                The index of the sequence that contains the target char\n\n        Returns:\n            :obj:`int`: The index of the token that contains this char in the encoded sequence\n        \"\"\"\n        ...\n    def char_to_word(self, /, char_pos: int, sequence_index: int = 0) -> typing.Any:\n        \"\"\"\n        Get the word that contains the char at the given position in the input sequence.\n\n        Args:\n            char_pos (:obj:`int`):\n                The position of a char in the input string\n            sequence_index (:obj:`int`, defaults to :obj:`0`):\n                The index of the sequence that contains the target char\n\n        Returns:\n            :obj:`int`: The index of the word that contains this char in the input sequence\n        \"\"\"\n        ...\n    @property\n    def ids(self, /) -> typing.Any:\n        \"\"\"\n        The generated IDs\n\n        The IDs are the main input to a Language Model. They are the token indices,\n        the numerical representations that a LM understands.\n\n        Returns:\n            :obj:`List[int]`: The list of IDs\n        \"\"\"\n        ...\n    @staticmethod\n    def merge(encodings: typing.Any, growing_offsets: bool = True) -> Encoding:\n        \"\"\"\n        Merge the list of encodings into one final :class:`~tokenizers.Encoding`\n\n        Args:\n            encodings (A :obj:`List` of :class:`~tokenizers.Encoding`):\n                The list of encodings that should be merged in one\n\n            growing_offsets (:obj:`bool`, defaults to :obj:`True`):\n                Whether the offsets should accumulate while merging\n\n        Returns:\n            :class:`~tokenizers.Encoding`: The resulting Encoding\n        \"\"\"\n        ...\n    @property\n    def n_sequences(self, /) -> int:\n        \"\"\"\n        The number of sequences represented\n\n        Returns:\n            :obj:`int`: The number of sequences in this :class:`~tokenizers.Encoding`\n        \"\"\"\n        ...\n    @property\n    def offsets(self, /) -> typing.Any:\n        \"\"\"\n        The offsets associated to each token\n\n        These offsets let's you slice the input string, and thus retrieve the original\n        part that led to producing the corresponding token.\n\n        Returns:\n            A :obj:`List` of :obj:`Tuple[int, int]`: The list of offsets\n        \"\"\"\n        ...\n    @property\n    def overflowing(self, /) -> typing.Any:\n        \"\"\"\n        A :obj:`List` of overflowing :class:`~tokenizers.Encoding`\n\n        When using truncation, the :class:`~tokenizers.Tokenizer` takes care of splitting\n        the output into as many pieces as required to match the specified maximum length.\n        This field lets you retrieve all the subsequent pieces.\n\n        When you use pairs of sequences, the overflowing pieces will contain enough\n        variations to cover all the possible combinations, while respecting the provided\n        maximum length.\n        \"\"\"\n        ...\n    def pad(self, /, length: int, **kwargs) -> None:\n        \"\"\"\n        Pad the :class:`~tokenizers.Encoding` at the given length\n\n        Args:\n            length (:obj:`int`):\n                The desired length\n\n            direction: (:obj:`str`, defaults to :obj:`right`):\n                The expected padding direction. Can be either :obj:`right` or :obj:`left`\n\n            pad_id (:obj:`int`, defaults to :obj:`0`):\n                The ID corresponding to the padding token\n\n            pad_type_id (:obj:`int`, defaults to :obj:`0`):\n                The type ID corresponding to the padding token\n\n            pad_token (:obj:`str`, defaults to `[PAD]`):\n                The pad token to use\n        \"\"\"\n        ...\n    @property\n    def sequence_ids(self, /) -> typing.Any:\n        \"\"\"\n        The generated sequence indices.\n\n        They represent the index of the input sequence associated to each token.\n        The sequence id can be None if the token is not related to any input sequence,\n        like for example with special tokens.\n\n        Returns:\n            A :obj:`List` of :obj:`Optional[int]`: A list of optional sequence index.\n        \"\"\"\n        ...\n    def set_sequence_id(self, /, sequence_id: int) -> None:\n        \"\"\"\n        Set the given sequence index\n\n        Set the given sequence index for the whole range of tokens contained in this\n        :class:`~tokenizers.Encoding`.\n        \"\"\"\n        ...\n    @property\n    def special_tokens_mask(self, /) -> typing.Any:\n        \"\"\"\n        The special token mask\n\n        This indicates which tokens are special tokens, and which are not.\n\n        Returns:\n            :obj:`List[int]`: The special tokens mask\n        \"\"\"\n        ...\n    def token_to_chars(self, /, token_index: int) -> typing.Any:\n        \"\"\"\n        Get the offsets of the token at the given index.\n\n        The returned offsets are related to the input sequence that contains the\n        token.  In order to determine in which input sequence it belongs, you\n        must call :meth:`~tokenizers.Encoding.token_to_sequence()`.\n\n        Args:\n            token_index (:obj:`int`):\n                The index of a token in the encoded sequence.\n\n        Returns:\n            :obj:`Tuple[int, int]`: The token offsets :obj:`(first, last + 1)`\n        \"\"\"\n        ...\n    def token_to_sequence(self, /, token_index: int) -> typing.Any:\n        \"\"\"\n        Get the index of the sequence represented by the given token.\n\n        In the general use case, this method returns :obj:`0` for a single sequence or\n        the first sequence of a pair, and :obj:`1` for the second sequence of a pair\n\n        Args:\n            token_index (:obj:`int`):\n                The index of a token in the encoded sequence.\n\n        Returns:\n            :obj:`int`: The sequence id of the given token\n        \"\"\"\n        ...\n    def token_to_word(self, /, token_index: int) -> typing.Any:\n        \"\"\"\n        Get the index of the word that contains the token in one of the input sequences.\n\n        The returned word index is related to the input sequence that contains\n        the token.  In order to determine in which input sequence it belongs, you\n        must call :meth:`~tokenizers.Encoding.token_to_sequence()`.\n\n        Args:\n            token_index (:obj:`int`):\n                The index of a token in the encoded sequence.\n\n        Returns:\n            :obj:`int`: The index of the word in the relevant input sequence.\n        \"\"\"\n        ...\n    @property\n    def tokens(self, /) -> typing.Any:\n        \"\"\"\n        The generated tokens\n\n        They are the string representation of the IDs.\n\n        Returns:\n            :obj:`List[str]`: The list of tokens\n        \"\"\"\n        ...\n    def truncate(self, /, max_length: int, stride: int = 0, direction: str = \"right\") -> None:\n        \"\"\"\n        Truncate the :class:`~tokenizers.Encoding` at the given length\n\n        If this :class:`~tokenizers.Encoding` represents multiple sequences, when truncating\n        this information is lost. It will be considered as representing a single sequence.\n\n        Args:\n            max_length (:obj:`int`):\n                The desired length\n\n            stride (:obj:`int`, defaults to :obj:`0`):\n                The length of previous content to be included in each overflowing piece\n\n            direction (:obj:`str`, defaults to :obj:`right`):\n                Truncate direction\n        \"\"\"\n        ...\n    @property\n    def type_ids(self, /) -> typing.Any:\n        \"\"\"\n        The generated type IDs\n\n        Generally used for tasks like sequence classification or question answering,\n        these tokens let the LM know which input sequence corresponds to each tokens.\n\n        Returns:\n            :obj:`List[int]`: The list of type ids\n        \"\"\"\n        ...\n    @property\n    def word_ids(self, /) -> typing.Any:\n        \"\"\"\n        The generated word indices.\n\n        They represent the index of the word associated to each token.\n        When the input is pre-tokenized, they correspond to the ID of the given input label,\n        otherwise they correspond to the words indices as defined by the\n        :class:`~tokenizers.pre_tokenizers.PreTokenizer` that was used.\n\n        For special tokens and such (any token that was generated from something that was\n        not part of the input), the output is :obj:`None`\n\n        Returns:\n            A :obj:`List` of :obj:`Optional[int]`: A list of optional word index.\n        \"\"\"\n        ...\n    def word_to_chars(self, /, word_index: int, sequence_index: int = 0) -> typing.Any:\n        \"\"\"\n        Get the offsets of the word at the given index in one of the input sequences.\n\n        Args:\n            word_index (:obj:`int`):\n                The index of a word in one of the input sequences.\n            sequence_index (:obj:`int`, defaults to :obj:`0`):\n                The index of the sequence that contains the target word\n\n        Returns:\n            :obj:`Tuple[int, int]`: The range of characters (span) :obj:`(first, last + 1)`\n        \"\"\"\n        ...\n    def word_to_tokens(self, /, word_index: int, sequence_index: int = 0) -> typing.Any:\n        \"\"\"\n        Get the encoded tokens corresponding to the word at the given index\n        in one of the input sequences.\n\n        Args:\n            word_index (:obj:`int`):\n                The index of a word in one of the input sequences.\n            sequence_index (:obj:`int`, defaults to :obj:`0`):\n                The index of the sequence that contains the target word\n\n        Returns:\n            :obj:`Tuple[int, int]`: The range of tokens: :obj:`(first, last + 1)`\n        \"\"\"\n        ...\n    @property\n    def words(self, /) -> typing.Any:\n        \"\"\"\n        The generated word indices.\n\n        .. warning::\n            This is deprecated and will be removed in a future version.\n            Please use :obj:`~tokenizers.Encoding.word_ids` instead.\n\n        They represent the index of the word associated to each token.\n        When the input is pre-tokenized, they correspond to the ID of the given input label,\n        otherwise they correspond to the words indices as defined by the\n        :class:`~tokenizers.pre_tokenizers.PreTokenizer` that was used.\n\n        For special tokens and such (any token that was generated from something that was\n        not part of the input), the output is :obj:`None`\n\n        Returns:\n            A :obj:`List` of :obj:`Optional[int]`: A list of optional word index.\n        \"\"\"\n        ...\n\nclass NormalizedString:\n    def __getitem__(self, /, range: int | tuple[int, int] | typing.Any) -> typing.Any:\n        \"\"\"Return self[key].\"\"\"\n        ...\n    def __new__(cls, /, sequence: str) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    def append(self, /, s: str) -> None:\n        \"\"\"Append the given sequence to the string\"\"\"\n        ...\n    def clear(self, /) -> None:\n        \"\"\"Clears the string\"\"\"\n        ...\n    def filter(self, /, func: typing.Any) -> typing.Any:\n        \"\"\"Filter each character of the string using the given func\"\"\"\n        ...\n    def for_each(self, /, func: typing.Any) -> typing.Any:\n        \"\"\"Calls the given function for each character of the string\"\"\"\n        ...\n    def lowercase(self, /) -> None:\n        \"\"\"Lowercase the string\"\"\"\n        ...\n    def lstrip(self, /) -> None:\n        \"\"\"Strip the left of the string\"\"\"\n        ...\n    def map(self, /, func: typing.Any) -> typing.Any:\n        \"\"\"\n        Calls the given function for each character of the string\n\n        Replaces each character of the string using the returned value. Each\n        returned value **must** be a str of length 1 (ie a character).\n        \"\"\"\n        ...\n    def nfc(self, /) -> None:\n        \"\"\"Runs the NFC normalization\"\"\"\n        ...\n    def nfd(self, /) -> None:\n        \"\"\"Runs the NFD normalization\"\"\"\n        ...\n    def nfkc(self, /) -> None:\n        \"\"\"Runs the NFKC normalization\"\"\"\n        ...\n    def nfkd(self, /) -> None:\n        \"\"\"Runs the NFKD normalization\"\"\"\n        ...\n    @property\n    def normalized(self, /) -> str:\n        \"\"\"The normalized part of the string\"\"\"\n        ...\n    @property\n    def original(self, /) -> str: ...\n    def prepend(self, /, s: str) -> None:\n        \"\"\"Prepend the given sequence to the string\"\"\"\n        ...\n    def replace(self, /, pattern: str | tokenizers.Regex, content: str) -> typing.Any:\n        \"\"\"\n        Replace the content of the given pattern with the provided content\n\n        Args:\n            pattern: Pattern:\n                A pattern used to match the string. Usually a string or a Regex\n\n            content: str:\n                The content to be used as replacement\n        \"\"\"\n        ...\n    def rstrip(self, /) -> None:\n        \"\"\"Strip the right of the string\"\"\"\n        ...\n    def slice(self, /, range: int | tuple[int, int] | typing.Any) -> typing.Any:\n        \"\"\"Slice the string using the given range\"\"\"\n        ...\n    def split(self, /, pattern: str | tokenizers.Regex, behavior: typing.Any) -> typing.Any:\n        \"\"\"\n        Split the NormalizedString using the given pattern and the specified behavior\n\n        Args:\n            pattern: Pattern:\n                A pattern used to split the string. Usually a string or a regex built with `tokenizers.Regex`\n\n            behavior: SplitDelimiterBehavior:\n                The behavior to use when splitting.\n                Choices: \"removed\", \"isolated\", \"merged_with_previous\", \"merged_with_next\",\n                \"contiguous\"\n\n        Returns:\n            A list of NormalizedString, representing each split\n        \"\"\"\n        ...\n    def strip(self, /) -> None:\n        \"\"\"Strip both ends of the string\"\"\"\n        ...\n    def uppercase(self, /) -> None:\n        \"\"\"Uppercase the string\"\"\"\n        ...\n\nclass PreTokenizedString:\n    def __new__(cls, /, s: str) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def get_splits(self, /, offset_referential: typing.Any = ..., offset_type: typing.Any = ...) -> typing.Any:\n        \"\"\"\n        Get the splits currently managed by the PreTokenizedString\n\n        Args:\n            offset_referential: :obj:`str`\n                Whether the returned splits should have offsets expressed relative\n                to the original string, or the normalized one. choices: \"original\", \"normalized\".\n\n            offset_type: :obj:`str`\n                Whether the returned splits should have offsets expressed in bytes or chars.\n                When slicing an str, we usually want to use chars, which is the default value.\n                Now in some cases it might be interesting to get these offsets expressed in bytes,\n                so it is possible to change this here.\n                choices: \"char\", \"bytes\"\n\n        Returns\n            A list of splits\n        \"\"\"\n        ...\n    def normalize(self, /, func: typing.Any) -> typing.Any:\n        \"\"\"\n        Normalize each split of the `PreTokenizedString` using the given `func`\n\n        Args:\n            func: Callable[[NormalizedString], None]:\n                The function used to normalize each underlying split. This function\n                does not need to return anything, just calling the methods on the provided\n                NormalizedString allow its modification.\n        \"\"\"\n        ...\n    def split(self, /, func: typing.Any) -> typing.Any:\n        \"\"\"\n        Split the PreTokenizedString using the given `func`\n\n        Args:\n            func: Callable[[index, NormalizedString], List[NormalizedString]]:\n                The function used to split each underlying split.\n                It is expected to return a list of `NormalizedString`, that represent the new\n                splits. If the given `NormalizedString` does not need any splitting, we can\n                just return it directly.\n                In order for the offsets to be tracked accurately, any returned `NormalizedString`\n                should come from calling either `.split` or `.slice` on the received one.\n        \"\"\"\n        ...\n    def to_encoding(self, /, type_id: int = 0, word_idx: int | None = None) -> Encoding:\n        \"\"\"\n        Return an Encoding generated from this PreTokenizedString\n\n        Args:\n            type_id: int = 0:\n                The type_id to be used on the generated Encoding.\n\n            word_idx: Optional[int] = None:\n                An optional word index to be used for each token of this Encoding. If provided,\n                all the word indices in the generated Encoding will use this value, instead\n                of the one automatically tracked during pre-tokenization.\n\n        Returns:\n            An Encoding\n        \"\"\"\n        ...\n    def tokenize(self, /, func: typing.Any) -> typing.Any:\n        \"\"\"\n        Tokenize each split of the `PreTokenizedString` using the given `func`\n\n        Args:\n            func: Callable[[str], List[Token]]:\n                The function used to tokenize each underlying split. This function must return\n                a list of Token generated from the input str.\n        \"\"\"\n        ...\n\nclass Regex:\n    def __new__(cls, /, s: str) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Token:\n    def __new__(cls, /, id: int, value: str, offsets: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def as_tuple(self, /) -> typing.Any: ...\n    @property\n    def id(self, /) -> int: ...\n    @property\n    def offsets(self, /) -> typing.Any: ...\n    @property\n    def value(self, /) -> str: ...\n\nclass Tokenizer:\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __getstate__(self, /) -> typing.Any: ...\n    def __new__(cls, /, model: tokenizers.models.Model) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    def add_special_tokens(self, /, tokens: typing.Any) -> int:\n        \"\"\"\n        Add the given special tokens to the Tokenizer.\n\n        If these tokens are already part of the vocabulary, it just let the Tokenizer know about\n        them. If they don't exist, the Tokenizer creates them, giving them a new id.\n\n        These special tokens will never be processed by the model (ie won't be split into\n        multiple tokens), and they can be removed from the output when decoding.\n\n        Args:\n            tokens (A :obj:`List` of :class:`~tokenizers.AddedToken` or :obj:`str`):\n                The list of special tokens we want to add to the vocabulary. Each token can either\n                be a string or an instance of :class:`~tokenizers.AddedToken` for more\n                customization.\n\n        Returns:\n            :obj:`int`: The number of tokens that were created in the vocabulary\n        \"\"\"\n        ...\n    def add_tokens(self, /, tokens: typing.Any) -> int:\n        \"\"\"\n        Add the given tokens to the vocabulary\n\n        The given tokens are added only if they don't already exist in the vocabulary.\n        Each token then gets a new attributed id.\n\n        Args:\n            tokens (A :obj:`List` of :class:`~tokenizers.AddedToken` or :obj:`str`):\n                The list of tokens we want to add to the vocabulary. Each token can be either a\n                string or an instance of :class:`~tokenizers.AddedToken` for more customization.\n\n        Returns:\n            :obj:`int`: The number of tokens that were created in the vocabulary\n        \"\"\"\n        ...\n    def async_decode_batch(self, /, sequences: typing.Any, skip_special_tokens: bool = True) -> typing.Any:\n        \"\"\"\n        Decode a batch of ids back to their corresponding string\n\n        Args:\n            sequences (:obj:`List` of :obj:`List[int]`):\n                The batch of sequences we want to decode\n\n            skip_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether the special tokens should be removed from the decoded strings\n\n        Returns:\n            :obj:`List[str]`: A list of decoded strings\n        \"\"\"\n        ...\n    def async_encode(\n        self,\n        /,\n        sequence: typing.Any,\n        pair: typing.Any | None = None,\n        is_pretokenized: bool = False,\n        add_special_tokens: bool = True,\n    ) -> typing.Any:\n        \"\"\"\n        Asynchronously encode the given input with character offsets.\n\n        This is an async version of encode that can be awaited in async Python code.\n\n        Example:\n            Here are some examples of the inputs that are accepted::\n\n                await async_encode(\"A single sequence\")\n\n        Args:\n            sequence (:obj:`~tokenizers.InputSequence`):\n                The main input sequence we want to encode. This sequence can be either raw\n                text or pre-tokenized, according to the ``is_pretokenized`` argument:\n\n                - If ``is_pretokenized=False``: :class:`~tokenizers.TextInputSequence`\n                - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedInputSequence`\n\n            pair (:obj:`~tokenizers.InputSequence`, `optional`):\n                An optional input sequence. The expected format is the same that for ``sequence``.\n\n            is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n                Whether the input is already pre-tokenized\n\n            add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to add the special tokens\n\n        Returns:\n            :class:`~tokenizers.Encoding`: The encoded result\n        \"\"\"\n        ...\n    def async_encode_batch(\n        self, /, input: typing.Any, is_pretokenized: bool = False, add_special_tokens: bool = True\n    ) -> typing.Any:\n        \"\"\"\n        Asynchronously encode the given batch of inputs with character offsets.\n\n        This is an async version of encode_batch that can be awaited in async Python code.\n\n        Example:\n            Here are some examples of the inputs that are accepted::\n\n                await async_encode_batch([\n                    \"A single sequence\",\n                    (\"A tuple with a sequence\", \"And its pair\"),\n                    [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n                    ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n                ])\n\n        Args:\n            input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n                A list of single sequences or pair sequences to encode. Each sequence\n                can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n                argument:\n\n                - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n                - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n\n            is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n                Whether the input is already pre-tokenized\n\n            add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to add the special tokens\n\n        Returns:\n            A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n        \"\"\"\n        ...\n    def async_encode_batch_fast(\n        self, /, input: typing.Any, is_pretokenized: bool = False, add_special_tokens: bool = True\n    ) -> typing.Any:\n        \"\"\"\n        Asynchronously encode the given batch of inputs without tracking character offsets.\n\n        This is an async version of encode_batch_fast that can be awaited in async Python code.\n\n        Example:\n            Here are some examples of the inputs that are accepted::\n\n                await async_encode_batch_fast([\n                    \"A single sequence\",\n                    (\"A tuple with a sequence\", \"And its pair\"),\n                    [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n                    ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n                ])\n\n        Args:\n            input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n                A list of single sequences or pair sequences to encode. Each sequence\n                can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n                argument:\n\n                - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n                - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n\n            is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n                Whether the input is already pre-tokenized\n\n            add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to add the special tokens\n\n        Returns:\n            A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n        \"\"\"\n        ...\n    def decode(self, /, ids: typing.Any, skip_special_tokens: bool = True) -> str:\n        \"\"\"\n        Decode the given list of ids back to a string\n\n        This is used to decode anything coming back from a Language Model\n\n        Args:\n            ids (A :obj:`List/Tuple` of :obj:`int`):\n                The list of ids that we want to decode\n\n            skip_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether the special tokens should be removed from the decoded string\n\n        Returns:\n            :obj:`str`: The decoded string\n        \"\"\"\n        ...\n    def decode_batch(self, /, sequences: typing.Any, skip_special_tokens: bool = True) -> list[str]:\n        \"\"\"\n        Decode a batch of ids back to their corresponding string\n\n        Args:\n            sequences (:obj:`List` of :obj:`List[int]`):\n                The batch of sequences we want to decode\n\n            skip_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether the special tokens should be removed from the decoded strings\n\n        Returns:\n            :obj:`List[str]`: A list of decoded strings\n        \"\"\"\n        ...\n    @property\n    def decoder(self, /) -> typing.Any:\n        \"\"\"The `optional` :class:`~tokenizers.decoders.Decoder` in use by the Tokenizer\"\"\"\n        ...\n    @decoder.setter\n    def decoder(self, /, decoder: tokenizers.decoders.Decoder | None) -> None:\n        \"\"\"The `optional` :class:`~tokenizers.decoders.Decoder` in use by the Tokenizer\"\"\"\n        ...\n    def enable_padding(self, /, **kwargs) -> None:\n        \"\"\"\n        Enable the padding\n\n        Args:\n            direction (:obj:`str`, `optional`, defaults to :obj:`right`):\n                The direction in which to pad. Can be either ``right`` or ``left``\n\n            pad_to_multiple_of (:obj:`int`, `optional`):\n                If specified, the padding length should always snap to the next multiple of the\n                given value. For example if we were going to pad witha length of 250 but\n                ``pad_to_multiple_of=8`` then we will pad to 256.\n\n            pad_id (:obj:`int`, defaults to 0):\n                The id to be used when padding\n\n            pad_type_id (:obj:`int`, defaults to 0):\n                The type id to be used when padding\n\n            pad_token (:obj:`str`, defaults to :obj:`[PAD]`):\n                The pad token to be used when padding\n\n            length (:obj:`int`, `optional`):\n                If specified, the length at which to pad. If not specified we pad using the size of\n                the longest sequence in a batch.\n        \"\"\"\n        ...\n    def enable_truncation(self, /, max_length: int, **kwargs) -> None:\n        \"\"\"\n        Enable truncation\n\n        Args:\n            max_length (:obj:`int`):\n                The max length at which to truncate\n\n            stride (:obj:`int`, `optional`):\n                The length of the previous first sequence to be included in the overflowing\n                sequence\n\n            strategy (:obj:`str`, `optional`, defaults to :obj:`longest_first`):\n                The strategy used to truncation. Can be one of ``longest_first``, ``only_first`` or\n                ``only_second``.\n\n            direction (:obj:`str`, defaults to :obj:`right`):\n                Truncate direction\n        \"\"\"\n        ...\n    def encode(\n        self,\n        /,\n        sequence: typing.Any,\n        pair: typing.Any | None = None,\n        is_pretokenized: bool = False,\n        add_special_tokens: bool = True,\n    ) -> Encoding:\n        \"\"\"\n        Encode the given sequence and pair. This method can process raw text sequences\n        as well as already pre-tokenized sequences.\n\n        Example:\n            Here are some examples of the inputs that are accepted::\n\n                encode(\"A single sequence\")`\n                encode(\"A sequence\", \"And its pair\")`\n                encode([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], is_pretokenized=True)`\n                encode(\n                    [ \"A\", \"pre\", \"tokenized\", \"sequence\" ], [ \"And\", \"its\", \"pair\" ],\n                    is_pretokenized=True\n                )\n\n        Args:\n            sequence (:obj:`~tokenizers.InputSequence`):\n                The main input sequence we want to encode. This sequence can be either raw\n                text or pre-tokenized, according to the ``is_pretokenized`` argument:\n\n                - If ``is_pretokenized=False``: :class:`~tokenizers.TextInputSequence`\n                - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedInputSequence`\n\n            pair (:obj:`~tokenizers.InputSequence`, `optional`):\n                An optional input sequence. The expected format is the same that for ``sequence``.\n\n            is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n                Whether the input is already pre-tokenized\n\n            add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to add the special tokens\n\n        Returns:\n            :class:`~tokenizers.Encoding`: The encoded result\n        \"\"\"\n        ...\n    def encode_batch(\n        self, /, input: typing.Any, is_pretokenized: bool = False, add_special_tokens: bool = True\n    ) -> list[Encoding]:\n        \"\"\"\n        Encode the given batch of inputs. This method accept both raw text sequences\n        as well as already pre-tokenized sequences. The reason we use `PySequence` is\n        because it allows type checking with zero-cost (according to PyO3) as we don't\n        have to convert to check.\n\n        Example:\n            Here are some examples of the inputs that are accepted::\n\n                encode_batch([\n                    \"A single sequence\",\n                    (\"A tuple with a sequence\", \"And its pair\"),\n                    [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n                    ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n                ])\n\n        Args:\n            input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n                A list of single sequences or pair sequences to encode. Each sequence\n                can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n                argument:\n\n                - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n                - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n\n            is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n                Whether the input is already pre-tokenized\n\n            add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to add the special tokens\n\n        Returns:\n            A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n        \"\"\"\n        ...\n    def encode_batch_fast(\n        self, /, input: typing.Any, is_pretokenized: bool = False, add_special_tokens: bool = True\n    ) -> list[Encoding]:\n        \"\"\"\n        Encode the given batch of inputs. This method is faster than `encode_batch`\n        because it doesn't keep track of offsets, they will be all zeros.\n\n        Example:\n            Here are some examples of the inputs that are accepted::\n\n                encode_batch_fast([\n                    \"A single sequence\",\n                    (\"A tuple with a sequence\", \"And its pair\"),\n                    [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n                    ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n                ])\n\n        Args:\n            input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n                A list of single sequences or pair sequences to encode. Each sequence\n                can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n                argument:\n\n                - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n                - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n\n            is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n                Whether the input is already pre-tokenized\n\n            add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to add the special tokens\n\n        Returns:\n            A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n        \"\"\"\n        ...\n    @property\n    def encode_special_tokens(self, /) -> bool:\n        \"\"\"\n        Modifies the tokenizer in order to use or not the special tokens\n        during encoding.\n\n        Args:\n            value (:obj:`bool`):\n                Whether to use the special tokens or not\n        \"\"\"\n        ...\n    @encode_special_tokens.setter\n    def encode_special_tokens(self, /, value: bool) -> None:\n        \"\"\"\n        Modifies the tokenizer in order to use or not the special tokens\n        during encoding.\n\n        Args:\n            value (:obj:`bool`):\n                Whether to use the special tokens or not\n        \"\"\"\n        ...\n    @staticmethod\n    def from_buffer(buffer: typing.Any) -> Tokenizer:\n        \"\"\"\n        Instantiate a new :class:`~tokenizers.Tokenizer` from the given buffer.\n\n        Args:\n            buffer (:obj:`bytes`):\n                A buffer containing a previously serialized :class:`~tokenizers.Tokenizer`\n\n        Returns:\n            :class:`~tokenizers.Tokenizer`: The new tokenizer\n        \"\"\"\n        ...\n    @staticmethod\n    def from_file(path: str) -> Tokenizer:\n        \"\"\"\n        Instantiate a new :class:`~tokenizers.Tokenizer` from the file at the given path.\n\n        Args:\n            path (:obj:`str`):\n                A path to a local JSON file representing a previously serialized\n                :class:`~tokenizers.Tokenizer`\n\n        Returns:\n            :class:`~tokenizers.Tokenizer`: The new tokenizer\n        \"\"\"\n        ...\n    @staticmethod\n    def from_pretrained(identifier: str, revision: str = ..., token: str | None = None) -> Tokenizer:\n        \"\"\"\n        Instantiate a new :class:`~tokenizers.Tokenizer` from an existing file on the\n        Hugging Face Hub.\n\n        Args:\n            identifier (:obj:`str`):\n                The identifier of a Model on the Hugging Face Hub, that contains\n                a tokenizer.json file\n            revision (:obj:`str`, defaults to `main`):\n                A branch or commit id\n            token (:obj:`str`, `optional`, defaults to `None`):\n                An optional auth token used to access private repositories on the\n                Hugging Face Hub\n\n        Returns:\n            :class:`~tokenizers.Tokenizer`: The new tokenizer\n        \"\"\"\n        ...\n    @staticmethod\n    def from_str(json: str) -> Tokenizer:\n        \"\"\"\n        Instantiate a new :class:`~tokenizers.Tokenizer` from the given JSON string.\n\n        Args:\n            json (:obj:`str`):\n                A valid JSON string representing a previously serialized\n                :class:`~tokenizers.Tokenizer`\n\n        Returns:\n            :class:`~tokenizers.Tokenizer`: The new tokenizer\n        \"\"\"\n        ...\n    def get_added_tokens_decoder(self, /) -> dict[int, AddedToken]:\n        \"\"\"\n        Get the underlying vocabulary\n\n        Returns:\n            :obj:`Dict[int, AddedToken]`: The vocabulary\n        \"\"\"\n        ...\n    def get_vocab(self, /, with_added_tokens: bool = True) -> dict[str, int]:\n        \"\"\"\n        Get the underlying vocabulary\n\n        Args:\n            with_added_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to include the added tokens\n\n        Returns:\n            :obj:`Dict[str, int]`: The vocabulary\n        \"\"\"\n        ...\n    def get_vocab_size(self, /, with_added_tokens: bool = True) -> int:\n        \"\"\"\n        Get the size of the underlying vocabulary\n\n        Args:\n            with_added_tokens (:obj:`bool`, defaults to :obj:`True`):\n                Whether to include the added tokens\n\n        Returns:\n            :obj:`int`: The size of the vocabulary\n        \"\"\"\n        ...\n    def id_to_token(self, /, id: int) -> str | None:\n        \"\"\"\n        Convert the given id to its corresponding token if it exists\n\n        Args:\n            id (:obj:`int`):\n                The id to convert\n\n        Returns:\n            :obj:`Optional[str]`: An optional token, :obj:`None` if out of vocabulary\n        \"\"\"\n        ...\n    @property\n    def model(self, /) -> typing.Any:\n        \"\"\"The :class:`~tokenizers.models.Model` in use by the Tokenizer\"\"\"\n        ...\n    @model.setter\n    def model(self, /, model: tokenizers.models.Model) -> None:\n        \"\"\"The :class:`~tokenizers.models.Model` in use by the Tokenizer\"\"\"\n        ...\n    def no_padding(self, /) -> None:\n        \"\"\"Disable padding\"\"\"\n        ...\n    def no_truncation(self, /) -> None:\n        \"\"\"Disable truncation\"\"\"\n        ...\n    @property\n    def normalizer(self, /) -> typing.Any:\n        \"\"\"The `optional` :class:`~tokenizers.normalizers.Normalizer` in use by the Tokenizer\"\"\"\n        ...\n    @normalizer.setter\n    def normalizer(self, /, normalizer: tokenizers.normalizers.Normalizer | None) -> None:\n        \"\"\"The `optional` :class:`~tokenizers.normalizers.Normalizer` in use by the Tokenizer\"\"\"\n        ...\n    def num_special_tokens_to_add(self, /, is_pair: bool) -> int:\n        \"\"\"\n        Return the number of special tokens that would be added for single/pair sentences.\n        :param is_pair: Boolean indicating if the input would be a single sentence or a pair\n        :return:\n        \"\"\"\n        ...\n    @property\n    def padding(self, /) -> typing.Any:\n        \"\"\"\n        Get the current padding parameters\n\n        `Cannot be set, use` :meth:`~tokenizers.Tokenizer.enable_padding` `instead`\n\n        Returns:\n            (:obj:`dict`, `optional`):\n                A dict with the current padding parameters if padding is enabled\n        \"\"\"\n        ...\n    def post_process(\n        self,\n        /,\n        encoding: tokenizers.Encoding,\n        pair: tokenizers.Encoding | None = None,\n        add_special_tokens: bool = True,\n    ) -> tokenizers.Encoding:\n        \"\"\"\n        Apply all the post-processing steps to the given encodings.\n\n        The various steps are:\n\n            1. Truncate according to the set truncation params (provided with\n               :meth:`~tokenizers.Tokenizer.enable_truncation`)\n            2. Apply the :class:`~tokenizers.processors.PostProcessor`\n            3. Pad according to the set padding params (provided with\n               :meth:`~tokenizers.Tokenizer.enable_padding`)\n\n        Args:\n            encoding (:class:`~tokenizers.Encoding`):\n                The :class:`~tokenizers.Encoding` corresponding to the main sequence.\n\n            pair (:class:`~tokenizers.Encoding`, `optional`):\n                An optional :class:`~tokenizers.Encoding` corresponding to the pair sequence.\n\n            add_special_tokens (:obj:`bool`):\n                Whether to add the special tokens\n\n        Returns:\n            :class:`~tokenizers.Encoding`: The final post-processed encoding\n        \"\"\"\n        ...\n    @property\n    def post_processor(self, /) -> typing.Any:\n        \"\"\"The `optional` :class:`~tokenizers.processors.PostProcessor` in use by the Tokenizer\"\"\"\n        ...\n    @post_processor.setter\n    def post_processor(self, /, processor: tokenizers.processors.PostProcessor | None) -> None:\n        \"\"\"The `optional` :class:`~tokenizers.processors.PostProcessor` in use by the Tokenizer\"\"\"\n        ...\n    @property\n    def pre_tokenizer(self, /) -> typing.Any:\n        \"\"\"The `optional` :class:`~tokenizers.pre_tokenizers.PreTokenizer` in use by the Tokenizer\"\"\"\n        ...\n    @pre_tokenizer.setter\n    def pre_tokenizer(self, /, pretok: tokenizers.pre_tokenizers.PreTokenizer | None) -> None:\n        \"\"\"The `optional` :class:`~tokenizers.pre_tokenizers.PreTokenizer` in use by the Tokenizer\"\"\"\n        ...\n    def save(self, /, path: str, pretty: bool = True) -> None:\n        \"\"\"\n        Save the :class:`~tokenizers.Tokenizer` to the file at the given path.\n\n        Args:\n            path (:obj:`str`):\n                A path to a file in which to save the serialized tokenizer.\n\n            pretty (:obj:`bool`, defaults to :obj:`True`):\n                Whether the JSON file should be pretty formatted.\n        \"\"\"\n        ...\n    def to_str(self, /, pretty: bool = False) -> str:\n        \"\"\"\n        Gets a serialized string representing this :class:`~tokenizers.Tokenizer`.\n\n        Args:\n            pretty (:obj:`bool`, defaults to :obj:`False`):\n                Whether the JSON string should be pretty formatted.\n\n        Returns:\n            :obj:`str`: A string representing the serialized Tokenizer\n        \"\"\"\n        ...\n    def token_to_id(self, /, token: str) -> int | None:\n        \"\"\"\n        Convert the given token to its corresponding id if it exists\n\n        Args:\n            token (:obj:`str`):\n                The token to convert\n\n        Returns:\n            :obj:`Optional[int]`: An optional id, :obj:`None` if out of vocabulary\n        \"\"\"\n        ...\n    def train(self, /, files: typing.Any, trainer: tokenizers.trainers.Trainer | None = None) -> typing.Any:\n        \"\"\"\n        Train the Tokenizer using the given files.\n\n        Reads the files line by line, while keeping all the whitespace, even new lines.\n        If you want to train from data store in-memory, you can check\n        :meth:`~tokenizers.Tokenizer.train_from_iterator`\n\n        Args:\n            files (:obj:`List[str]`):\n                A list of path to the files that we should use for training\n\n            trainer (:obj:`~tokenizers.trainers.Trainer`, `optional`):\n                An optional trainer that should be used to train our Model\n        \"\"\"\n        ...\n    def train_from_iterator(\n        self, /, iterator: typing.Any, trainer: tokenizers.trainers.Trainer | None = None, length: int | None = None\n    ) -> typing.Any:\n        \"\"\"\n        Train the Tokenizer using the provided iterator.\n\n        You can provide anything that is a Python Iterator\n\n            * A list of sequences :obj:`List[str]`\n            * A generator that yields :obj:`str` or :obj:`List[str]`\n            * A Numpy array of strings\n            * ...\n\n        Args:\n            iterator (:obj:`Iterator`):\n                Any iterator over strings or list of strings\n\n            trainer (:obj:`~tokenizers.trainers.Trainer`, `optional`):\n                An optional trainer that should be used to train our Model\n\n            length (:obj:`int`, `optional`):\n                The total number of sequences in the iterator. This is used to\n                provide meaningful progress tracking\n        \"\"\"\n        ...\n    @property\n    def truncation(self, /) -> typing.Any:\n        \"\"\"\n        Get the currently set truncation parameters\n\n        `Cannot set, use` :meth:`~tokenizers.Tokenizer.enable_truncation` `instead`\n\n        Returns:\n            (:obj:`dict`, `optional`):\n                A dict with the current truncation parameters if truncation is enabled\n        \"\"\"\n        ...\n\ndef __getattr__(name: str) -> _typeshed.Incomplete: ...\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/decoders/__init__.py",
    "content": "from .. import decoders\n\n\nDecoder = decoders.Decoder\nByteLevel = decoders.ByteLevel\nReplace = decoders.Replace\nWordPiece = decoders.WordPiece\nByteFallback = decoders.ByteFallback\nFuse = decoders.Fuse\nStrip = decoders.Strip\nMetaspace = decoders.Metaspace\nBPEDecoder = decoders.BPEDecoder\nCTC = decoders.CTC\nSequence = decoders.Sequence\nDecodeStream = decoders.DecodeStream\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/decoders.pyi",
    "content": "import tokenizers\nimport tokenizers.decoders\nimport typing\n\nclass BPEDecoder:\n    def __new__(cls, /, suffix: str = ...) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def suffix(self, /) -> str: ...\n    @suffix.setter\n    def suffix(self, /, suffix: str) -> None: ...\n\nclass ByteFallback:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass ByteLevel:\n    def __new__(cls, /, **_kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass CTC:\n    def __new__(cls, /, pad_token: str = ..., word_delimiter_token: str = ..., cleanup: bool = True) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def cleanup(self, /) -> bool: ...\n    @cleanup.setter\n    def cleanup(self, /, cleanup: bool) -> None: ...\n    @property\n    def pad_token(self, /) -> str: ...\n    @pad_token.setter\n    def pad_token(self, /, pad_token: str) -> None: ...\n    @property\n    def word_delimiter_token(self, /) -> str: ...\n    @word_delimiter_token.setter\n    def word_delimiter_token(self, /, word_delimiter_token: str) -> None: ...\n\nclass DecodeStream:\n    def __new__(cls, /, ids: typing.Any | None = None, skip_special_tokens: bool | None = False) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def step(self, /, tokenizer: tokenizers.Tokenizer, id: typing.Any) -> typing.Any:\n        \"\"\"\n        Streaming decode step\n\n        Args:\n            tokenizer (:class:`~tokenizers.Tokenizer`):\n               The tokenizer to use for decoding\n           id (:obj:`int` or `List[int]`):\n              The next token id or list of token ids to add to the stream\n\n\n        Returns:\n            :obj:`Optional[str]`: The next decoded string chunk, or None if not enough\n                tokens have been provided yet.\n        \"\"\"\n        ...\n\nclass Decoder:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    @staticmethod\n    def custom(decoder: typing.Any) -> tokenizers.decoders.Decoder: ...\n    def decode(self, /, tokens: typing.Any) -> str:\n        \"\"\"\n        Decode the given list of tokens to a final string\n\n        Args:\n            tokens (:obj:`List[str]`):\n                The list of tokens to decode\n\n        Returns:\n            :obj:`str`: The decoded string\n        \"\"\"\n        ...\n\nclass Fuse:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Metaspace:\n    def __new__(cls, /, replacement: str = \"▁\", prepend_scheme: str = ..., split: bool = True) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def prepend_scheme(self, /) -> str: ...\n    @prepend_scheme.setter\n    def prepend_scheme(self, /, prepend_scheme: str) -> typing.Any: ...\n    @property\n    def replacement(self, /) -> str: ...\n    @replacement.setter\n    def replacement(self, /, replacement: str) -> None: ...\n    @property\n    def split(self, /) -> bool: ...\n    @split.setter\n    def split(self, /, split: bool) -> None: ...\n\nclass Replace:\n    def __new__(cls, /, pattern: str | tokenizers.Regex, content: str) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Sequence:\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(cls, /, decoders_py: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Strip:\n    def __new__(cls, /, content: str = \" \", left: int = 0, right: int = 0) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def content(self, /) -> str: ...\n    @content.setter\n    def content(self, /, content: str) -> None: ...\n    @property\n    def start(self, /) -> int: ...\n    @start.setter\n    def start(self, /, start: int) -> None: ...\n    @property\n    def stop(self, /) -> int: ...\n    @stop.setter\n    def stop(self, /, stop: int) -> None: ...\n\nclass WordPiece:\n    def __new__(cls, /, prefix: str = ..., cleanup: bool = True) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def cleanup(self, /) -> bool: ...\n    @cleanup.setter\n    def cleanup(self, /, cleanup: bool) -> None: ...\n    @property\n    def prefix(self, /) -> str: ...\n    @prefix.setter\n    def prefix(self, /, prefix: str) -> None: ...\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/__init__.py",
    "content": "from .base_tokenizer import BaseTokenizer\nfrom .bert_wordpiece import BertWordPieceTokenizer\nfrom .byte_level_bpe import ByteLevelBPETokenizer\nfrom .char_level_bpe import CharBPETokenizer\nfrom .sentencepiece_bpe import SentencePieceBPETokenizer\nfrom .sentencepiece_unigram import SentencePieceUnigramTokenizer\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/base_tokenizer.py",
    "content": "from typing import Dict, List, Optional, Tuple, Union\n\nfrom tokenizers import AddedToken, EncodeInput, Encoding, InputSequence, Tokenizer\nfrom tokenizers.decoders import Decoder\nfrom tokenizers.models import Model\nfrom tokenizers.normalizers import Normalizer\nfrom tokenizers.pre_tokenizers import PreTokenizer\nfrom tokenizers.processors import PostProcessor\n\n\nOffsets = Tuple[int, int]\n\n\nclass BaseTokenizer:\n    def __init__(self, tokenizer: Tokenizer, parameters=None):\n        self._tokenizer = tokenizer\n        self._parameters = parameters if parameters is not None else {}\n\n    def __repr__(self):\n        return \"Tokenizer(vocabulary_size={}, {})\".format(\n            self._tokenizer.get_vocab_size(),\n            \", \".join(k + \"=\" + str(v) for k, v in self._parameters.items()),\n        )\n\n    def num_special_tokens_to_add(self, is_pair: bool) -> int:\n        \"\"\"\n        Return the number of special tokens that would be added for single/pair sentences.\n        :param is_pair: Boolean indicating if the input would be a single sentence or a pair\n        :return:\n        \"\"\"\n        return self._tokenizer.num_special_tokens_to_add(is_pair)\n\n    def get_vocab(self, with_added_tokens: bool = True) -> Dict[str, int]:\n        \"\"\"Returns the vocabulary\n\n        Args:\n            with_added_tokens: boolean:\n                Whether to include the added tokens in the vocabulary\n\n        Returns:\n            The vocabulary\n        \"\"\"\n        return self._tokenizer.get_vocab(with_added_tokens=with_added_tokens)\n\n    def get_added_tokens_decoder(self) -> Dict[int, AddedToken]:\n        \"\"\"Returns the added reverse vocabulary\n\n        Returns:\n            The added vocabulary mapping ints to AddedTokens\n        \"\"\"\n        return self._tokenizer.get_added_tokens_decoder()\n\n    def get_vocab_size(self, with_added_tokens: bool = True) -> int:\n        \"\"\"Return the size of vocabulary, with or without added tokens.\n\n        Args:\n            with_added_tokens: (`optional`) bool:\n                Whether to count in added special tokens or not\n\n        Returns:\n            Size of vocabulary\n        \"\"\"\n        return self._tokenizer.get_vocab_size(with_added_tokens=with_added_tokens)\n\n    def enable_padding(\n        self,\n        direction: Optional[str] = \"right\",\n        pad_to_multiple_of: Optional[int] = None,\n        pad_id: Optional[int] = 0,\n        pad_type_id: Optional[int] = 0,\n        pad_token: Optional[str] = \"[PAD]\",\n        length: Optional[int] = None,\n    ):\n        \"\"\"Change the padding strategy\n\n        Args:\n            direction: (`optional`) str:\n                Can be one of: `right` or `left`\n\n            pad_to_multiple_of: (`optional`) unsigned int:\n                If specified, the padding length should always snap to the next multiple of\n                the given value. For example if we were going to pad with a length of 250 but\n                `pad_to_multiple_of=8` then we will pad to 256.\n\n            pad_id: (`optional`) unsigned int:\n                The indice to be used when padding\n\n            pad_type_id: (`optional`) unsigned int:\n                The type indice to be used when padding\n\n            pad_token: (`optional`) str:\n                The pad token to be used when padding\n\n            length: (`optional`) unsigned int:\n                If specified, the length at which to pad. If not specified\n                we pad using the size of the longest sequence in a batch\n        \"\"\"\n        return self._tokenizer.enable_padding(\n            direction=direction,\n            pad_to_multiple_of=pad_to_multiple_of,\n            pad_id=pad_id,\n            pad_type_id=pad_type_id,\n            pad_token=pad_token,\n            length=length,\n        )\n\n    def no_padding(self):\n        \"\"\"Disable padding\"\"\"\n        return self._tokenizer.no_padding()\n\n    @property\n    def padding(self) -> Optional[dict]:\n        \"\"\"Get the current padding parameters\n\n        Returns:\n            None if padding is disabled, a dict with the currently set parameters\n            if the padding is enabled.\n        \"\"\"\n        return self._tokenizer.padding\n\n    def enable_truncation(self, max_length: int, stride: Optional[int] = 0, strategy: Optional[str] = \"longest_first\"):\n        \"\"\"Change the truncation options\n\n        Args:\n            max_length: unsigned int:\n                The maximum length at which to truncate\n\n            stride: (`optional`) unsigned int:\n                The length of the previous first sequence to be included\n                in the overflowing sequence\n\n            strategy: (`optional`) str:\n                Can be one of `longest_first`, `only_first` or `only_second`\n        \"\"\"\n        return self._tokenizer.enable_truncation(max_length, stride=stride, strategy=strategy)\n\n    def no_truncation(self):\n        \"\"\"Disable truncation\"\"\"\n        return self._tokenizer.no_truncation()\n\n    @property\n    def truncation(self) -> Optional[dict]:\n        \"\"\"Get the current truncation parameters\n\n        Returns:\n            None if truncation is disabled, a dict with the current truncation parameters if\n            truncation is enabled\n        \"\"\"\n        return self._tokenizer.truncation\n\n    def add_tokens(self, tokens: List[Union[str, AddedToken]]) -> int:\n        \"\"\"Add the given tokens to the vocabulary\n\n        Args:\n            tokens: List[Union[str, AddedToken]]:\n                A list of tokens to add to the vocabulary. Each token can either be\n                a string, or an instance of AddedToken\n\n        Returns:\n            The number of tokens that were added to the vocabulary\n        \"\"\"\n        return self._tokenizer.add_tokens(tokens)\n\n    def add_special_tokens(self, special_tokens: List[Union[str, AddedToken]]) -> int:\n        \"\"\"Add the given special tokens to the vocabulary, and treat them as special tokens.\n\n        The special tokens will never be processed by the model, and will be\n        removed while decoding.\n\n        Args:\n            tokens: List[Union[str, AddedToken]]:\n                A list of special tokens to add to the vocabulary. Each token can either be\n                a string, or an instance of AddedToken\n\n        Returns:\n            The number of tokens that were added to the vocabulary\n        \"\"\"\n        return self._tokenizer.add_special_tokens(special_tokens)\n\n    def normalize(self, sequence: str) -> str:\n        \"\"\"Normalize the given sequence\n\n        Args:\n            sequence: str:\n                The sequence to normalize\n\n        Returns:\n            The normalized string\n        \"\"\"\n        return self._tokenizer.normalizer.normalize_str(sequence)\n\n    def encode(\n        self,\n        sequence: InputSequence,\n        pair: Optional[InputSequence] = None,\n        is_pretokenized: bool = False,\n        add_special_tokens: bool = True,\n    ) -> Encoding:\n        \"\"\"Encode the given sequence and pair. This method can process raw text sequences as well\n        as already pre-tokenized sequences.\n\n        Args:\n            sequence: InputSequence:\n                The sequence we want to encode. This sequence can be either raw text or\n                pre-tokenized, according to the `is_pretokenized` argument:\n\n                - If `is_pretokenized=False`: `InputSequence` is expected to be `str`\n                - If `is_pretokenized=True`: `InputSequence` is expected to be\n                    `Union[List[str], Tuple[str]]`\n\n            is_pretokenized: bool:\n                Whether the input is already pre-tokenized.\n\n            add_special_tokens: bool:\n                Whether to add the special tokens while encoding.\n\n        Returns:\n            An Encoding\n        \"\"\"\n        if sequence is None:\n            raise ValueError(\"encode: `sequence` can't be `None`\")\n\n        return self._tokenizer.encode(sequence, pair, is_pretokenized, add_special_tokens)\n\n    def encode_batch(\n        self,\n        inputs: List[EncodeInput],\n        is_pretokenized: bool = False,\n        add_special_tokens: bool = True,\n    ) -> List[Encoding]:\n        \"\"\"Encode the given inputs. This method accept both raw text sequences as well as already\n        pre-tokenized sequences.\n\n        Args:\n            inputs: List[EncodeInput]:\n                A list of single sequences or pair sequences to encode. Each `EncodeInput` is\n                expected to be of the following form:\n                    `Union[InputSequence, Tuple[InputSequence, InputSequence]]`\n\n                Each `InputSequence` can either be raw text or pre-tokenized,\n                according to the `is_pretokenized` argument:\n\n                - If `is_pretokenized=False`: `InputSequence` is expected to be `str`\n                - If `is_pretokenized=True`: `InputSequence` is expected to be\n                    `Union[List[str], Tuple[str]]`\n\n            is_pretokenized: bool:\n                Whether the input is already pre-tokenized.\n\n            add_special_tokens: bool:\n                Whether to add the special tokens while encoding.\n\n        Returns:\n            A list of Encoding\n        \"\"\"\n\n        if inputs is None:\n            raise ValueError(\"encode_batch: `inputs` can't be `None`\")\n\n        return self._tokenizer.encode_batch(inputs, is_pretokenized, add_special_tokens)\n\n    async def async_encode_batch(\n        self,\n        inputs: List[EncodeInput],\n        is_pretokenized: bool = False,\n        add_special_tokens: bool = True,\n    ) -> List[Encoding]:\n        \"\"\"Asynchronously encode a batch (tracks character offsets).\n\n        Args:\n            inputs: A list of single or pair sequences to encode.\n            is_pretokenized: Whether inputs are already pre-tokenized.\n            add_special_tokens: Whether to add special tokens.\n\n        Returns:\n            A list of Encoding.\n        \"\"\"\n        if inputs is None:\n            raise ValueError(\"async_encode_batch: `inputs` can't be `None`\")\n        # Exposed by the Rust bindings via pyo3_async_runtimes::tokio::future_into_py\n        return await self._tokenizer.async_encode_batch(inputs, is_pretokenized, add_special_tokens)\n\n    async def async_encode_batch_fast(\n        self,\n        inputs: List[EncodeInput],\n        is_pretokenized: bool = False,\n        add_special_tokens: bool = True,\n    ) -> List[Encoding]:\n        \"\"\"Asynchronously encode a batch (no character offsets, faster).\n\n        Args:\n            inputs: A list of single or pair sequences to encode.\n            is_pretokenized: Whether inputs are already pre-tokenized.\n            add_special_tokens: Whether to add special tokens.\n\n        Returns:\n            A list of Encoding.\n        \"\"\"\n        if inputs is None:\n            raise ValueError(\"async_encode_batch_fast: `inputs` can't be `None`\")\n        return await self._tokenizer.async_encode_batch_fast(inputs, is_pretokenized, add_special_tokens)\n\n    def decode(self, ids: List[int], skip_special_tokens: Optional[bool] = True) -> str:\n        \"\"\"Decode the given list of ids to a string sequence\n\n        Args:\n            ids: List[unsigned int]:\n                A list of ids to be decoded\n\n            skip_special_tokens: (`optional`) boolean:\n                Whether to remove all the special tokens from the output string\n\n        Returns:\n            The decoded string\n        \"\"\"\n        if ids is None:\n            raise ValueError(\"None input is not valid. Should be a list of integers.\")\n\n        return self._tokenizer.decode(ids, skip_special_tokens=skip_special_tokens)\n\n    def decode_batch(self, sequences: List[List[int]], skip_special_tokens: Optional[bool] = True) -> str:\n        \"\"\"Decode the list of sequences to a list of string sequences\n\n        Args:\n            sequences: List[List[unsigned int]]:\n                A list of sequence of ids to be decoded\n\n            skip_special_tokens: (`optional`) boolean:\n                Whether to remove all the special tokens from the output strings\n\n        Returns:\n            A list of decoded strings\n        \"\"\"\n        if sequences is None:\n            raise ValueError(\"None input is not valid. Should be list of list of integers.\")\n\n        return self._tokenizer.decode_batch(sequences, skip_special_tokens=skip_special_tokens)\n\n    def token_to_id(self, token: str) -> Optional[int]:\n        \"\"\"Convert the given token to its corresponding id\n\n        Args:\n            token: str:\n                The token to convert\n\n        Returns:\n            The corresponding id if it exists, None otherwise\n        \"\"\"\n        return self._tokenizer.token_to_id(token)\n\n    def id_to_token(self, id: int) -> Optional[str]:\n        \"\"\"Convert the given token id to its corresponding string\n\n        Args:\n            token: id:\n                The token id to convert\n\n        Returns:\n            The corresponding string if it exists, None otherwise\n        \"\"\"\n        return self._tokenizer.id_to_token(id)\n\n    def save_model(self, directory: str, prefix: Optional[str] = None):\n        \"\"\"Save the current model to the given directory\n\n        Args:\n            directory: str:\n                A path to the destination directory\n\n            prefix: (Optional) str:\n                An optional prefix, used to prefix each file name\n        \"\"\"\n        return self._tokenizer.model.save(directory, prefix=prefix)\n\n    def save(self, path: str, pretty: bool = True):\n        \"\"\"Save the current Tokenizer at the given path\n\n        Args:\n            path: str:\n                A path to the destination Tokenizer file\n        \"\"\"\n        return self._tokenizer.save(path, pretty)\n\n    def to_str(self, pretty: bool = False):\n        \"\"\"Get a serialized JSON version of the Tokenizer as a str\n\n        Args:\n            pretty: bool:\n                Whether the JSON string should be prettified\n\n        Returns:\n            str\n        \"\"\"\n        return self._tokenizer.to_str(pretty)\n\n    def post_process(\n        self, encoding: Encoding, pair: Optional[Encoding] = None, add_special_tokens: bool = True\n    ) -> Encoding:\n        \"\"\"Apply all the post-processing steps to the given encodings.\n\n        The various steps are:\n            1. Truncate according to global params (provided to `enable_truncation`)\n            2. Apply the PostProcessor\n            3. Pad according to global params. (provided to `enable_padding`)\n\n        Args:\n            encoding: Encoding:\n                The main Encoding to post process\n\n            pair: Optional[Encoding]:\n                An optional pair Encoding\n\n            add_special_tokens: bool:\n                Whether to add special tokens\n\n        Returns:\n            The resulting Encoding\n        \"\"\"\n        return self._tokenizer.post_process(encoding, pair, add_special_tokens)\n\n    @property\n    def model(self) -> Model:\n        return self._tokenizer.model\n\n    @model.setter\n    def model(self, model: Model):\n        self._tokenizer.model = model\n\n    @property\n    def normalizer(self) -> Normalizer:\n        return self._tokenizer.normalizer\n\n    @normalizer.setter\n    def normalizer(self, normalizer: Normalizer):\n        self._tokenizer.normalizer = normalizer\n\n    @property\n    def pre_tokenizer(self) -> PreTokenizer:\n        return self._tokenizer.pre_tokenizer\n\n    @pre_tokenizer.setter\n    def pre_tokenizer(self, pre_tokenizer: PreTokenizer):\n        self._tokenizer.pre_tokenizer = pre_tokenizer\n\n    @property\n    def post_processor(self) -> PostProcessor:\n        return self._tokenizer.post_processor\n\n    @post_processor.setter\n    def post_processor(self, post_processor: PostProcessor):\n        self._tokenizer.post_processor = post_processor\n\n    @property\n    def decoder(self) -> Decoder:\n        return self._tokenizer.decoder\n\n    @decoder.setter\n    def decoder(self, decoder: Decoder):\n        self._tokenizer.decoder = decoder\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/bert_wordpiece.py",
    "content": "from typing import Dict, Iterator, List, Optional, Union\n\nfrom tokenizers import AddedToken, Tokenizer, decoders, trainers\nfrom tokenizers.models import WordPiece\nfrom tokenizers.normalizers import BertNormalizer\nfrom tokenizers.pre_tokenizers import BertPreTokenizer\nfrom tokenizers.processors import BertProcessing\n\nfrom .base_tokenizer import BaseTokenizer\n\n\nclass BertWordPieceTokenizer(BaseTokenizer):\n    \"\"\"Bert WordPiece Tokenizer\"\"\"\n\n    def __init__(\n        self,\n        vocab: Optional[Union[str, Dict[str, int]]] = None,\n        unk_token: Union[str, AddedToken] = \"[UNK]\",\n        sep_token: Union[str, AddedToken] = \"[SEP]\",\n        cls_token: Union[str, AddedToken] = \"[CLS]\",\n        pad_token: Union[str, AddedToken] = \"[PAD]\",\n        mask_token: Union[str, AddedToken] = \"[MASK]\",\n        clean_text: bool = True,\n        handle_chinese_chars: bool = True,\n        strip_accents: Optional[bool] = None,\n        lowercase: bool = True,\n        wordpieces_prefix: str = \"##\",\n    ):\n        if vocab is not None:\n            tokenizer = Tokenizer(WordPiece(vocab, unk_token=str(unk_token)))\n        else:\n            tokenizer = Tokenizer(WordPiece(unk_token=str(unk_token)))\n\n        # Let the tokenizer know about special tokens if they are part of the vocab\n        if tokenizer.token_to_id(str(unk_token)) is not None:\n            tokenizer.add_special_tokens([str(unk_token)])\n        if tokenizer.token_to_id(str(sep_token)) is not None:\n            tokenizer.add_special_tokens([str(sep_token)])\n        if tokenizer.token_to_id(str(cls_token)) is not None:\n            tokenizer.add_special_tokens([str(cls_token)])\n        if tokenizer.token_to_id(str(pad_token)) is not None:\n            tokenizer.add_special_tokens([str(pad_token)])\n        if tokenizer.token_to_id(str(mask_token)) is not None:\n            tokenizer.add_special_tokens([str(mask_token)])\n\n        tokenizer.normalizer = BertNormalizer(\n            clean_text=clean_text,\n            handle_chinese_chars=handle_chinese_chars,\n            strip_accents=strip_accents,\n            lowercase=lowercase,\n        )\n        tokenizer.pre_tokenizer = BertPreTokenizer()\n\n        if vocab is not None:\n            sep_token_id = tokenizer.token_to_id(str(sep_token))\n            if sep_token_id is None:\n                raise TypeError(\"sep_token not found in the vocabulary\")\n            cls_token_id = tokenizer.token_to_id(str(cls_token))\n            if cls_token_id is None:\n                raise TypeError(\"cls_token not found in the vocabulary\")\n\n            tokenizer.post_processor = BertProcessing((str(sep_token), sep_token_id), (str(cls_token), cls_token_id))\n        tokenizer.decoder = decoders.WordPiece(prefix=wordpieces_prefix)\n\n        parameters = {\n            \"model\": \"BertWordPiece\",\n            \"unk_token\": unk_token,\n            \"sep_token\": sep_token,\n            \"cls_token\": cls_token,\n            \"pad_token\": pad_token,\n            \"mask_token\": mask_token,\n            \"clean_text\": clean_text,\n            \"handle_chinese_chars\": handle_chinese_chars,\n            \"strip_accents\": strip_accents,\n            \"lowercase\": lowercase,\n            \"wordpieces_prefix\": wordpieces_prefix,\n        }\n\n        super().__init__(tokenizer, parameters)\n\n    @staticmethod\n    def from_file(vocab: str, **kwargs):\n        vocab = WordPiece.read_file(vocab)\n        return BertWordPieceTokenizer(vocab, **kwargs)\n\n    def train(\n        self,\n        files: Union[str, List[str]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        limit_alphabet: int = 1000,\n        initial_alphabet: List[str] = [],\n        special_tokens: List[Union[str, AddedToken]] = [\n            \"[PAD]\",\n            \"[UNK]\",\n            \"[CLS]\",\n            \"[SEP]\",\n            \"[MASK]\",\n        ],\n        show_progress: bool = True,\n        wordpieces_prefix: str = \"##\",\n    ):\n        \"\"\"Train the model using the given files\"\"\"\n\n        trainer = trainers.WordPieceTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            limit_alphabet=limit_alphabet,\n            initial_alphabet=initial_alphabet,\n            special_tokens=special_tokens,\n            show_progress=show_progress,\n            continuing_subword_prefix=wordpieces_prefix,\n        )\n        if isinstance(files, str):\n            files = [files]\n        self._tokenizer.train(files, trainer=trainer)\n\n    def train_from_iterator(\n        self,\n        iterator: Union[Iterator[str], Iterator[Iterator[str]]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        limit_alphabet: int = 1000,\n        initial_alphabet: List[str] = [],\n        special_tokens: List[Union[str, AddedToken]] = [\n            \"[PAD]\",\n            \"[UNK]\",\n            \"[CLS]\",\n            \"[SEP]\",\n            \"[MASK]\",\n        ],\n        show_progress: bool = True,\n        wordpieces_prefix: str = \"##\",\n        length: Optional[int] = None,\n    ):\n        \"\"\"Train the model using the given iterator\"\"\"\n\n        trainer = trainers.WordPieceTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            limit_alphabet=limit_alphabet,\n            initial_alphabet=initial_alphabet,\n            special_tokens=special_tokens,\n            show_progress=show_progress,\n            continuing_subword_prefix=wordpieces_prefix,\n        )\n        self._tokenizer.train_from_iterator(\n            iterator,\n            trainer=trainer,\n            length=length,\n        )\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/byte_level_bpe.py",
    "content": "from typing import Dict, Iterator, List, Optional, Tuple, Union\n\nfrom tokenizers import AddedToken, Tokenizer, decoders, pre_tokenizers, processors, trainers\nfrom tokenizers.models import BPE\nfrom tokenizers.normalizers import Lowercase, Sequence, unicode_normalizer_from_str\n\nfrom .base_tokenizer import BaseTokenizer\n\n\nclass ByteLevelBPETokenizer(BaseTokenizer):\n    \"\"\"ByteLevelBPETokenizer\n\n    Represents a Byte-level BPE as introduced by OpenAI with their GPT-2 model\n    \"\"\"\n\n    def __init__(\n        self,\n        vocab: Optional[Union[str, Dict[str, int]]] = None,\n        merges: Optional[Union[str, List[Tuple[str, str]]]] = None,\n        add_prefix_space: bool = False,\n        lowercase: bool = False,\n        dropout: Optional[float] = None,\n        unicode_normalizer: Optional[str] = None,\n        continuing_subword_prefix: Optional[str] = None,\n        end_of_word_suffix: Optional[str] = None,\n        trim_offsets: bool = False,\n    ):\n        if vocab is not None and merges is not None:\n            tokenizer = Tokenizer(\n                BPE(\n                    vocab,\n                    merges,\n                    dropout=dropout,\n                    continuing_subword_prefix=continuing_subword_prefix or \"\",\n                    end_of_word_suffix=end_of_word_suffix or \"\",\n                )\n            )\n        else:\n            tokenizer = Tokenizer(BPE())\n\n        # Check for Unicode normalization first (before everything else)\n        normalizers = []\n\n        if unicode_normalizer:\n            normalizers += [unicode_normalizer_from_str(unicode_normalizer)]\n\n        if lowercase:\n            normalizers += [Lowercase()]\n\n        # Create the normalizer structure\n        if len(normalizers) > 0:\n            if len(normalizers) > 1:\n                tokenizer.normalizer = Sequence(normalizers)\n            else:\n                tokenizer.normalizer = normalizers[0]\n\n        tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=add_prefix_space)\n        tokenizer.decoder = decoders.ByteLevel()\n        tokenizer.post_processor = processors.ByteLevel(trim_offsets=trim_offsets)\n\n        parameters = {\n            \"model\": \"ByteLevelBPE\",\n            \"add_prefix_space\": add_prefix_space,\n            \"lowercase\": lowercase,\n            \"dropout\": dropout,\n            \"unicode_normalizer\": unicode_normalizer,\n            \"continuing_subword_prefix\": continuing_subword_prefix,\n            \"end_of_word_suffix\": end_of_word_suffix,\n            \"trim_offsets\": trim_offsets,\n        }\n\n        super().__init__(tokenizer, parameters)\n\n    @staticmethod\n    def from_file(vocab_filename: str, merges_filename: str, **kwargs):\n        vocab, merges = BPE.read_file(vocab_filename, merges_filename)\n        return ByteLevelBPETokenizer(vocab, merges, **kwargs)\n\n    def train(\n        self,\n        files: Union[str, List[str]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        show_progress: bool = True,\n        special_tokens: List[Union[str, AddedToken]] = [],\n    ):\n        \"\"\"Train the model using the given files\"\"\"\n\n        trainer = trainers.BpeTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            show_progress=show_progress,\n            special_tokens=special_tokens,\n            initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),\n        )\n        if isinstance(files, str):\n            files = [files]\n        self._tokenizer.train(files, trainer=trainer)\n\n    def train_from_iterator(\n        self,\n        iterator: Union[Iterator[str], Iterator[Iterator[str]]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        show_progress: bool = True,\n        special_tokens: List[Union[str, AddedToken]] = [],\n        length: Optional[int] = None,\n    ):\n        \"\"\"Train the model using the given iterator\"\"\"\n\n        trainer = trainers.BpeTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            show_progress=show_progress,\n            special_tokens=special_tokens,\n            initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),\n        )\n        self._tokenizer.train_from_iterator(\n            iterator,\n            trainer=trainer,\n            length=length,\n        )\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/char_level_bpe.py",
    "content": "from typing import Dict, Iterator, List, Optional, Tuple, Union\n\nfrom .. import AddedToken, Tokenizer, decoders, pre_tokenizers, trainers\nfrom ..models import BPE\nfrom ..normalizers import BertNormalizer, Lowercase, Sequence, unicode_normalizer_from_str\nfrom .base_tokenizer import BaseTokenizer\n\n\nclass CharBPETokenizer(BaseTokenizer):\n    \"\"\"Original BPE Tokenizer\n\n    Represents the BPE algorithm, as introduced by Rico Sennrich\n    (https://arxiv.org/abs/1508.07909)\n\n    The defaults settings corresponds to OpenAI GPT BPE tokenizers and differs from the original\n    Sennrich subword-nmt implementation by the following options that you can deactivate:\n        - adding a normalizer to clean up the text (deactivate with `bert_normalizer=False`) by:\n            * removing any control characters and replacing all whitespaces by the classic one.\n            * handle chinese chars by putting spaces around them.\n            * strip all accents.\n        - spitting on punctuation in addition to whitespaces (deactivate it with\n          `split_on_whitespace_only=True`)\n    \"\"\"\n\n    def __init__(\n        self,\n        vocab: Optional[Union[str, Dict[str, int]]] = None,\n        merges: Optional[Union[str, List[Tuple[str, str]]]] = None,\n        unk_token: Union[str, AddedToken] = \"<unk>\",\n        suffix: str = \"</w>\",\n        dropout: Optional[float] = None,\n        lowercase: bool = False,\n        unicode_normalizer: Optional[str] = None,\n        bert_normalizer: bool = True,\n        split_on_whitespace_only: bool = False,\n    ):\n        if vocab is not None and merges is not None:\n            tokenizer = Tokenizer(\n                BPE(\n                    vocab,\n                    merges,\n                    dropout=dropout,\n                    unk_token=str(unk_token),\n                    end_of_word_suffix=suffix,\n                )\n            )\n        else:\n            tokenizer = Tokenizer(BPE(unk_token=str(unk_token), dropout=dropout, end_of_word_suffix=suffix))\n\n        if tokenizer.token_to_id(str(unk_token)) is not None:\n            tokenizer.add_special_tokens([str(unk_token)])\n\n        # Check for Unicode normalization first (before everything else)\n        normalizers = []\n\n        if unicode_normalizer:\n            normalizers += [unicode_normalizer_from_str(unicode_normalizer)]\n\n        if bert_normalizer:\n            normalizers += [BertNormalizer(lowercase=False)]\n\n        if lowercase:\n            normalizers += [Lowercase()]\n\n        # Create the normalizer structure\n        if len(normalizers) > 0:\n            if len(normalizers) > 1:\n                tokenizer.normalizer = Sequence(normalizers)\n            else:\n                tokenizer.normalizer = normalizers[0]\n\n        if split_on_whitespace_only:\n            tokenizer.pre_tokenizer = pre_tokenizers.WhitespaceSplit()\n        else:\n            tokenizer.pre_tokenizer = pre_tokenizers.BertPreTokenizer()\n\n        tokenizer.decoder = decoders.BPEDecoder(suffix=suffix)\n\n        parameters = {\n            \"model\": \"BPE\",\n            \"unk_token\": unk_token,\n            \"suffix\": suffix,\n            \"dropout\": dropout,\n            \"lowercase\": lowercase,\n            \"unicode_normalizer\": unicode_normalizer,\n            \"bert_normalizer\": bert_normalizer,\n            \"split_on_whitespace_only\": split_on_whitespace_only,\n        }\n\n        super().__init__(tokenizer, parameters)\n\n    @staticmethod\n    def from_file(vocab_filename: str, merges_filename: str, **kwargs):\n        vocab, merges = BPE.read_file(vocab_filename, merges_filename)\n        return CharBPETokenizer(vocab, merges, **kwargs)\n\n    def train(\n        self,\n        files: Union[str, List[str]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        special_tokens: List[Union[str, AddedToken]] = [\"<unk>\"],\n        limit_alphabet: int = 1000,\n        initial_alphabet: List[str] = [],\n        suffix: Optional[str] = \"</w>\",\n        show_progress: bool = True,\n    ):\n        \"\"\"Train the model using the given files\"\"\"\n\n        trainer = trainers.BpeTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            special_tokens=special_tokens,\n            limit_alphabet=limit_alphabet,\n            initial_alphabet=initial_alphabet,\n            end_of_word_suffix=suffix,\n            show_progress=show_progress,\n        )\n        if isinstance(files, str):\n            files = [files]\n        self._tokenizer.train(files, trainer=trainer)\n\n    def train_from_iterator(\n        self,\n        iterator: Union[Iterator[str], Iterator[Iterator[str]]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        special_tokens: List[Union[str, AddedToken]] = [\"<unk>\"],\n        limit_alphabet: int = 1000,\n        initial_alphabet: List[str] = [],\n        suffix: Optional[str] = \"</w>\",\n        show_progress: bool = True,\n        length: Optional[int] = None,\n    ):\n        \"\"\"Train the model using the given iterator\"\"\"\n\n        trainer = trainers.BpeTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            special_tokens=special_tokens,\n            limit_alphabet=limit_alphabet,\n            initial_alphabet=initial_alphabet,\n            end_of_word_suffix=suffix,\n            show_progress=show_progress,\n        )\n        self._tokenizer.train_from_iterator(\n            iterator,\n            trainer=trainer,\n            length=length,\n        )\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/sentencepiece_bpe.py",
    "content": "from typing import Dict, Iterator, List, Optional, Tuple, Union\n\nfrom tokenizers import AddedToken, Tokenizer, decoders, pre_tokenizers, trainers\nfrom tokenizers.models import BPE\nfrom tokenizers.normalizers import NFKC\n\nfrom .base_tokenizer import BaseTokenizer\n\n\nclass SentencePieceBPETokenizer(BaseTokenizer):\n    \"\"\"SentencePiece BPE Tokenizer\n\n    Represents the BPE algorithm, with the pretokenization used by SentencePiece\n    \"\"\"\n\n    def __init__(\n        self,\n        vocab: Optional[Union[str, Dict[str, int]]] = None,\n        merges: Optional[Union[str, List[Tuple[str, str]]]] = None,\n        unk_token: Union[str, AddedToken] = \"<unk>\",\n        replacement: str = \"▁\",\n        add_prefix_space: bool = True,\n        dropout: Optional[float] = None,\n        fuse_unk: Optional[bool] = False,\n    ):\n        if vocab is not None and merges is not None:\n            tokenizer = Tokenizer(BPE(vocab, merges, dropout=dropout, unk_token=unk_token, fuse_unk=fuse_unk))\n        else:\n            tokenizer = Tokenizer(BPE(dropout=dropout, unk_token=unk_token, fuse_unk=fuse_unk))\n\n        if tokenizer.token_to_id(str(unk_token)) is not None:\n            tokenizer.add_special_tokens([str(unk_token)])\n\n        tokenizer.normalizer = NFKC()\n        prepend_scheme = \"always\" if add_prefix_space else \"never\"\n        tokenizer.pre_tokenizer = pre_tokenizers.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n        tokenizer.decoder = decoders.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n\n        parameters = {\n            \"model\": \"SentencePieceBPE\",\n            \"unk_token\": unk_token,\n            \"replacement\": replacement,\n            \"add_prefix_space\": add_prefix_space,\n            \"dropout\": dropout,\n        }\n\n        super().__init__(tokenizer, parameters)\n\n    @staticmethod\n    def from_file(vocab_filename: str, merges_filename: str, **kwargs):\n        vocab, merges = BPE.read_file(vocab_filename, merges_filename)\n        return SentencePieceBPETokenizer(vocab, merges, **kwargs)\n\n    def train(\n        self,\n        files: Union[str, List[str]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        special_tokens: List[Union[str, AddedToken]] = [\"<unk>\"],\n        limit_alphabet: int = 1000,\n        initial_alphabet: List[str] = [],\n        show_progress: bool = True,\n    ):\n        \"\"\"Train the model using the given files\"\"\"\n\n        trainer = trainers.BpeTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            special_tokens=special_tokens,\n            limit_alphabet=limit_alphabet,\n            initial_alphabet=initial_alphabet,\n            show_progress=show_progress,\n        )\n        if isinstance(files, str):\n            files = [files]\n        self._tokenizer.train(files, trainer=trainer)\n\n    def train_from_iterator(\n        self,\n        iterator: Union[Iterator[str], Iterator[Iterator[str]]],\n        vocab_size: int = 30000,\n        min_frequency: int = 2,\n        special_tokens: List[Union[str, AddedToken]] = [\"<unk>\"],\n        limit_alphabet: int = 1000,\n        initial_alphabet: List[str] = [],\n        show_progress: bool = True,\n        length: Optional[int] = None,\n    ):\n        \"\"\"Train the model using the given iterator\"\"\"\n\n        trainer = trainers.BpeTrainer(\n            vocab_size=vocab_size,\n            min_frequency=min_frequency,\n            special_tokens=special_tokens,\n            limit_alphabet=limit_alphabet,\n            initial_alphabet=initial_alphabet,\n            show_progress=show_progress,\n        )\n        self._tokenizer.train_from_iterator(\n            iterator,\n            trainer=trainer,\n            length=length,\n        )\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/implementations/sentencepiece_unigram.py",
    "content": "import json\nimport os\nfrom typing import Iterator, List, Optional, Union, Tuple\n\nfrom tokenizers import AddedToken, Regex, Tokenizer, decoders, normalizers, pre_tokenizers, trainers\nfrom tokenizers.models import Unigram\n\nfrom .base_tokenizer import BaseTokenizer\n\n\nclass SentencePieceUnigramTokenizer(BaseTokenizer):\n    \"\"\"SentencePiece Unigram Tokenizer\n\n    Represents the Unigram algorithm, with the pretokenization used by SentencePiece\n    \"\"\"\n\n    def __init__(\n        self,\n        vocab: Optional[List[Tuple[str, float]]] = None,\n        replacement: str = \"▁\",\n        add_prefix_space: bool = True,\n    ):\n        if vocab is not None:\n            # Let Unigram(..) fail if only one of them is None\n            tokenizer = Tokenizer(Unigram(vocab))\n        else:\n            tokenizer = Tokenizer(Unigram())\n\n        tokenizer.normalizer = normalizers.Sequence(\n            [normalizers.Nmt(), normalizers.NFKC(), normalizers.Replace(Regex(\" {2,}\"), \" \")]\n        )\n        prepend_scheme = \"always\" if add_prefix_space else \"never\"\n        tokenizer.pre_tokenizer = pre_tokenizers.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n        tokenizer.decoder = decoders.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n\n        parameters = {\n            \"model\": \"SentencePieceUnigram\",\n            \"replacement\": replacement,\n            \"add_prefix_space\": add_prefix_space,\n        }\n\n        super().__init__(tokenizer, parameters)\n\n    def train(\n        self,\n        files: Union[str, List[str]],\n        vocab_size: int = 8000,\n        show_progress: bool = True,\n        special_tokens: Optional[List[Union[str, AddedToken]]] = None,\n        initial_alphabet: Optional[List[str]] = None,\n        unk_token: Optional[str] = None,\n    ):\n        \"\"\"\n        Train the model using the given files\n\n        Args:\n            files (:obj:`List[str]`):\n                A list of path to the files that we should use for training\n            vocab_size (:obj:`int`):\n                The size of the final vocabulary, including all tokens and alphabet.\n            show_progress (:obj:`bool`):\n                Whether to show progress bars while training.\n            special_tokens (:obj:`List[Union[str, AddedToken]]`, `optional`):\n                A list of special tokens the model should know of.\n            initial_alphabet (:obj:`List[str]`, `optional`):\n                A list of characters to include in the initial alphabet, even\n                if not seen in the training dataset.\n                If the strings contain more than one character, only the first one\n                is kept.\n            unk_token (:obj:`str`, `optional`):\n                The unknown token to be used by the model.\n        \"\"\"\n\n        if special_tokens is None:\n            special_tokens = []\n\n        if initial_alphabet is None:\n            initial_alphabet = []\n\n        trainer = trainers.UnigramTrainer(\n            vocab_size=vocab_size,\n            special_tokens=special_tokens,\n            show_progress=show_progress,\n            initial_alphabet=initial_alphabet,\n            unk_token=unk_token,\n        )\n\n        if isinstance(files, str):\n            files = [files]\n        self._tokenizer.train(files, trainer=trainer)\n\n    def train_from_iterator(\n        self,\n        iterator: Union[Iterator[str], Iterator[Iterator[str]]],\n        vocab_size: int = 8000,\n        show_progress: bool = True,\n        special_tokens: Optional[List[Union[str, AddedToken]]] = None,\n        initial_alphabet: Optional[List[str]] = None,\n        unk_token: Optional[str] = None,\n        length: Optional[int] = None,\n    ):\n        \"\"\"\n        Train the model using the given iterator\n\n        Args:\n            iterator (:obj:`Union[Iterator[str], Iterator[Iterator[str]]]`):\n                Any iterator over strings or list of strings\n            vocab_size (:obj:`int`):\n                The size of the final vocabulary, including all tokens and alphabet.\n            show_progress (:obj:`bool`):\n                Whether to show progress bars while training.\n            special_tokens (:obj:`List[Union[str, AddedToken]]`, `optional`):\n                A list of special tokens the model should know of.\n            initial_alphabet (:obj:`List[str]`, `optional`):\n                A list of characters to include in the initial alphabet, even\n                if not seen in the training dataset.\n                If the strings contain more than one character, only the first one\n                is kept.\n            unk_token (:obj:`str`, `optional`):\n                The unknown token to be used by the model.\n            length (:obj:`int`, `optional`):\n                The total number of sequences in the iterator. This is used to\n                provide meaningful progress tracking\n        \"\"\"\n\n        if special_tokens is None:\n            special_tokens = []\n\n        if initial_alphabet is None:\n            initial_alphabet = []\n\n        trainer = trainers.UnigramTrainer(\n            vocab_size=vocab_size,\n            special_tokens=special_tokens,\n            show_progress=show_progress,\n            initial_alphabet=initial_alphabet,\n            unk_token=unk_token,\n        )\n\n        self._tokenizer.train_from_iterator(\n            iterator,\n            trainer=trainer,\n            length=length,\n        )\n\n    @staticmethod\n    def from_spm(filename: str):\n        try:\n            import sys\n\n            sys.path.append(\".\")\n\n            import sentencepiece_model_pb2 as model  # type: ignore[import]\n        except Exception:\n            raise Exception(\n                \"You don't seem to have the required protobuf file, in order to use this function you need to run `pip install protobuf` and `wget https://raw.githubusercontent.com/google/sentencepiece/master/python/src/sentencepiece/sentencepiece_model_pb2.py` for us to be able to read the intrinsics of your spm_file. `pip install sentencepiece` is not required.\"\n            )\n\n        m = model.ModelProto()\n        m.ParseFromString(open(filename, \"rb\").read())\n\n        precompiled_charsmap = m.normalizer_spec.precompiled_charsmap\n        vocab = [(piece.piece, piece.score) for piece in m.pieces]\n        unk_id = m.trainer_spec.unk_id\n        model_type = m.trainer_spec.model_type\n        byte_fallback = m.trainer_spec.byte_fallback\n        if model_type != 1:\n            raise Exception(\n                \"You're trying to run a `Unigram` model but you're file was trained with a different algorithm\"\n            )\n\n        replacement = \"▁\"\n        add_prefix_space = True\n\n        tokenizer = Tokenizer(Unigram(vocab, unk_id, byte_fallback))\n\n        if precompiled_charsmap:\n            tokenizer.normalizer = normalizers.Sequence(\n                [\n                    normalizers.Precompiled(precompiled_charsmap),\n                    normalizers.Replace(Regex(\" {2,}\"), \" \"),\n                ]\n            )\n        else:\n            tokenizer.normalizer = normalizers.Sequence([normalizers.Replace(Regex(\" {2,}\"), \" \")])\n        prepend_scheme = \"always\" if add_prefix_space else \"never\"\n        tokenizer.pre_tokenizer = pre_tokenizers.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n        tokenizer.decoder = decoders.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n\n        parameters = {\n            \"model\": \"SentencePieceUnigram\",\n        }\n\n        obj = BaseTokenizer.__new__(SentencePieceUnigramTokenizer, tokenizer, parameters)  # type: ignore[arg-type]\n        BaseTokenizer.__init__(obj, tokenizer, parameters)\n        return obj\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/models/__init__.py",
    "content": "# Generated content DO NOT EDIT\n\nfrom .. import models\n\nBPE = models.BPE\nModel = models.Model\nUnigram = models.Unigram\nWordLevel = models.WordLevel\nWordPiece = models.WordPiece\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/models.pyi",
    "content": "import typing\n\nclass BPE:\n    def __new__(\n        cls, /, vocab: typing.Any | str | None = None, merges: typing.Any | str | None = None, **kwargs\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def _clear_cache(self, /) -> None:\n        \"\"\"Clears the internal cache\"\"\"\n        ...\n    def _resize_cache(self, /, capacity: int) -> None:\n        \"\"\"Resize the internal cache\"\"\"\n        ...\n    @property\n    def byte_fallback(self, /) -> bool: ...\n    @byte_fallback.setter\n    def byte_fallback(self, /, byte_fallback: bool) -> None: ...\n    @property\n    def continuing_subword_prefix(self, /) -> typing.Any: ...\n    @continuing_subword_prefix.setter\n    def continuing_subword_prefix(self, /, continuing_subword_prefix: str | None) -> None: ...\n    @property\n    def dropout(self, /) -> typing.Any: ...\n    @dropout.setter\n    def dropout(self, /, dropout: float | None) -> None: ...\n    @property\n    def end_of_word_suffix(self, /) -> typing.Any: ...\n    @end_of_word_suffix.setter\n    def end_of_word_suffix(self, /, end_of_word_suffix: str | None) -> None: ...\n    @classmethod\n    def from_file(cls, /, vocab: str, merges: str, **kwargs) -> BPE:\n        \"\"\"\n        Instantiate a BPE model from the given files.\n\n        This method is roughly equivalent to doing::\n\n           vocab, merges = BPE.read_file(vocab_filename, merges_filename)\n           bpe = BPE(vocab, merges)\n\n        If you don't need to keep the :obj:`vocab, merges` values lying around,\n        this method is more optimized than manually calling\n        :meth:`~tokenizers.models.BPE.read_file` to initialize a :class:`~tokenizers.models.BPE`\n\n        Args:\n            vocab (:obj:`str`):\n                The path to a :obj:`vocab.json` file\n\n            merges (:obj:`str`):\n                The path to a :obj:`merges.txt` file\n\n        Returns:\n            :class:`~tokenizers.models.BPE`: An instance of BPE loaded from these files\n        \"\"\"\n        ...\n    @property\n    def fuse_unk(self, /) -> bool: ...\n    @fuse_unk.setter\n    def fuse_unk(self, /, fuse_unk: bool) -> None: ...\n    @property\n    def ignore_merges(self, /) -> bool: ...\n    @ignore_merges.setter\n    def ignore_merges(self, /, ignore_merges: bool) -> None: ...\n    @staticmethod\n    def read_file(vocab: str, merges: str) -> typing.Any:\n        \"\"\"\n        Read a :obj:`vocab.json` and a :obj:`merges.txt` files\n\n        This method provides a way to read and parse the content of these files,\n        returning the relevant data structures. If you want to instantiate some BPE models\n        from memory, this method gives you the expected input from the standard files.\n\n        Args:\n            vocab (:obj:`str`):\n                The path to a :obj:`vocab.json` file\n\n            merges (:obj:`str`):\n                The path to a :obj:`merges.txt` file\n\n        Returns:\n            A :obj:`Tuple` with the vocab and the merges:\n                The vocabulary and merges loaded into memory\n        \"\"\"\n        ...\n    @property\n    def unk_token(self, /) -> typing.Any: ...\n    @unk_token.setter\n    def unk_token(self, /, unk_token: str | None) -> None: ...\n\nclass Model:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __new__(cls, /) -> Model:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    def get_trainer(self, /) -> typing.Any:\n        \"\"\"\n        Get the associated :class:`~tokenizers.trainers.Trainer`\n\n        Retrieve the :class:`~tokenizers.trainers.Trainer` associated to this\n        :class:`~tokenizers.models.Model`.\n\n        Returns:\n            :class:`~tokenizers.trainers.Trainer`: The Trainer used to train this model\n        \"\"\"\n        ...\n    def id_to_token(self, /, id: int) -> typing.Any:\n        \"\"\"\n        Get the token associated to an ID\n\n        Args:\n            id (:obj:`int`):\n                An ID to convert to a token\n\n        Returns:\n            :obj:`str`: The token associated to the ID\n        \"\"\"\n        ...\n    def save(self, /, folder: str, prefix: str | None = None, name: str | None = None) -> list[str]:\n        \"\"\"\n        Save the current model\n\n        Save the current model in the given folder, using the given prefix for the various\n        files that will get created.\n        Any file with the same name that already exists in this folder will be overwritten.\n\n        Args:\n            folder (:obj:`str`):\n                The path to the target folder in which to save the various files\n\n            prefix (:obj:`str`, `optional`):\n                An optional prefix, used to prefix each file name\n\n        Returns:\n            :obj:`List[str]`: The list of saved files\n        \"\"\"\n        ...\n    def token_to_id(self, /, token: str) -> typing.Any:\n        \"\"\"\n        Get the ID associated to a token\n\n        Args:\n            token (:obj:`str`):\n                A token to convert to an ID\n\n        Returns:\n            :obj:`int`: The ID associated to the token\n        \"\"\"\n        ...\n    def tokenize(self, /, sequence: str) -> typing.Any:\n        \"\"\"\n        Tokenize a sequence\n\n        Args:\n            sequence (:obj:`str`):\n                A sequence to tokenize\n\n        Returns:\n            A :obj:`List` of :class:`~tokenizers.Token`: The generated tokens\n        \"\"\"\n        ...\n\nclass Unigram:\n    def __new__(\n        cls, /, vocab: typing.Any | None = None, unk_id: int | None = None, byte_fallback: bool | None = None\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def _clear_cache(self, /) -> None:\n        \"\"\"Clears the internal cache\"\"\"\n        ...\n    def _resize_cache(self, /, capacity: int) -> None:\n        \"\"\"Resize the internal cache\"\"\"\n        ...\n\nclass WordLevel:\n    def __new__(cls, /, vocab: typing.Any | str | None = None, unk_token: str | None = None) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @classmethod\n    def from_file(cls, /, vocab: str, unk_token: str | None = None) -> WordLevel:\n        \"\"\"\n        Instantiate a WordLevel model from the given file\n\n        This method is roughly equivalent to doing::\n\n            vocab = WordLevel.read_file(vocab_filename)\n            wordlevel = WordLevel(vocab)\n\n        If you don't need to keep the :obj:`vocab` values lying around, this method is\n        more optimized than manually calling :meth:`~tokenizers.models.WordLevel.read_file` to\n        initialize a :class:`~tokenizers.models.WordLevel`\n\n        Args:\n            vocab (:obj:`str`):\n                The path to a :obj:`vocab.json` file\n\n        Returns:\n            :class:`~tokenizers.models.WordLevel`: An instance of WordLevel loaded from file\n        \"\"\"\n        ...\n    @staticmethod\n    def read_file(vocab: str) -> typing.Any:\n        \"\"\"\n        Read a :obj:`vocab.json`\n\n        This method provides a way to read and parse the content of a vocabulary file,\n        returning the relevant data structures. If you want to instantiate some WordLevel models\n        from memory, this method gives you the expected input from the standard files.\n\n        Args:\n            vocab (:obj:`str`):\n                The path to a :obj:`vocab.json` file\n\n        Returns:\n            :obj:`Dict[str, int]`: The vocabulary as a :obj:`dict`\n        \"\"\"\n        ...\n    @property\n    def unk_token(self, /) -> str: ...\n    @unk_token.setter\n    def unk_token(self, /, unk_token: str) -> None: ...\n\nclass WordPiece:\n    def __new__(cls, /, vocab: typing.Any | str | None = None, **kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def continuing_subword_prefix(self, /) -> str: ...\n    @continuing_subword_prefix.setter\n    def continuing_subword_prefix(self, /, continuing_subword_prefix: str) -> None: ...\n    @classmethod\n    def from_file(cls, /, vocab: str, **kwargs) -> WordPiece:\n        \"\"\"\n        Instantiate a WordPiece model from the given file\n\n        This method is roughly equivalent to doing::\n\n            vocab = WordPiece.read_file(vocab_filename)\n            wordpiece = WordPiece(vocab)\n\n        If you don't need to keep the :obj:`vocab` values lying around, this method is\n        more optimized than manually calling :meth:`~tokenizers.models.WordPiece.read_file` to\n        initialize a :class:`~tokenizers.models.WordPiece`\n\n        Args:\n            vocab (:obj:`str`):\n                The path to a :obj:`vocab.txt` file\n\n        Returns:\n            :class:`~tokenizers.models.WordPiece`: An instance of WordPiece loaded from file\n        \"\"\"\n        ...\n    @property\n    def max_input_chars_per_word(self, /) -> int: ...\n    @max_input_chars_per_word.setter\n    def max_input_chars_per_word(self, /, max: int) -> None: ...\n    @staticmethod\n    def read_file(vocab: str) -> typing.Any:\n        \"\"\"\n        Read a :obj:`vocab.txt` file\n\n        This method provides a way to read and parse the content of a standard `vocab.txt`\n        file as used by the WordPiece Model, returning the relevant data structures. If you\n        want to instantiate some WordPiece models from memory, this method gives you the\n        expected input from the standard files.\n\n        Args:\n            vocab (:obj:`str`):\n                The path to a :obj:`vocab.txt` file\n\n        Returns:\n            :obj:`Dict[str, int]`: The vocabulary as a :obj:`dict`\n        \"\"\"\n        ...\n    @property\n    def unk_token(self, /) -> str: ...\n    @unk_token.setter\n    def unk_token(self, /, unk_token: str) -> None: ...\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/normalizers/__init__.py",
    "content": "from .. import normalizers\n\n\nNormalizer = normalizers.Normalizer\nBertNormalizer = normalizers.BertNormalizer\nNFD = normalizers.NFD\nNFKD = normalizers.NFKD\nNFC = normalizers.NFC\nNFKC = normalizers.NFKC\nSequence = normalizers.Sequence\nLowercase = normalizers.Lowercase\nPrepend = normalizers.Prepend\nStrip = normalizers.Strip\nStripAccents = normalizers.StripAccents\nNmt = normalizers.Nmt\nPrecompiled = normalizers.Precompiled\nReplace = normalizers.Replace\nByteLevel = normalizers.ByteLevel\n\nNORMALIZERS = {\"nfc\": NFC, \"nfd\": NFD, \"nfkc\": NFKC, \"nfkd\": NFKD}\n\n\ndef unicode_normalizer_from_str(normalizer: str) -> Normalizer:\n    if normalizer not in NORMALIZERS:\n        raise ValueError(\n            \"{} is not a known unicode normalizer. Available are {}\".format(normalizer, NORMALIZERS.keys())\n        )\n\n    return NORMALIZERS[normalizer]()\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/normalizers.pyi",
    "content": "import tokenizers\nimport tokenizers.normalizers\nimport typing\n\nclass BertNormalizer:\n    def __new__(\n        cls,\n        /,\n        clean_text: bool = True,\n        handle_chinese_chars: bool = True,\n        strip_accents: bool | None = None,\n        lowercase: bool = True,\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def clean_text(self, /) -> bool: ...\n    @clean_text.setter\n    def clean_text(self, /, clean_text: bool) -> None: ...\n    @property\n    def handle_chinese_chars(self, /) -> bool: ...\n    @handle_chinese_chars.setter\n    def handle_chinese_chars(self, /, handle_chinese_chars: bool) -> None: ...\n    @property\n    def lowercase(self, /) -> bool: ...\n    @lowercase.setter\n    def lowercase(self, /, lowercase: bool) -> None: ...\n    @property\n    def strip_accents(self, /) -> typing.Any: ...\n    @strip_accents.setter\n    def strip_accents(self, /, strip_accents: bool | None) -> None: ...\n\nclass ByteLevel:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Lowercase:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass NFC:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass NFD:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass NFKC:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass NFKD:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Nmt:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Normalizer:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    @staticmethod\n    def custom(obj: typing.Any) -> tokenizers.normalizers.Normalizer: ...\n    def normalize(self, /, normalized: tokenizers.NormalizedString | tokenizers.NormalizedStringRefMut) -> typing.Any:\n        \"\"\"\n        Normalize a :class:`~tokenizers.NormalizedString` in-place\n\n        This method allows to modify a :class:`~tokenizers.NormalizedString` to\n        keep track of the alignment information. If you just want to see the result\n        of the normalization on a raw string, you can use\n        :meth:`~tokenizers.normalizers.Normalizer.normalize_str`\n\n        Args:\n            normalized (:class:`~tokenizers.NormalizedString`):\n                The normalized string on which to apply this\n                :class:`~tokenizers.normalizers.Normalizer`\n        \"\"\"\n        ...\n    def normalize_str(self, /, sequence: str) -> str:\n        \"\"\"\n        Normalize the given string\n\n        This method provides a way to visualize the effect of a\n        :class:`~tokenizers.normalizers.Normalizer` but it does not keep track of the alignment\n        information. If you need to get/convert offsets, you can use\n        :meth:`~tokenizers.normalizers.Normalizer.normalize`\n\n        Args:\n            sequence (:obj:`str`):\n                A string to normalize\n\n        Returns:\n            :obj:`str`: A string after normalization\n        \"\"\"\n        ...\n\nclass Precompiled:\n    def __new__(cls, /, precompiled_charsmap: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Prepend:\n    def __new__(cls, /, prepend: str = ...) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def prepend(self, /) -> str: ...\n    @prepend.setter\n    def prepend(self, /, prepend: str) -> None: ...\n\nclass Replace:\n    def __new__(cls, /, pattern: str | tokenizers.Regex, content: str) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def content(self, /) -> str: ...\n    @content.setter\n    def content(self, /, content: str) -> None: ...\n    @property\n    def pattern(self, /) -> typing.Any: ...\n    @pattern.setter\n    def pattern(self, /, _pattern: str | tokenizers.Regex) -> typing.Any: ...\n\nclass Sequence:\n    def __getitem__(self, /, index: int) -> typing.Any:\n        \"\"\"Return self[key].\"\"\"\n        ...\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __len__(self, /) -> int:\n        \"\"\"Return len(self).\"\"\"\n        ...\n    def __new__(cls, /, normalizers: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __setitem__(self, /, index: int, value: typing.Any) -> typing.Any:\n        \"\"\"Set self[key] to value.\"\"\"\n        ...\n\nclass Strip:\n    def __new__(cls, /, left: bool = True, right: bool = True) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def left(self, /) -> bool: ...\n    @left.setter\n    def left(self, /, left: bool) -> None: ...\n    @property\n    def right(self, /) -> bool: ...\n    @right.setter\n    def right(self, /, right: bool) -> None: ...\n\nclass StripAccents:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/pre_tokenizers/__init__.py",
    "content": "# Generated content DO NOT EDIT\n\nfrom .. import pre_tokenizers\n\nBertPreTokenizer = pre_tokenizers.BertPreTokenizer\nByteLevel = pre_tokenizers.ByteLevel\nCharDelimiterSplit = pre_tokenizers.CharDelimiterSplit\nDigits = pre_tokenizers.Digits\nFixedLength = pre_tokenizers.FixedLength\nMetaspace = pre_tokenizers.Metaspace\nPreTokenizer = pre_tokenizers.PreTokenizer\nPunctuation = pre_tokenizers.Punctuation\nSequence = pre_tokenizers.Sequence\nSplit = pre_tokenizers.Split\nUnicodeScripts = pre_tokenizers.UnicodeScripts\nWhitespace = pre_tokenizers.Whitespace\nWhitespaceSplit = pre_tokenizers.WhitespaceSplit\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/pre_tokenizers.pyi",
    "content": "import tokenizers\nimport tokenizers.pre_tokenizers\nimport typing\n\nclass BertPreTokenizer:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass ByteLevel:\n    def __new__(\n        cls, /, add_prefix_space: bool = True, trim_offsets: bool = True, use_regex: bool = True, **_kwargs\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def add_prefix_space(self, /) -> bool: ...\n    @add_prefix_space.setter\n    def add_prefix_space(self, /, add_prefix_space: bool) -> None: ...\n    @staticmethod\n    def alphabet() -> typing.Any:\n        \"\"\"\n        Returns the alphabet used by this PreTokenizer.\n\n        Since the ByteLevel works as its name suggests, at the byte level, it\n        encodes each byte value to a unique visible character. This means that there is a\n        total of 256 different characters composing this alphabet.\n\n        Returns:\n            :obj:`List[str]`: A list of characters that compose the alphabet\n        \"\"\"\n        ...\n    @property\n    def trim_offsets(self, /) -> bool: ...\n    @trim_offsets.setter\n    def trim_offsets(self, /, trim_offsets: bool) -> None: ...\n    @property\n    def use_regex(self, /) -> bool: ...\n    @use_regex.setter\n    def use_regex(self, /, use_regex: bool) -> None: ...\n\nclass CharDelimiterSplit:\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(cls, /, delimiter: str) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def delimiter(self, /) -> str: ...\n    @delimiter.setter\n    def delimiter(self, /, delimiter: str) -> None: ...\n\nclass Digits:\n    def __new__(cls, /, individual_digits: bool = False) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def individual_digits(self, /) -> bool: ...\n    @individual_digits.setter\n    def individual_digits(self, /, individual_digits: bool) -> None: ...\n\nclass FixedLength:\n    def __new__(cls, /, length: int = 5) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def length(self, /) -> int: ...\n    @length.setter\n    def length(self, /, length: int) -> None: ...\n\nclass Metaspace:\n    def __new__(cls, /, replacement: str = \"▁\", prepend_scheme: str = ..., split: bool = True) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def prepend_scheme(self, /) -> str: ...\n    @prepend_scheme.setter\n    def prepend_scheme(self, /, prepend_scheme: str) -> typing.Any: ...\n    @property\n    def replacement(self, /) -> str: ...\n    @replacement.setter\n    def replacement(self, /, replacement: str) -> None: ...\n    @property\n    def split(self, /) -> bool: ...\n    @split.setter\n    def split(self, /, split: bool) -> None: ...\n\nclass PreTokenizer:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    @staticmethod\n    def custom(pretok: typing.Any) -> tokenizers.pre_tokenizers.PreTokenizer: ...\n    def pre_tokenize(self, /, pretok: tokenizers.PreTokenizedString) -> typing.Any:\n        \"\"\"\n        Pre-tokenize a :class:`~tokenizers.PyPreTokenizedString` in-place\n\n        This method allows to modify a :class:`~tokenizers.PreTokenizedString` to\n        keep track of the pre-tokenization, and leverage the capabilities of the\n        :class:`~tokenizers.PreTokenizedString`. If you just want to see the result of\n        the pre-tokenization of a raw string, you can use\n        :meth:`~tokenizers.pre_tokenizers.PreTokenizer.pre_tokenize_str`\n\n        Args:\n            pretok (:class:`~tokenizers.PreTokenizedString):\n                The pre-tokenized string on which to apply this\n                :class:`~tokenizers.pre_tokenizers.PreTokenizer`\n        \"\"\"\n        ...\n    def pre_tokenize_str(self, /, s: str) -> typing.Any:\n        \"\"\"\n        Pre tokenize the given string\n\n        This method provides a way to visualize the effect of a\n        :class:`~tokenizers.pre_tokenizers.PreTokenizer` but it does not keep track of the\n        alignment, nor does it provide all the capabilities of the\n        :class:`~tokenizers.PreTokenizedString`. If you need some of these, you can use\n        :meth:`~tokenizers.pre_tokenizers.PreTokenizer.pre_tokenize`\n\n        Args:\n            sequence (:obj:`str`):\n                A string to pre-tokeize\n\n        Returns:\n            :obj:`List[Tuple[str, Offsets]]`:\n                A list of tuple with the pre-tokenized parts and their offsets\n        \"\"\"\n        ...\n\nclass Punctuation:\n    def __new__(cls, /, behavior: typing.Any = ...) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def behavior(self, /) -> str: ...\n    @behavior.setter\n    def behavior(self, /, behavior: str) -> typing.Any: ...\n\nclass Sequence:\n    def __getitem__(self, /, index: int) -> typing.Any:\n        \"\"\"Return self[key].\"\"\"\n        ...\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(cls, /, pre_tokenizers: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __setitem__(self, /, index: int, value: typing.Any) -> typing.Any:\n        \"\"\"Set self[key] to value.\"\"\"\n        ...\n\nclass Split:\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(cls, /, pattern: str | tokenizers.Regex, behavior: typing.Any, invert: bool = False) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def behavior(self, /) -> str: ...\n    @behavior.setter\n    def behavior(self, /, behavior: str) -> typing.Any: ...\n    @property\n    def invert(self, /) -> bool: ...\n    @invert.setter\n    def invert(self, /, invert: bool) -> None: ...\n    @property\n    def pattern(self, /) -> typing.Any: ...\n    @pattern.setter\n    def pattern(self, /, _pattern: str | tokenizers.Regex) -> typing.Any: ...\n\nclass UnicodeScripts:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass Whitespace:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n\nclass WhitespaceSplit:\n    def __new__(cls, /) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/processors/__init__.py",
    "content": "# Generated content DO NOT EDIT\n\nfrom .. import processors\n\nBertProcessing = processors.BertProcessing\nByteLevel = processors.ByteLevel\nPostProcessor = processors.PostProcessor\nRobertaProcessing = processors.RobertaProcessing\nSequence = processors.Sequence\nTemplateProcessing = processors.TemplateProcessing\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/processors.pyi",
    "content": "import tokenizers\nimport typing\n\nclass BertProcessing:\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(cls, /, sep: typing.Any, cls_token: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def cls(self, /) -> typing.Any: ...\n    @cls.setter\n    def cls(self, /, cls: typing.Any) -> typing.Any: ...\n    @property\n    def sep(self, /) -> typing.Any: ...\n    @sep.setter\n    def sep(self, /, sep: typing.Any) -> typing.Any: ...\n\nclass ByteLevel:\n    def __new__(\n        cls,\n        /,\n        add_prefix_space: bool | None = None,\n        trim_offsets: bool | None = None,\n        use_regex: bool | None = None,\n        **_kwargs,\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def add_prefix_space(self, /) -> bool: ...\n    @add_prefix_space.setter\n    def add_prefix_space(self, /, add_prefix_space: bool) -> None: ...\n    @property\n    def trim_offsets(self, /) -> bool: ...\n    @trim_offsets.setter\n    def trim_offsets(self, /, trim_offsets: bool) -> None: ...\n    @property\n    def use_regex(self, /) -> bool: ...\n    @use_regex.setter\n    def use_regex(self, /, use_regex: bool) -> None: ...\n\nclass PostProcessor:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n    def num_special_tokens_to_add(self, /, is_pair: bool) -> int:\n        \"\"\"\n        Return the number of special tokens that would be added for single/pair sentences.\n\n        Args:\n            is_pair (:obj:`bool`):\n                Whether the input would be a pair of sequences\n\n        Returns:\n            :obj:`int`: The number of tokens to add\n        \"\"\"\n        ...\n    def process(\n        self,\n        /,\n        encoding: tokenizers.Encoding,\n        pair: tokenizers.Encoding | None = None,\n        add_special_tokens: bool = True,\n    ) -> tokenizers.Encoding:\n        \"\"\"\n        Post-process the given encodings, generating the final one\n\n        Args:\n            encoding (:class:`~tokenizers.Encoding`):\n                The encoding for the first sequence\n\n            pair (:class:`~tokenizers.Encoding`, `optional`):\n                The encoding for the pair sequence\n\n            add_special_tokens (:obj:`bool`):\n                Whether to add the special tokens\n\n        Return:\n            :class:`~tokenizers.Encoding`: The final encoding\n        \"\"\"\n        ...\n\nclass RobertaProcessing:\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(\n        cls, /, sep: typing.Any, cls_token: typing.Any, trim_offsets: bool = True, add_prefix_space: bool = True\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def add_prefix_space(self, /) -> bool: ...\n    @add_prefix_space.setter\n    def add_prefix_space(self, /, add_prefix_space: bool) -> None: ...\n    @property\n    def cls(self, /) -> typing.Any: ...\n    @cls.setter\n    def cls(self, /, cls: typing.Any) -> typing.Any: ...\n    @property\n    def sep(self, /) -> typing.Any: ...\n    @sep.setter\n    def sep(self, /, sep: typing.Any) -> typing.Any: ...\n    @property\n    def trim_offsets(self, /) -> bool: ...\n    @trim_offsets.setter\n    def trim_offsets(self, /, trim_offsets: bool) -> None: ...\n\nclass Sequence:\n    def __getitem__(self, /, index: int) -> typing.Any:\n        \"\"\"Return self[key].\"\"\"\n        ...\n    def __getnewargs__(self, /) -> typing.Any: ...\n    def __new__(cls, /, processors_py: typing.Any) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    def __setitem__(self, /, index: int, value: typing.Any) -> typing.Any:\n        \"\"\"Set self[key] to value.\"\"\"\n        ...\n\nclass TemplateProcessing:\n    def __new__(\n        cls,\n        /,\n        single: typing.Any | None = None,\n        pair: typing.Any | None = None,\n        special_tokens: typing.Any | None = None,\n    ) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def single(self, /) -> str: ...\n    @single.setter\n    def single(self, /, single: typing.Any) -> typing.Any: ...\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/py.typed",
    "content": ""
  },
  {
    "path": "bindings/python/py_src/tokenizers/tokenizers.pyi",
    "content": "# Generated content DO NOT EDIT\nfrom . import (\n    AddedToken as AddedToken,\n    Encoding as Encoding,\n    NormalizedString as NormalizedString,\n    PreTokenizedString as PreTokenizedString,\n    Regex as Regex,\n    Token as Token,\n    Tokenizer as Tokenizer,\n    __version__ as __version__,\n    decoders as decoders,\n    models as models,\n    normalizers as normalizers,\n    pre_tokenizers as pre_tokenizers,\n    processors as processors,\n    trainers as trainers,\n)\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/tools/__init__.py",
    "content": "from .visualizer import Annotation, EncodingVisualizer\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/tools/visualizer-styles.css",
    "content": ".tokenized-text {\n    width:100%;\n    padding:2rem;\n    max-height: 400px;\n    overflow-y: auto;\n    box-sizing:border-box;\n    line-height:4rem; /* Lots of space between lines */\n    font-family: \"Roboto Light\", \"Ubuntu Light\", \"Ubuntu\", monospace;\n    box-shadow: 2px 2px 2px rgba(0,0,0,0.2);\n    background-color: rgba(0,0,0,0.01);\n    letter-spacing:2px; /* Give some extra separation between chars */\n}\n.non-token{\n    /* White space and other things the tokenizer ignores*/\n    white-space: pre;\n    letter-spacing:4px;\n    border-top:1px solid #A0A0A0; /* A gentle border on top and bottom makes tabs more ovious*/\n    border-bottom:1px solid #A0A0A0;\n    line-height: 1rem;\n    height: calc(100% - 2px);\n}\n\n.token {\n    white-space: pre;\n    position:relative;\n    color:black;\n    letter-spacing:2px;\n}\n\n.annotation{\n    white-space:nowrap; /* Important - ensures that annotations appears even if the annotated text wraps a line */\n    border-radius:4px;\n    position:relative;\n    width:fit-content;\n}\n.annotation:before {\n    /*The before holds the text and the after holds the background*/\n    z-index:1000; /* Make sure this is above the background */\n    content:attr(data-label); /* The annotations label is on a data attribute */\n    color:white;\n    position:absolute;\n    font-size:1rem;\n    text-align:center;\n    font-weight:bold;\n\n    top:1.75rem;\n    line-height:0;\n    left:0;\n    width:100%;\n    padding:0.5rem 0;\n    /* These make it so an annotation doesn't stretch beyond the annotated text if the label is longer*/\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow:ellipsis;\n}\n\n.annotation:after {\n    content:attr(data-label); /* The content defines the width of the annotation*/\n    position:absolute;\n    font-size:0.75rem;\n    text-align:center;\n    font-weight:bold;\n    text-overflow:ellipsis;\n    top:1.75rem;\n    line-height:0;\n    overflow: hidden;\n    white-space: nowrap;\n\n    left:0;\n    width:100%; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\n\n    padding:0.5rem 0;\n    /* Nast hack below:\n    We set the annotations color in code because we don't know the colors at css time.\n    But you can't pass a color as a data attribute to get it into the pseudo element (this thing)\n    So to get around that, annotations have the color set on them with a style attribute and then we\n    can get the color with currentColor.\n    Annotations wrap tokens and tokens set the color back to black\n     */\n    background-color: currentColor;\n}\n.annotation:hover::after, .annotation:hover::before{\n    /* When the user hovers over an annotation expand the label to display in full\n     */\n    min-width: fit-content;\n}\n\n.annotation:hover{\n    /* Emphasize the annotation start end with a border on hover*/\n    border-color: currentColor;\n    border: 2px solid;\n}\n.special-token:not(:empty){\n    /*\n    A none empty special token is like UNK (as opposed to CLS which has no representation in the text )\n     */\n    position:relative;\n}\n.special-token:empty::before{\n    /* Special tokens that don't have text are displayed as pseudo elements so we dont select them with the mouse*/\n    content:attr(data-stok);\n    background:#202020;\n    font-size:0.75rem;\n    color:white;\n    margin: 0 0.25rem;\n    padding: 0.25rem;\n    border-radius:4px\n}\n\n.special-token:not(:empty):before {\n    /* Special tokens that have text (UNK) are displayed above the actual text*/\n    content:attr(data-stok);\n    position:absolute;\n    bottom:1.75rem;\n    min-width:100%;\n    width:100%;\n    height:1rem;\n    line-height:1rem;\n    font-size:1rem;\n    text-align:center;\n    color:white;\n    font-weight:bold;\n    background:#202020;\n    border-radius:10%;\n}\n/*\nWe want to alternate the color of tokens, but we can't use nth child because tokens might be broken up by annotations\ninstead we apply even and odd class at generation time and color them that way\n */\n.even-token{\n    background:#DCDCDC\t;\n    border: 1px solid #DCDCDC;\n}\n.odd-token{\n    background:#A0A0A0;\n    border: 1px solid #A0A0A0;\n}\n.even-token.multi-token,.odd-token.multi-token{\n    background:  repeating-linear-gradient(\n    45deg,\n    transparent,\n    transparent 1px,\n    #ccc 1px,\n    #ccc 1px\n    ),\n    /* on \"bottom\" */\n    linear-gradient(\n    to bottom,\n    #FFB6C1,\n    #999\n    );\n}\n\n.multi-token:hover::after {\n    content:\"This char has more than 1 token\"; /* The content defines the width of the annotation*/\n    color:white;\n    background-color: black;\n    position:absolute;\n    font-size:0.75rem;\n    text-align:center;\n    font-weight:bold;\n    text-overflow:ellipsis;\n    top:1.75rem;\n    line-height:0;\n    overflow: hidden;\n    white-space: nowrap;\n    left:0;\n    width:fit-content; /* 100% of the parent, which is the annotation whose width is the tokens inside it*/\n    padding:0.5rem 0;\n}\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/tools/visualizer.py",
    "content": "import html\nimport itertools\nimport os\nimport re\nfrom string import Template\nfrom typing import Any, Callable, Dict, List, NamedTuple, Optional, Tuple\n\nfrom tokenizers import Encoding, Tokenizer\n\ndirname = os.path.dirname(__file__)\ncss_filename = os.path.join(dirname, \"visualizer-styles.css\")\nwith open(css_filename) as f:\n    css = f.read()\n\n\nclass Annotation:\n    start: int\n    end: int\n    label: str\n\n    def __init__(self, start: int, end: int, label: str):\n        self.start = start\n        self.end = end\n        self.label = label\n\n\nAnnotationList = List[Annotation]\nPartialIntList = List[Optional[int]]\n\n\nclass CharStateKey(NamedTuple):\n    token_ix: Optional[int]\n    anno_ix: Optional[int]\n\n\nclass CharState:\n    char_ix: Optional[int]\n\n    def __init__(self, char_ix):\n        self.char_ix = char_ix\n\n        self.anno_ix: Optional[int] = None\n        self.tokens: List[int] = []\n\n    @property\n    def token_ix(self):\n        return self.tokens[0] if len(self.tokens) > 0 else None\n\n    @property\n    def is_multitoken(self):\n        \"\"\"\n        BPE tokenizers can output more than one token for a char\n        \"\"\"\n        return len(self.tokens) > 1\n\n    def partition_key(self) -> CharStateKey:\n        return CharStateKey(\n            token_ix=self.token_ix,\n            anno_ix=self.anno_ix,\n        )\n\n\nclass Aligned:\n    pass\n\n\nclass EncodingVisualizer:\n    \"\"\"\n    Build an EncodingVisualizer\n\n    Args:\n\n         tokenizer (:class:`~tokenizers.Tokenizer`):\n            A tokenizer instance\n\n         default_to_notebook (:obj:`bool`):\n            Whether to render html output in a notebook by default\n\n         annotation_converter (:obj:`Callable`, `optional`):\n            An optional (lambda) function that takes an annotation in any format and returns\n            an Annotation object\n    \"\"\"\n\n    unk_token_regex = re.compile(\"(.{1}\\b)?(unk|oov)(\\b.{1})?\", flags=re.IGNORECASE)\n\n    def __init__(\n        self,\n        tokenizer: Tokenizer,\n        default_to_notebook: bool = True,\n        annotation_converter: Optional[Callable[[Any], Annotation]] = None,\n    ):\n        if default_to_notebook:\n            try:\n                from IPython.display import HTML, display  # type: ignore[attr-defined]\n            except ImportError:\n                try:\n                    from IPython.core.display import HTML, display  # type: ignore[attr-defined]\n                except ImportError:\n                    msg = (\n                        \"We couldn't import IPython utils for html display.\\n\"\n                        \"Are you running in a notebook?\\n\"\n                        \"You can also pass `default_to_notebook=False` to get back raw HTML.\\n\"\n                    )\n                    raise ImportError(msg) from None\n        self.tokenizer = tokenizer\n        self.default_to_notebook = default_to_notebook\n        self.annotation_coverter = annotation_converter\n        pass\n\n    def __call__(\n        self,\n        text: str,\n        annotations: Optional[List[Any]] = None,\n        default_to_notebook: Optional[bool] = None,\n    ) -> Optional[str]:\n        \"\"\"\n        Build a visualization of the given text\n\n        Args:\n            text (:obj:`str`):\n                The text to tokenize\n\n            annotations (:obj:`List[Annotation]`, `optional`):\n                An optional list of annotations of the text. The can either be an annotation class\n                or anything else if you instantiated the visualizer with a converter function\n\n            default_to_notebook (:obj:`bool`, `optional`, defaults to `False`):\n                If True, will render the html in a notebook. Otherwise returns an html string.\n\n        Returns:\n            The HTML string if default_to_notebook is False, otherwise (default) returns None and\n            renders the HTML in the notebook\n\n        \"\"\"\n        final_default_to_notebook = self.default_to_notebook\n        if default_to_notebook is not None:\n            final_default_to_notebook = default_to_notebook\n        if final_default_to_notebook:\n            try:\n                from IPython.display import HTML, display  # type: ignore[attr-defined]\n            except ImportError:\n                try:\n                    from IPython.core.display import HTML, display  # type: ignore[attr-defined]\n                except ImportError:\n                    msg = (\n                        \"We couldn't import IPython utils for html display.\\n\"\n                        \"Are you running in a notebook?\\n\"\n                        \"You can also pass `default_to_notebook=False` to get back raw HTML.\\n\"\n                    )\n                    raise ImportError(msg) from None\n        if annotations is None:\n            annotations = []\n        if self.annotation_coverter is not None:\n            annotations = list(map(self.annotation_coverter, annotations))\n        encoding = self.tokenizer.encode(text)\n        html = EncodingVisualizer.__make_html(text, encoding, annotations)\n        if final_default_to_notebook:\n            display(HTML(html))\n        else:\n            return html\n\n    @staticmethod\n    def calculate_label_colors(annotations: AnnotationList) -> Dict[str, str]:\n        \"\"\"\n        Generates a color palette for all the labels in a given set of annotations\n\n        Args:\n          annotations (:obj:`Annotation`):\n            A list of annotations\n\n        Returns:\n            :obj:`dict`: A dictionary mapping labels to colors in HSL format\n        \"\"\"\n        if len(annotations) == 0:\n            return {}\n        labels = set(map(lambda x: x.label, annotations))\n        num_labels = len(labels)\n        h_step = int(255 / num_labels)\n        if h_step < 20:\n            h_step = 20\n        s = 32\n        l = 64  # noqa: E741\n        h = 10\n        colors = {}\n\n        for label in sorted(labels):  # sort so we always get the same colors for a given set of labels\n            colors[label] = f\"hsl({h},{s}%,{l}%)\"\n            h += h_step\n        return colors\n\n    @staticmethod\n    def consecutive_chars_to_html(\n        consecutive_chars_list: List[CharState],\n        text: str,\n        encoding: Encoding,\n    ):\n        \"\"\"\n        Converts a list of \"consecutive chars\" into a single HTML element.\n        Chars are consecutive if they fall under the same word, token and annotation.\n        The CharState class is a named tuple with a \"partition_key\" method that makes it easy to\n        compare if two chars are consecutive.\n\n        Args:\n            consecutive_chars_list (:obj:`List[CharState]`):\n                A list of CharStates that have been grouped together\n\n            text (:obj:`str`):\n                The original text being processed\n\n            encoding (:class:`~tokenizers.Encoding`):\n                The encoding returned from the tokenizer\n\n        Returns:\n            :obj:`str`: The HTML span for a set of consecutive chars\n        \"\"\"\n        first = consecutive_chars_list[0]\n        if first.char_ix is None:\n            # its a special token\n            stoken = encoding.tokens[first.token_ix]\n            # special tokens are represented as empty spans. We use the data attribute and css\n            # magic to display it\n            return f'<span class=\"special-token\" data-stoken={stoken}></span>'\n        # We're not in a special token so this group has a start and end.\n        last = consecutive_chars_list[-1]\n        assert first.char_ix is not None\n        assert last.char_ix is not None\n        start = first.char_ix\n        end = last.char_ix + 1\n        span_text = text[start:end]\n        css_classes = []  # What css classes will we apply on the resulting span\n        data_items = {}  # What data attributes will we apply on the result span\n        if first.token_ix is not None:\n            # We can either be in a token or not (e.g. in white space)\n            css_classes.append(\"token\")\n            if first.is_multitoken:\n                css_classes.append(\"multi-token\")\n            if first.token_ix % 2:\n                # We use this to color alternating tokens.\n                # A token might be split by an annotation that ends in the middle of it, so this\n                # lets us visually indicate a consecutive token despite its possible splitting in\n                # the html markup\n                css_classes.append(\"odd-token\")\n            else:\n                # Like above, but a different color so we can see the tokens alternate\n                css_classes.append(\"even-token\")\n            if EncodingVisualizer.unk_token_regex.search(encoding.tokens[first.token_ix]) is not None:\n                # This is a special token that is in the text. probably UNK\n                css_classes.append(\"special-token\")\n                # TODO is this the right name for the data attribute ?\n                data_items[\"stok\"] = encoding.tokens[first.token_ix]\n        else:\n            # In this case we are looking at a group/single char that is not tokenized.\n            # e.g. white space\n            css_classes.append(\"non-token\")\n        css = f'''class=\"{\" \".join(css_classes)}\"'''\n        data = \"\"\n        for key, val in data_items.items():\n            data += f' data-{key}=\"{val}\"'\n        span_text = html.escape(span_text)\n        return f\"<span {css} {data} >{span_text}</span>\"\n\n    @staticmethod\n    def __make_html(text: str, encoding: Encoding, annotations: AnnotationList) -> str:\n        char_states = EncodingVisualizer.__make_char_states(text, encoding, annotations)\n        current_consecutive_chars = [char_states[0]]\n        prev_anno_ix = char_states[0].anno_ix\n        spans = []\n        label_colors_dict = EncodingVisualizer.calculate_label_colors(annotations)\n        cur_anno_ix = char_states[0].anno_ix\n        if cur_anno_ix is not None:\n            # If we started in an  annotation make a span for it\n            anno = annotations[cur_anno_ix]\n            label = anno.label\n            color = label_colors_dict[label]\n            spans.append(f'<span class=\"annotation\" style=\"color:{color}\" data-label=\"{label}\">')\n\n        for cs in char_states[1:]:\n            cur_anno_ix = cs.anno_ix\n            if cur_anno_ix != prev_anno_ix:\n                # If we've transitioned in or out of an annotation\n                spans.append(\n                    # Create a span from the current consecutive characters\n                    EncodingVisualizer.consecutive_chars_to_html(\n                        current_consecutive_chars,\n                        text=text,\n                        encoding=encoding,\n                    )\n                )\n                current_consecutive_chars = [cs]\n\n                if prev_anno_ix is not None:\n                    # if we transitioned out of an annotation close it's span\n                    spans.append(\"</span>\")\n                if cur_anno_ix is not None:\n                    # If we entered a new annotation make a span for it\n                    anno = annotations[cur_anno_ix]\n                    label = anno.label\n                    color = label_colors_dict[label]\n                    spans.append(f'<span class=\"annotation\" style=\"color:{color}\" data-label=\"{label}\">')\n            prev_anno_ix = cur_anno_ix\n\n            if cs.partition_key() == current_consecutive_chars[0].partition_key():\n                # If the current charchter is in the same \"group\" as the previous one\n                current_consecutive_chars.append(cs)\n            else:\n                # Otherwise we make a span for the previous group\n                spans.append(\n                    EncodingVisualizer.consecutive_chars_to_html(\n                        current_consecutive_chars,\n                        text=text,\n                        encoding=encoding,\n                    )\n                )\n                # An reset the consecutive_char_list to form a new group\n                current_consecutive_chars = [cs]\n        # All that's left is to fill out the final span\n        # TODO I think there is an edge case here where an annotation's span might not close\n        spans.append(\n            EncodingVisualizer.consecutive_chars_to_html(\n                current_consecutive_chars,\n                text=text,\n                encoding=encoding,\n            )\n        )\n\n        # Close any remaining open annotation span\n        if cur_anno_ix is not None:\n            spans.append(\"</span>\")\n\n        res = HTMLBody(spans)  # Send the list of spans to the body of our html\n        return res\n\n    @staticmethod\n    def __make_anno_map(text: str, annotations: AnnotationList) -> PartialIntList:\n        \"\"\"\n        Args:\n            text (:obj:`str`):\n                The raw text we want to align to\n\n            annotations (:obj:`AnnotationList`):\n                A (possibly empty) list of annotations\n\n        Returns:\n            A list of  length len(text) whose entry at index i is None if there is no annotation on\n            character i or k, the index of the annotation that covers index i where k is with\n            respect to the list of annotations\n        \"\"\"\n        annotation_map = [None] * len(text)\n        for anno_ix, a in enumerate(annotations):\n            for i in range(a.start, a.end):\n                annotation_map[i] = anno_ix\n        return annotation_map\n\n    @staticmethod\n    def __make_char_states(text: str, encoding: Encoding, annotations: AnnotationList) -> List[CharState]:\n        \"\"\"\n        For each character in the original text, we emit a tuple representing it's \"state\":\n\n            * which token_ix it corresponds to\n            * which word_ix it corresponds to\n            * which annotation_ix it corresponds to\n\n        Args:\n            text (:obj:`str`):\n                The raw text we want to align to\n\n            annotations (:obj:`List[Annotation]`):\n                A (possibly empty) list of annotations\n\n            encoding: (:class:`~tokenizers.Encoding`):\n                The encoding returned from the tokenizer\n\n        Returns:\n            :obj:`List[CharState]`: A list of CharStates, indicating for each char in the text what\n            it's state is\n        \"\"\"\n        annotation_map = EncodingVisualizer.__make_anno_map(text, annotations)\n        # Todo make this a dataclass or named tuple\n        char_states: List[CharState] = [CharState(char_ix) for char_ix in range(len(text))]\n        for token_ix, token in enumerate(encoding.tokens):\n            offsets = encoding.token_to_chars(token_ix)\n            if offsets is not None:\n                start, end = offsets\n                for i in range(start, end):\n                    char_states[i].tokens.append(token_ix)\n        for char_ix, anno_ix in enumerate(annotation_map):\n            char_states[char_ix].anno_ix = anno_ix\n\n        return char_states\n\n\ndef HTMLBody(children: List[str], css_styles=css) -> str:\n    \"\"\"\n    Generates the full html with css from a list of html spans\n\n    Args:\n        children (:obj:`List[str]`):\n            A list of strings, assumed to be html elements\n\n        css_styles (:obj:`str`, `optional`):\n            Optional alternative implementation of the css\n\n    Returns:\n        :obj:`str`: An HTML string with style markup\n    \"\"\"\n    children_text = \"\".join(children)\n    return f\"\"\"\n    <html>\n        <head>\n            <style>\n                {css_styles}\n            </style>\n        </head>\n        <body>\n            <div class=\"tokenized-text\" dir=auto>\n            {children_text}\n            </div>\n        </body>\n    </html>\n    \"\"\"\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/trainers/__init__.py",
    "content": "# Generated content DO NOT EDIT\n\nfrom .. import trainers\n\nBpeTrainer = trainers.BpeTrainer\nTrainer = trainers.Trainer\nUnigramTrainer = trainers.UnigramTrainer\nWordLevelTrainer = trainers.WordLevelTrainer\nWordPieceTrainer = trainers.WordPieceTrainer\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/trainers/__init__.pyi",
    "content": "# Generated content DO NOT EDIT\nclass Trainer:\n    \"\"\"\n    Base class for all trainers\n\n    This class is not supposed to be instantiated directly. Instead, any implementation of a\n    Trainer will return an instance of this class when instantiated.\n    \"\"\"\n    def __getstate__(self):\n        \"\"\" \"\"\"\n        pass\n\n    def __setstate__(self, state):\n        \"\"\" \"\"\"\n        pass\n\nclass BpeTrainer(Trainer):\n    \"\"\"\n    Trainer capable of training a BPE model\n\n    Args:\n        vocab_size (:obj:`int`, `optional`):\n            The size of the final vocabulary, including all tokens and alphabet.\n\n        min_frequency (:obj:`int`, `optional`):\n            The minimum frequency a pair should have in order to be merged.\n\n        show_progress (:obj:`bool`, `optional`):\n            Whether to show progress bars while training.\n\n        special_tokens (:obj:`List[Union[str, AddedToken]]`, `optional`):\n            A list of special tokens the model should know of.\n\n        limit_alphabet (:obj:`int`, `optional`):\n            The maximum different characters to keep in the alphabet.\n\n        initial_alphabet (:obj:`List[str]`, `optional`):\n            A list of characters to include in the initial alphabet, even\n            if not seen in the training dataset.\n            If the strings contain more than one character, only the first one\n            is kept.\n\n        continuing_subword_prefix (:obj:`str`, `optional`):\n            A prefix to be used for every subword that is not a beginning-of-word.\n\n        end_of_word_suffix (:obj:`str`, `optional`):\n            A suffix to be used for every subword that is a end-of-word.\n\n        max_token_length (:obj:`int`, `optional`):\n            Prevents creating tokens longer than the specified size.\n            This can help with reducing polluting your vocabulary with\n            highly repetitive tokens like `======` for wikipedia\n\n    \"\"\"\n    def __init__(\n        self,\n        vocab_size=30000,\n        min_frequency=0,\n        show_progress=True,\n        special_tokens=[],\n        limit_alphabet=None,\n        initial_alphabet=[],\n        continuing_subword_prefix=None,\n        end_of_word_suffix=None,\n        max_token_length=None,\n        words={},\n    ):\n        pass\n\n    def __getstate__(self):\n        \"\"\" \"\"\"\n        pass\n\n    def __setstate__(self, state):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def continuing_subword_prefix(self):\n        \"\"\" \"\"\"\n        pass\n\n    @continuing_subword_prefix.setter\n    def continuing_subword_prefix(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def end_of_word_suffix(self):\n        \"\"\" \"\"\"\n        pass\n\n    @end_of_word_suffix.setter\n    def end_of_word_suffix(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def initial_alphabet(self):\n        \"\"\" \"\"\"\n        pass\n\n    @initial_alphabet.setter\n    def initial_alphabet(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def limit_alphabet(self):\n        \"\"\" \"\"\"\n        pass\n\n    @limit_alphabet.setter\n    def limit_alphabet(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def max_token_length(self):\n        \"\"\" \"\"\"\n        pass\n\n    @max_token_length.setter\n    def max_token_length(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def min_frequency(self):\n        \"\"\" \"\"\"\n        pass\n\n    @min_frequency.setter\n    def min_frequency(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def show_progress(self):\n        \"\"\" \"\"\"\n        pass\n\n    @show_progress.setter\n    def show_progress(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def special_tokens(self):\n        \"\"\" \"\"\"\n        pass\n\n    @special_tokens.setter\n    def special_tokens(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def vocab_size(self):\n        \"\"\" \"\"\"\n        pass\n\n    @vocab_size.setter\n    def vocab_size(self, value):\n        \"\"\" \"\"\"\n        pass\n\nclass UnigramTrainer(Trainer):\n    \"\"\"\n    Trainer capable of training a Unigram model\n\n    Args:\n        vocab_size (:obj:`int`):\n            The size of the final vocabulary, including all tokens and alphabet.\n\n        show_progress (:obj:`bool`):\n            Whether to show progress bars while training.\n\n        special_tokens (:obj:`List[Union[str, AddedToken]]`):\n            A list of special tokens the model should know of.\n\n        initial_alphabet (:obj:`List[str]`):\n            A list of characters to include in the initial alphabet, even\n            if not seen in the training dataset.\n            If the strings contain more than one character, only the first one\n            is kept.\n\n        shrinking_factor (:obj:`float`):\n            The shrinking factor used at each step of the training to prune the\n            vocabulary.\n\n        unk_token (:obj:`str`):\n            The token used for out-of-vocabulary tokens.\n\n        max_piece_length (:obj:`int`):\n            The maximum length of a given token.\n\n        n_sub_iterations (:obj:`int`):\n            The number of iterations of the EM algorithm to perform before\n            pruning the vocabulary.\n    \"\"\"\n    def __init__(\n        self,\n        vocab_size=8000,\n        show_progress=True,\n        special_tokens=[],\n        initial_alphabet=[],\n        shrinking_factor=0.75,\n        unk_token=None,\n        max_piece_length=16,\n        n_sub_iterations=2,\n    ):\n        pass\n\n    def __getstate__(self):\n        \"\"\" \"\"\"\n        pass\n\n    def __setstate__(self, state):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def initial_alphabet(self):\n        \"\"\" \"\"\"\n        pass\n\n    @initial_alphabet.setter\n    def initial_alphabet(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def show_progress(self):\n        \"\"\" \"\"\"\n        pass\n\n    @show_progress.setter\n    def show_progress(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def special_tokens(self):\n        \"\"\" \"\"\"\n        pass\n\n    @special_tokens.setter\n    def special_tokens(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def vocab_size(self):\n        \"\"\" \"\"\"\n        pass\n\n    @vocab_size.setter\n    def vocab_size(self, value):\n        \"\"\" \"\"\"\n        pass\n\nclass WordLevelTrainer(Trainer):\n    \"\"\"\n    Trainer capable of training a WorldLevel model\n\n    Args:\n        vocab_size (:obj:`int`, `optional`):\n            The size of the final vocabulary, including all tokens and alphabet.\n\n        min_frequency (:obj:`int`, `optional`):\n            The minimum frequency a pair should have in order to be merged.\n\n        show_progress (:obj:`bool`, `optional`):\n            Whether to show progress bars while training.\n\n        special_tokens (:obj:`List[Union[str, AddedToken]]`):\n            A list of special tokens the model should know of.\n    \"\"\"\n    def __init__(self, vocab_size=30000, min_frequency=0, show_progress=True, special_tokens=[]):\n        pass\n\n    def __getstate__(self):\n        \"\"\" \"\"\"\n        pass\n\n    def __setstate__(self, state):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def min_frequency(self):\n        \"\"\" \"\"\"\n        pass\n\n    @min_frequency.setter\n    def min_frequency(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def show_progress(self):\n        \"\"\" \"\"\"\n        pass\n\n    @show_progress.setter\n    def show_progress(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def special_tokens(self):\n        \"\"\" \"\"\"\n        pass\n\n    @special_tokens.setter\n    def special_tokens(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def vocab_size(self):\n        \"\"\" \"\"\"\n        pass\n\n    @vocab_size.setter\n    def vocab_size(self, value):\n        \"\"\" \"\"\"\n        pass\n\nclass WordPieceTrainer(Trainer):\n    \"\"\"\n    Trainer capable of training a WordPiece model\n\n    Args:\n        vocab_size (:obj:`int`, `optional`):\n            The size of the final vocabulary, including all tokens and alphabet.\n\n        min_frequency (:obj:`int`, `optional`):\n            The minimum frequency a pair should have in order to be merged.\n\n        show_progress (:obj:`bool`, `optional`):\n            Whether to show progress bars while training.\n\n        special_tokens (:obj:`List[Union[str, AddedToken]]`, `optional`):\n            A list of special tokens the model should know of.\n\n        limit_alphabet (:obj:`int`, `optional`):\n            The maximum different characters to keep in the alphabet.\n\n        initial_alphabet (:obj:`List[str]`, `optional`):\n            A list of characters to include in the initial alphabet, even\n            if not seen in the training dataset.\n            If the strings contain more than one character, only the first one\n            is kept.\n\n        continuing_subword_prefix (:obj:`str`, `optional`):\n            A prefix to be used for every subword that is not a beginning-of-word.\n\n        end_of_word_suffix (:obj:`str`, `optional`):\n            A suffix to be used for every subword that is a end-of-word.\n    \"\"\"\n    def __init__(\n        self,\n        vocab_size=30000,\n        min_frequency=0,\n        show_progress=True,\n        special_tokens=[],\n        limit_alphabet=None,\n        initial_alphabet=[],\n        continuing_subword_prefix=\"##\",\n        end_of_word_suffix=None,\n    ):\n        pass\n\n    def __getstate__(self):\n        \"\"\" \"\"\"\n        pass\n\n    def __setstate__(self, state):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def continuing_subword_prefix(self):\n        \"\"\" \"\"\"\n        pass\n\n    @continuing_subword_prefix.setter\n    def continuing_subword_prefix(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def end_of_word_suffix(self):\n        \"\"\" \"\"\"\n        pass\n\n    @end_of_word_suffix.setter\n    def end_of_word_suffix(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def initial_alphabet(self):\n        \"\"\" \"\"\"\n        pass\n\n    @initial_alphabet.setter\n    def initial_alphabet(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def limit_alphabet(self):\n        \"\"\" \"\"\"\n        pass\n\n    @limit_alphabet.setter\n    def limit_alphabet(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def min_frequency(self):\n        \"\"\" \"\"\"\n        pass\n\n    @min_frequency.setter\n    def min_frequency(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def show_progress(self):\n        \"\"\" \"\"\"\n        pass\n\n    @show_progress.setter\n    def show_progress(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def special_tokens(self):\n        \"\"\" \"\"\"\n        pass\n\n    @special_tokens.setter\n    def special_tokens(self, value):\n        \"\"\" \"\"\"\n        pass\n\n    @property\n    def vocab_size(self):\n        \"\"\" \"\"\"\n        pass\n\n    @vocab_size.setter\n    def vocab_size(self, value):\n        \"\"\" \"\"\"\n        pass\n"
  },
  {
    "path": "bindings/python/py_src/tokenizers/trainers.pyi",
    "content": "import typing\n\nclass BpeTrainer:\n    def __new__(cls, /, **kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def continuing_subword_prefix(self, /) -> typing.Any: ...\n    @continuing_subword_prefix.setter\n    def continuing_subword_prefix(self, /, prefix: str | None) -> None: ...\n    @property\n    def end_of_word_suffix(self, /) -> typing.Any: ...\n    @end_of_word_suffix.setter\n    def end_of_word_suffix(self, /, suffix: str | None) -> None: ...\n    @property\n    def initial_alphabet(self, /) -> typing.Any: ...\n    @initial_alphabet.setter\n    def initial_alphabet(self, /, alphabet: typing.Any) -> None: ...\n    @property\n    def limit_alphabet(self, /) -> typing.Any: ...\n    @limit_alphabet.setter\n    def limit_alphabet(self, /, limit: int | None) -> None: ...\n    @property\n    def max_token_length(self, /) -> typing.Any: ...\n    @max_token_length.setter\n    def max_token_length(self, /, limit: int | None) -> None: ...\n    @property\n    def min_frequency(self, /) -> int: ...\n    @min_frequency.setter\n    def min_frequency(self, /, freq: int) -> None: ...\n    @property\n    def show_progress(self, /) -> bool: ...\n    @show_progress.setter\n    def show_progress(self, /, show_progress: bool) -> None: ...\n    @property\n    def special_tokens(self, /) -> typing.Any: ...\n    @special_tokens.setter\n    def special_tokens(self, /, special_tokens: typing.Any) -> typing.Any: ...\n    @property\n    def vocab_size(self, /) -> int: ...\n    @vocab_size.setter\n    def vocab_size(self, /, vocab_size: int) -> None: ...\n\nclass Trainer:\n    def __getstate__(self, /) -> typing.Any: ...\n    def __repr__(self, /) -> str:\n        \"\"\"Return repr(self).\"\"\"\n        ...\n    def __setstate__(self, /, state: typing.Any) -> typing.Any: ...\n    def __str__(self, /) -> str:\n        \"\"\"Return str(self).\"\"\"\n        ...\n\nclass UnigramTrainer:\n    def __new__(cls, /, **kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def initial_alphabet(self, /) -> typing.Any: ...\n    @initial_alphabet.setter\n    def initial_alphabet(self, /, alphabet: typing.Any) -> None: ...\n    @property\n    def show_progress(self, /) -> bool: ...\n    @show_progress.setter\n    def show_progress(self, /, show_progress: bool) -> None: ...\n    @property\n    def special_tokens(self, /) -> typing.Any: ...\n    @special_tokens.setter\n    def special_tokens(self, /, special_tokens: typing.Any) -> typing.Any: ...\n    @property\n    def vocab_size(self, /) -> int: ...\n    @vocab_size.setter\n    def vocab_size(self, /, vocab_size: int) -> None: ...\n\nclass WordLevelTrainer:\n    def __new__(cls, /, **kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def min_frequency(self, /) -> int: ...\n    @min_frequency.setter\n    def min_frequency(self, /, freq: int) -> None: ...\n    @property\n    def show_progress(self, /) -> bool: ...\n    @show_progress.setter\n    def show_progress(self, /, show_progress: bool) -> None: ...\n    @property\n    def special_tokens(self, /) -> typing.Any: ...\n    @special_tokens.setter\n    def special_tokens(self, /, special_tokens: typing.Any) -> typing.Any: ...\n    @property\n    def vocab_size(self, /) -> int: ...\n    @vocab_size.setter\n    def vocab_size(self, /, vocab_size: int) -> None: ...\n\nclass WordPieceTrainer:\n    def __new__(cls, /, **kwargs) -> None:\n        \"\"\"Create and return a new object.  See help(type) for accurate signature.\"\"\"\n        ...\n    @property\n    def continuing_subword_prefix(self, /) -> typing.Any: ...\n    @continuing_subword_prefix.setter\n    def continuing_subword_prefix(self, /, prefix: str | None) -> None: ...\n    @property\n    def end_of_word_suffix(self, /) -> typing.Any: ...\n    @end_of_word_suffix.setter\n    def end_of_word_suffix(self, /, suffix: str | None) -> None: ...\n    @property\n    def initial_alphabet(self, /) -> typing.Any: ...\n    @initial_alphabet.setter\n    def initial_alphabet(self, /, alphabet: typing.Any) -> None: ...\n    @property\n    def limit_alphabet(self, /) -> typing.Any: ...\n    @limit_alphabet.setter\n    def limit_alphabet(self, /, limit: int | None) -> None: ...\n    @property\n    def min_frequency(self, /) -> int: ...\n    @min_frequency.setter\n    def min_frequency(self, /, freq: int) -> None: ...\n    @property\n    def show_progress(self, /) -> bool: ...\n    @show_progress.setter\n    def show_progress(self, /, show_progress: bool) -> None: ...\n    @property\n    def special_tokens(self, /) -> typing.Any: ...\n    @special_tokens.setter\n    def special_tokens(self, /, special_tokens: typing.Any) -> typing.Any: ...\n    @property\n    def vocab_size(self, /) -> int: ...\n    @vocab_size.setter\n    def vocab_size(self, /, vocab_size: int) -> None: ...\n"
  },
  {
    "path": "bindings/python/pyproject.toml",
    "content": "[project]\nname = \"tokenizers\"\nrequires-python = \">=3.9\"\nauthors = [\n  { name = \"Nicolas Patry\", email = \"patry.nicolas@protonmail.com\" },\n  { name = \"Anthony Moi\", email = \"anthony@huggingface.co\" },\n]\nclassifiers = [\n  \"Development Status :: 5 - Production/Stable\",\n  \"Intended Audience :: Developers\",\n  \"Intended Audience :: Education\",\n  \"Intended Audience :: Science/Research\",\n  \"License :: OSI Approved :: Apache Software License\",\n  \"Operating System :: OS Independent\",\n  \"Programming Language :: Python :: 3\",\n  \"Programming Language :: Python :: 3.9\",\n  \"Programming Language :: Python :: 3.10\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Programming Language :: Python :: 3.12\",\n  \"Programming Language :: Python :: 3.13\",\n  \"Programming Language :: Python :: 3 :: Only\",\n  \"Topic :: Scientific/Engineering :: Artificial Intelligence\",\n]\nkeywords = [\"NLP\", \"tokenizer\", \"BPE\", \"transformer\", \"deep learning\"]\ndynamic = [\"description\", \"license\", \"readme\", \"version\"]\ndependencies = [\"huggingface_hub>=0.16.4,<2.0\"]\n\n[project.urls]\nHomepage = \"https://github.com/huggingface/tokenizers\"\nSource = \"https://github.com/huggingface/tokenizers\"\n\n\n[project.optional-dependencies]\ntesting = [\"pytest\", \"pytest-asyncio\", \"requests\", \"numpy\", \"datasets\", \"ruff\", \"ty\"]\ndocs = [\"sphinx\", \"sphinx_rtd_theme\", \"setuptools_rust\"]\ndev = [\"tokenizers[testing]\"]\n\n\n[build-system]\nrequires = [\"maturin>=1.0,<2.0\"]\nbuild-backend = \"maturin\"\n\n[tool.maturin]\npython-source = \"py_src\"\nmodule-name = \"tokenizers.tokenizers\"\nbindings = \"pyo3\"\nfeatures = [\"pyo3/extension-module\"]\n\n\n[tool.ruff]\nline-length = 119\ntarget-version = \"py311\"\nlint.ignore = [\n  # a == None in tests vs is None.\n  \"E711\",\n  # a == False in tests vs is False.\n  \"E712\",\n  # try.. import except.. pattern without using the lib.\n  \"F401\",\n  # Raw type equality is required in asserts\n  \"E721\",\n  # Import order\n  \"E402\",\n  # Fixtures unused import\n  \"F811\",\n]\n\n[tool.ty.rules]\ninvalid-method-override = \"ignore\""
  },
  {
    "path": "bindings/python/rust-toolchain",
    "content": "stable\n"
  },
  {
    "path": "bindings/python/scripts/convert.py",
    "content": "import transformers  # type: ignore[import]\nfrom tokenizers.implementations import SentencePieceUnigramTokenizer, BaseTokenizer\nfrom tokenizers.processors import TemplateProcessing\nfrom tokenizers.models import Unigram, BPE\nfrom tokenizers import decoders\nfrom tokenizers import Tokenizer, Regex\nfrom tokenizers.normalizers import (\n    StripAccents,\n    NFKD,\n    Lowercase,\n    Sequence,\n    BertNormalizer,\n    Precompiled,\n    Replace,\n)\nfrom tokenizers.pre_tokenizers import (\n    Digits,\n    WhitespaceSplit,\n    Metaspace,\n    Sequence as PSequence,\n)\nimport json\nimport unicodedata\nimport sys\nimport os\nimport datetime\nimport argparse\n\nsys.path.append(\".\")\n\nfrom spm_parity_check import check_details  # type: ignore[import]\nfrom sentencepiece_extractor import SentencePieceExtractor  # type: ignore[import]\n\n\ndef check_number_comma(piece: str) -> bool:\n    return len(piece) < 2 or piece[-1] != \",\" or not piece[-2].isdigit()\n\n\ndef get_proto(filename: str):\n    try:\n        import sys\n\n        sys.path.append(\".\")\n\n        import sentencepiece_model_pb2 as model  # type: ignore[import]\n    except Exception:\n        raise Exception(\n            \"You don't seem to have the required protobuf file, in order to use this function you need to run `pip install protobuf` and `wget https://raw.githubusercontent.com/google/sentencepiece/master/python/sentencepiece_model_pb2.py` for us to be able to read the intrinsics of your spm_file. `pip install sentencepiece` is not required.\"\n        )\n\n    m = model.ModelProto()\n    m.ParseFromString(open(filename, \"rb\").read())\n    return m\n\n\nclass Converter:\n    def __init__(self, original_tokenizer):\n        self.original_tokenizer = original_tokenizer\n\n    def converted(self) -> Tokenizer:\n        raise NotImplementedError()\n\n\nclass SpmConverter(Converter):\n    def __init__(self, *args):\n        super().__init__(*args)\n        self.proto = get_proto(self.original_tokenizer.vocab_file)\n\n    def vocab(self, proto):\n        return [(piece.piece, piece.score) for piece in proto.pieces]\n\n    def unk_id(self, proto):\n        return proto.trainer_spec.unk_id\n\n    def tokenizer(self, proto):\n        model_type = proto.trainer_spec.model_type\n        vocab = self.vocab(proto)\n        unk_id = self.unk_id(proto)\n        if model_type == 1:\n            tokenizer = Tokenizer(Unigram(vocab, unk_id))\n        elif model_type == 2:\n            vocab, merges = SentencePieceExtractor(self.original_tokenizer.vocab_file).extract()\n            tokenizer = Tokenizer(BPE(vocab, merges, unk_token=proto.trainer_spec.unk_piece, fuse_unk=True))\n        else:\n            raise Exception(\n                \"You're trying to run a `Unigram` model but you're file was trained with a different algorithm\"\n            )\n\n        return tokenizer\n\n    def normalizer(self, proto):\n        precompiled_charsmap = proto.normalizer_spec.precompiled_charsmap\n        return Sequence([Precompiled(precompiled_charsmap), Replace(Regex(\" {2,}\"), \" \")])\n\n    def post_processor(self, tokenizer):\n        return None\n\n    def converted(self):\n        tokenizer = self.tokenizer(self.proto)\n\n        # Tokenizer assemble\n        tokenizer.normalizer = self.normalizer(self.proto)\n\n        replacement = \"▁\"\n        prepend_scheme = \"always\"\n        tokenizer.pre_tokenizer = Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n        tokenizer.decoder = decoders.Metaspace(replacement=replacement, prepend_scheme=prepend_scheme)\n        post_processor = self.post_processor(tokenizer)\n        if post_processor:\n            tokenizer.post_processor = post_processor\n\n        # TODO what parameters should we give ?\n        parameters = {}\n\n        return BaseTokenizer(tokenizer, parameters)\n\n\nclass AlbertConverter(SpmConverter):\n    def vocab(self, proto):\n        return [\n            (piece.piece, piece.score) if check_number_comma(piece.piece) else (piece.piece, piece.score - 100)\n            for piece in proto.pieces\n        ]\n\n    def normalizer(self, proto):\n        normalizers = [Replace(\"``\", '\"'), Replace(\"''\", '\"')]\n        if not self.original_tokenizer.keep_accents:\n            normalizers.append(NFKD())\n            normalizers.append(StripAccents())\n        if self.original_tokenizer.do_lower_case:\n            normalizers.append(Lowercase())\n\n        precompiled_charsmap = proto.normalizer_spec.precompiled_charsmap\n        normalizers.append(Precompiled(precompiled_charsmap))\n        normalizers.append(Replace(Regex(\" {2,}\"), \" \"))\n        return Sequence(normalizers)\n\n    def post_processor(self, tokenizer):\n        return TemplateProcessing(\n            single=[\"[CLS]\", \"$0\", \"[SEP]\"],\n            pair=[\"$1\", \"[SEP]\"],\n            special_tokens=[\n                (\"[CLS]\", tokenizer.get_vocab()[\"[CLS]\"]),\n                (\"[SEP]\", tokenizer.get_vocab()[\"[SEP]\"]),\n            ],\n        )\n\n\nclass CamembertConverter(SpmConverter):\n    def vocab(self, proto):\n        vocab = [\n            (\"<s>NOTUSED\", 0.0),\n            (\"<pad>\", 0.0),\n            (\"</s>NOTUSED\", 0.0),\n            (\"<unk>\", 0.0),\n        ]\n        vocab += [(piece.piece, piece.score) for piece in proto.pieces]\n        return vocab\n\n    def unk_id(self, proto):\n        # See vocab unk position\n        return 3\n\n    def post_processor(self, tokenizer):\n        return TemplateProcessing(\n            single=[\"<s>\", \"$0\", \"</s>\"],\n            pair=[\"$1\", \"</s>\"],\n            special_tokens=[\n                (\"<s>\", tokenizer.get_vocab()[\"<s>\"]),\n                (\"</s>\", tokenizer.get_vocab()[\"</s>\"]),\n            ],\n        )\n\n\nclass MBartConverter(SpmConverter):\n    def vocab(self, proto):\n        vocab = [\n            (\"<s>\", 0.0),\n            (\"<pad>\", 0.0),\n            (\"</s>\", 0.0),\n            (\"<unk>\", 0.0),\n        ]\n        vocab += [(piece.piece, piece.score) for piece in proto.pieces[3:]]\n        vocab += [\n            (\"ar_AR\", 0.0),\n            (\"cs_CZ\", 0.0),\n            (\"de_DE\", 0.0),\n            (\"en_XX\", 0.0),\n            (\"es_XX\", 0.0),\n            (\"et_EE\", 0.0),\n            (\"fi_FI\", 0.0),\n            (\"fr_XX\", 0.0),\n            (\"gu_IN\", 0.0),\n            (\"hi_IN\", 0.0),\n            (\"it_IT\", 0.0),\n            (\"ja_XX\", 0.0),\n            (\"kk_KZ\", 0.0),\n            (\"ko_KR\", 0.0),\n            (\"lt_LT\", 0.0),\n            (\"lv_LV\", 0.0),\n            (\"my_MM\", 0.0),\n            (\"ne_NP\", 0.0),\n            (\"nl_XX\", 0.0),\n            (\"ro_RO\", 0.0),\n            (\"ru_RU\", 0.0),\n            (\"si_LK\", 0.0),\n            (\"tr_TR\", 0.0),\n            (\"vi_VN\", 0.0),\n            (\"zh_CN\", 0.0),\n        ]\n        return vocab\n\n    def unk_id(self, proto):\n        return 3\n\n    def post_processor(self, tokenizer):\n        return TemplateProcessing(\n            single=[\"$0\", \"</s>\", \"en_XX\"],\n            pair=[\"$1\", \"</s>\"],\n            special_tokens=[\n                (\"en_XX\", tokenizer.get_vocab()[\"en_XX\"]),\n                (\"</s>\", tokenizer.get_vocab()[\"</s>\"]),\n            ],\n        )\n\n\nclass XLMRobertaConverter(SpmConverter):\n    def vocab(self, proto):\n        vocab = [\n            (\"<s>\", 0.0),\n            (\"<pad>\", 0.0),\n            (\"</s>\", 0.0),\n            (\"<unk>\", 0.0),\n        ]\n        vocab += [(piece.piece, piece.score) for piece in proto.pieces[3:]]\n        return vocab\n\n    def unk_id(self, proto):\n        unk_id = 3\n        return unk_id\n\n    def post_processor(self, tokenizer):\n        return TemplateProcessing(\n            single=[\"<s>\", \"$0\", \"</s>\"],\n            pair=[\"$1\", \"</s>\"],\n            special_tokens=[\n                (\"<s>\", tokenizer.get_vocab()[\"<s>\"]),\n                (\"</s>\", tokenizer.get_vocab()[\"</s>\"]),\n            ],\n        )\n\n\nclass XLNetConverter(SpmConverter):\n    def vocab(self, proto):\n        return [\n            (piece.piece, piece.score) if check_number_comma(piece.piece) else (piece.piece, piece.score - 100)\n            for piece in proto.pieces\n        ]\n\n    def normalizer(self, proto):\n        normalizers = [Replace(\"``\", '\"'), Replace(\"''\", '\"')]\n        if not self.original_tokenizer.keep_accents:\n            normalizers.append(NFKD())\n            normalizers.append(StripAccents())\n        if self.original_tokenizer.do_lower_case:\n            normalizers.append(Lowercase())\n\n        precompiled_charsmap = proto.normalizer_spec.precompiled_charsmap\n        normalizers.append(Precompiled(precompiled_charsmap))\n        normalizers.append(Replace(Regex(\" {2,}\"), \" \"))\n        return Sequence(normalizers)\n\n    def post_processor(self, tokenizer):\n        return TemplateProcessing(\n            single=[\"$0\", \"<sep>\", \"<cls>\"],\n            pair=[\"$1\", \"<sep>\"],\n            special_tokens=[\n                (\"<sep>\", tokenizer.get_vocab()[\"<sep>\"]),\n                (\"<cls>\", tokenizer.get_vocab()[\"<cls>\"]),\n            ],\n        )\n\n\nclass ReformerConverter(SpmConverter):\n    pass\n\n\nclass PegasusConverter(SpmConverter):\n    offset = 103\n\n    def vocab(self, proto):\n        vocab = [\n            (self.original_tokenizer.pad_token, 0),\n            (self.original_tokenizer.eos_token, 0),\n        ]\n        vocab += [(f\"unk_{i}\", -100) for i in range(2, 2 + self.offset)]\n        vocab += [(piece.piece, piece.score) for piece in proto.pieces[2:]]\n        return vocab\n\n    def unk_id(self, proto):\n        return proto.trainer_spec.unk_id + self.offset\n\n    def post_processor(self, tokenizer):\n        eos = self.original_tokenizer.eos_token\n        return TemplateProcessing(\n            single=[\"$0\", eos],\n            pair=[\"$1\", eos],\n            special_tokens=[(eos, tokenizer.get_vocab()[eos])],\n        )\n\n\nclass T5Converter(SpmConverter):\n    def post_processor(self, tokenizer):\n        return TemplateProcessing(\n            single=[\"$0\", \"</s>\"],\n            pair=[\"$1\", \"</s>\"],\n            special_tokens=[(\"</s>\", tokenizer.get_vocab()[\"</s>\"])],\n        )\n\n\nCONVERTERS = {\n    \"AlbertTokenizer\": AlbertConverter,\n    \"CamembertTokenizer\": CamembertConverter,\n    \"XLMRobertaTokenizer\": XLMRobertaConverter,\n    \"MBartTokenizer\": MBartConverter,\n    \"XLNetTokenizer\": XLNetConverter,\n    \"ReformerTokenizer\": ReformerConverter,\n    \"PegasusTokenizer\": PegasusConverter,\n    \"T5Tokenizer\": T5Converter,\n}\n\n\ndef check(pretrained, filename):\n    transformer_tokenizer = transformers.AutoTokenizer.from_pretrained(pretrained)\n    converter_class = CONVERTERS[transformer_tokenizer.__class__.__name__]\n    tokenizer = converter_class(transformer_tokenizer).converted()\n\n    now = datetime.datetime.now\n    trans_total_time = datetime.timedelta(seconds=0)\n    tok_total_time = datetime.timedelta(seconds=0)\n\n    with open(filename, \"r\") as f:\n        for i, line in enumerate(f):\n            line = line.strip()\n\n            start = now()\n            ids = transformer_tokenizer.encode(line)\n            trans = now()\n            tok_ids = tokenizer.encode(line).ids\n            tok = now()\n\n            trans_total_time += trans - start\n            tok_total_time += tok - trans\n\n            if ids != tok_ids:\n                if check_details(line, ids, tok_ids, transformer_tokenizer, tokenizer):\n                    continue\n            assert ids == tok_ids, f\"Error in line {i}: {line} {ids} != {tok_ids}\"\n\n    tokenizer.save(f\"{pretrained.replace('/', '-')}.json\")\n    return (\"OK\", trans_total_time / tok_total_time)\n\n\ndef main():\n    pretraineds = [\n        \"albert-base-v1\",\n        \"albert-large-v1\",\n        \"albert-xlarge-v1\",\n        \"albert-xxlarge-v1\",\n        \"albert-base-v2\",\n        \"albert-large-v2\",\n        \"albert-xlarge-v2\",\n        \"albert-xxlarge-v2\",\n        \"camembert-base\",\n        \"xlm-roberta-base\",\n        \"xlm-roberta-large\",\n        \"xlm-roberta-large-finetuned-conll02-dutch\",\n        \"xlm-roberta-large-finetuned-conll02-spanish\",\n        \"xlm-roberta-large-finetuned-conll03-english\",\n        \"xlm-roberta-large-finetuned-conll03-german\",\n        \"facebook/mbart-large-en-ro\",\n        \"facebook/mbart-large-cc25\",\n        \"xlnet-base-cased\",\n        \"xlnet-large-cased\",\n        \"google/reformer-crime-and-punishment\",\n        \"t5-small\",\n        \"google/pegasus-large\",\n    ]\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\n        \"--filename\",\n        required=True,\n        type=str,\n        help=\"The filename that we are going to encode in both versions to check that conversion worked\",\n    )\n    parser.add_argument(\n        \"--models\",\n        type=lambda s: s.split(\",\"),\n        default=pretraineds,\n        help=f\"The pretrained tokenizers you want to test against, (default: {pretraineds})\",\n    )\n    args = parser.parse_args()\n\n    print(args.filename)\n\n    model_len = 50\n    status_len = 6\n    speedup_len = 8\n    print(f\"|{'Model':^{model_len}}|{'Status':^{status_len}}|{'Speedup':^{speedup_len}}|\")\n    print(f\"|{'-' * model_len}|{'-' * status_len}|{'-' * speedup_len}|\")\n    for pretrained in args.models:\n        status, speedup = check(pretrained, args.filename)\n        print(f\"|{pretrained:<{model_len}}|{status:^{status_len}}|{speedup:^{speedup_len - 1}.2f}x|\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "bindings/python/scripts/sentencepiece_extractor.py",
    "content": "from argparse import ArgumentParser\nfrom json import dump\nfrom logging import basicConfig, getLogger\nfrom os import linesep, remove\nfrom os.path import exists\nfrom tempfile import NamedTemporaryFile\nfrom typing import Dict, List, Tuple\n\nfrom requests import get\nfrom sentencepiece import SentencePieceProcessor  # type: ignore[import]\nfrom tqdm import trange, tqdm\n\nbasicConfig()\nlogger = getLogger()\n\n\nclass SentencePieceExtractor:\n    \"\"\"\n    Extractor implementation for SentencePiece trained models.\n    https://github.com/google/sentencepiece\n    \"\"\"\n\n    def __init__(self, model: str):\n        # Get SentencePiece\n        self.sp = SentencePieceProcessor()\n        self.sp.Load(model)\n\n    def extract(self) -> Tuple[Dict[str, int], List[Tuple]]:\n        sp = self.sp\n        vocab = {sp.id_to_piece(index): index for index in trange(sp.GetPieceSize())}  # type: ignore[attr-defined]\n\n        # Merges\n        merges = []\n        for piece_l in tqdm(vocab.keys(), total=sp.GetPieceSize()):\n            for piece_r in vocab.keys():\n                merge = f\"{piece_l}{piece_r}\"\n                piece_id = vocab.get(merge, None)\n                if piece_id:\n                    merges += [(piece_l, piece_r, piece_id)]\n        merges = sorted(merges, key=lambda val: val[2])\n        merges = [(val[0], val[1]) for val in merges]\n\n        return vocab, merges\n\n\nclass YouTokenToMeExtractor:\n    \"\"\"\n    Extractor implementation for YouTokenToMe trained models format.\n    Model are as follow:\n        vocab_size nb_merges\n        piece piece_id\n        ...(repeated vocab_size)\n        piece_id_left piece_id_right piece_id\n        ...(repeated nb merges)\n    \"\"\"\n\n    def __init__(self, model: str):\n        self._model = model\n\n    def extract(self) -> Tuple[Dict[str, int], List[Tuple]]:\n        with open(self._model, \"r\") as model_f:\n            # Retrieve information\n            nb_pieces, nb_merges = map(int, model_f.readline().split())\n            vocab, merges = {}, []\n\n            # Vocab\n            for _ in trange(nb_pieces):\n                piece, piece_id = map(int, model_f.readline().split())\n                vocab[piece_id] = chr(piece)\n\n            # Merges\n            for _ in trange(nb_merges):\n                piece_id_l, piece_id_r, piece = map(int, model_f.readline().split())\n                piece_l, piece_r = vocab[piece_id_l], vocab[piece_id_r]\n                vocab[piece] = f\"{piece_l}{piece_r}\"\n                merges += [(piece_l, piece_r)]\n\n            # Special tokens\n            unk, pad, bos, eos = map(int, model_f.readline().split())\n            vocab[unk] = \"<unk>\"\n            vocab[pad] = \"<pad>\"\n            vocab[bos] = \"<bos>\"\n            vocab[eos] = \"<eos>\"\n\n        # Invert key and value for vocab\n        vocab = dict(zip(vocab.values(), vocab.keys()))\n        return vocab, merges\n\n\nif __name__ == \"__main__\":\n    parser = ArgumentParser(\"SentencePiece vocab extractor\")\n    parser.add_argument(\n        \"--provider\",\n        type=str,\n        required=True,\n        choices=[\"sentencepiece\", \"youtokentome\"],\n        help=\"Indicate the format of the file.\",\n    )\n    parser.add_argument(\"--model\", type=str, required=True, help=\"SentencePiece model to extract vocab from.\")\n    parser.add_argument(\n        \"--vocab-output-path\",\n        type=str,\n        required=True,\n        help=\"Path where the vocab.json file will be extracted\",\n    )\n    parser.add_argument(\n        \"--merges-output-path\",\n        type=str,\n        required=True,\n        help=\"Path where the merges file will be extracted\",\n    )\n\n    # Parse cli arguments\n    args = parser.parse_args()\n\n    try:\n        if args.model.startswith(\"http\"):\n            # Saving model\n            with NamedTemporaryFile(\"wb\", delete=False) as f:\n                logger.info(\"Writing content from {} to {}\".format(args.model, f.name))\n                response = get(args.model, allow_redirects=True)\n                f.write(response.content)\n\n                args.remote_model = args.model\n                args.model = f.name\n\n        # Allocate extractor\n        extractor = SentencePieceExtractor if args.provider == \"sentencepiece\" else YouTokenToMeExtractor\n        extractor = extractor(args.model)\n\n        logger.info(f\"Using {type(extractor).__name__}\")\n\n        # Open output files and let's extract model information\n        with open(args.vocab_output_path, \"w\") as vocab_f:\n            with open(args.merges_output_path, \"w\") as merges_f:\n                # Do the extraction\n                vocab, merges = extractor.extract()\n\n                # Save content\n                dump(vocab, vocab_f)\n                merges_f.writelines(map(lambda x: f\"{x[0]} {x[1]}{linesep}\", merges))\n    finally:\n        # If model was downloaded from internet we need to cleanup the tmp folder.\n        if hasattr(args, \"remote_model\") and exists(args.model):\n            remove(args.model)\n"
  },
  {
    "path": "bindings/python/scripts/spm_parity_check.py",
    "content": "import tokenizers\nfrom argparse import ArgumentParser\nimport sentencepiece as spm\nfrom collections import Counter\nimport json\nimport os\nimport datetime\nfrom typing import Any, cast\n\ntry:\n    from termcolor import colored\n\n    has_color = True\nexcept Exception:\n    has_color = False\n\n\ndef main():\n    parser = ArgumentParser(\"SentencePiece parity checker\")\n    parser.add_argument(\n        \"--input-file\",\n        \"-i\",\n        type=str,\n        required=True,\n        help=\"Which files do you want to train from\",\n    )\n    parser.add_argument(\n        \"--model-file\",\n        \"-m\",\n        type=str,\n        required=False,\n        default=None,\n        help=\"Use a pretrained token file\",\n    )\n    parser.add_argument(\n        \"--model-prefix\",\n        type=str,\n        default=\"spm_parity\",\n        help=\"Model prefix for spm_train\",\n    )\n    parser.add_argument(\n        \"--vocab-size\",\n        \"-v\",\n        type=int,\n        default=8000,\n        help=\"Vocab size for spm_train\",\n    )\n    parser.add_argument(\n        \"--verbose\",\n        action=\"store_true\",\n        help=\"Verbosity\",\n    )\n    parser.add_argument(\n        \"--train\",\n        action=\"store_true\",\n        help=\"Instead of checking the encoder part, we check the trainer part\",\n    )\n    parser.add_argument(\n        \"--from-spm\",\n        action=\"store_true\",\n        help=\"Directly load the spm file with it's own normalizer\",\n    )\n\n    args = parser.parse_args()\n\n    trained = False\n    if args.model_file is None:\n        spm.SentencePieceTrainer.Train(\n            f\"--input={args.input_file} --model_prefix={args.model_prefix}\"\n            f\" --character_coverage=1.0\"\n            f\" --max_sentence_length=40000\"\n            f\" --num_threads=1\"\n            f\" --vocab_size={args.vocab_size}\"\n        )\n        trained = True\n        args.model_file = f\"{args.model_prefix}.model\"\n\n    try:\n        if args.train:\n            check_train(args)\n        else:\n            check_encode(args)\n    finally:\n        if trained:\n            os.remove(f\"{args.model_prefix}.model\")\n            os.remove(f\"{args.model_prefix}.vocab\")\n\n\ndef check_train(args):\n    sp = spm.SentencePieceProcessor()\n    sp.Load(args.model_file)\n\n    tokenizer = tokenizers.SentencePieceUnigramTokenizer()\n    tokenizer.train(args.input_file, show_progress=False)\n\n    spm_tokens = 0\n    tokenizer_tokens = 0\n\n    with open(args.input_file, \"r\") as f:\n        for i, line in enumerate(f):\n            line = line.strip()\n            ids = sp.EncodeAsIds(line)\n\n            encoded = tokenizer.encode(line)\n\n            spm_tokens += len(ids)\n            tokenizer_tokens += len(encoded.ids)\n\n    vocab = [0 for i in range(args.vocab_size)]\n    spm_vocab = [0 for i in range(args.vocab_size)]\n\n    for token, index in tokenizer.get_vocab().items():\n        vocab[index] = token\n\n    for i in range(args.vocab_size):\n        spm_vocab[i] = sp.id_to_piece(i)\n\n    # 0 is unk in tokenizers, 0, 1, 2 are unk bos, eos in spm by default.\n    for i, (token, spm_token) in enumerate(zip(vocab[1:], spm_vocab[3:])):\n        if token != spm_token:\n            print(f\"First different token is token {i} ({token} != {spm_token})\")\n            break\n\n    print(f\"Tokenizer used {tokenizer_tokens}, where spm used {spm_tokens}\")\n    assert tokenizer_tokens < spm_tokens, \"Our trainer should be at least more efficient than the SPM one\"\n    print(\"Ok our trainer is at least more efficient than the SPM one\")\n\n\ndef check_diff(spm_diff, tok_diff, sp, tok):\n    if spm_diff == list(reversed(tok_diff)):\n        # AAA -> AA+A vs A+AA case.\n        return True\n    elif len(spm_diff) == len(tok_diff) and tok.decode(spm_diff) == tok.decode(tok_diff):\n        # Second order OK\n        # Barrich -> Barr + ich vs Bar + rich\n        return True\n    spm_reencoded = sp.encode(sp.decode(spm_diff))\n    tok_reencoded = tok.encode(tok.decode(spm_diff)).ids\n    if spm_reencoded != spm_diff and spm_reencoded == tok_reencoded:\n        # Type 3 error.\n        # Snehagatha ->\n        #       Sne, h, aga, th, a\n        #       Sne, ha, gat, ha\n        # Encoding the wrong with sp does not even recover what spm gave us\n        # It fits tokenizer however...\n        return True\n    return False\n\n\ndef check_details(line, spm_ids, tok_ids, sp, tok):\n    # Encoding can be the same with same result AAA -> A + AA vs AA + A\n    # We can check that we use at least exactly the same number of tokens.\n    for i, (spm_id, tok_id) in enumerate(zip(spm_ids, tok_ids)):\n        if spm_id != tok_id:\n            break\n    first = i\n    for i, (spm_id, tok_id) in enumerate(zip(reversed(spm_ids), reversed(tok_ids))):\n        if spm_id != tok_id:\n            break\n    last = len(spm_ids) - i\n\n    spm_diff = spm_ids[first:last]\n    tok_diff = tok_ids[first:last]\n\n    if check_diff(spm_diff, tok_diff, sp, tok):\n        return True\n\n    if last - first > 5:\n        # We might have twice a single problem, attempt to subdivide the disjointed tokens into smaller problems\n        spms = Counter(spm_ids[first:last])\n        toks = Counter(tok_ids[first:last])\n\n        removable_tokens = {spm_ for (spm_, si) in spms.items() if toks.get(spm_, 0) == si}\n        min_width = 3\n        for i in range(last - first - min_width):\n            if all(spm_ids[first + i + j] in removable_tokens for j in range(min_width)):\n                possible_matches = [\n                    k\n                    for k in range(last - first - min_width)\n                    if tok_ids[first + k : first + k + min_width] == spm_ids[first + i : first + i + min_width]\n                ]\n                for j in possible_matches:\n                    if check_diff(spm_ids[first : first + i], tok_ids[first : first + j], sp, tok) and check_details(\n                        line,\n                        spm_ids[first + i : last],\n                        tok_ids[first + j : last],\n                        sp,\n                        tok,\n                    ):\n                        return True\n\n    print(f\"Spm: {[tok.decode([spm_ids[i]]) for i in range(first, last)]}\")\n    try:\n        print(f\"Tok: {[tok.decode([tok_ids[i]]) for i in range(first, last)]}\")\n    except Exception:\n        pass\n\n    ok_start = tok.decode(spm_ids[:first])\n    ok_end = tok.decode(spm_ids[last:])\n    wrong = tok.decode(spm_ids[first:last])\n    print()\n    if has_color:\n        print(f\"{colored(ok_start, 'grey')}{colored(wrong, 'red')}{colored(ok_end, 'grey')}\")\n    else:\n        print(wrong)\n    return False\n\n\ndef check_encode(args):\n    sp = cast(Any, spm.SentencePieceProcessor())\n    sp.Load(args.model_file)\n\n    if args.from_spm:\n        tok = tokenizers.SentencePieceUnigramTokenizer.from_spm(args.model_file)\n    else:\n        vocab = [(sp.id_to_piece(i), sp.get_score(i)) for i in range(sp.piece_size())]\n        unk_id = sp.unk_id()\n        tok = tokenizers.SentencePieceUnigramTokenizer(vocab, unk_id)\n\n    perfect = 0\n    imperfect = 0\n    wrong = 0\n    now = datetime.datetime.now\n    spm_total_time = datetime.timedelta(seconds=0)\n    tok_total_time = datetime.timedelta(seconds=0)\n    with open(args.input_file, \"r\", encoding=\"utf-8-sig\") as f:\n        for i, line in enumerate(f):\n            line = line.strip()\n\n            start = now()\n            ids = sp.EncodeAsIds(line)\n            spm_time = now()\n\n            encoded = tok.encode(line)\n            tok_time = now()\n\n            spm_total_time += spm_time - start\n            tok_total_time += tok_time - spm_time\n\n            if args.verbose:\n                if i % 10000 == 0:\n                    print(f\"({perfect} / {imperfect} / {wrong} ----- {perfect + imperfect + wrong})\")\n                    print(f\"SPM: {spm_total_time} - TOK: {tok_total_time}\")\n\n            if ids != encoded.ids:\n                if check_details(line, ids, encoded.ids, sp, tok):\n                    imperfect += 1\n                    continue\n                else:\n                    wrong += 1\n            else:\n                perfect += 1\n\n            assert ids == encoded.ids, (\n                f\"line {i}: {line} : \\n\\n{ids}\\n{encoded.ids}\\n{list(zip(encoded.ids, encoded.tokens))}\"\n            )\n\n    print(f\"({perfect} / {imperfect} / {wrong} ----- {perfect + imperfect + wrong})\")\n    total = perfect + imperfect + wrong\n    print(f\"Accuracy {perfect * 100 / total:.2f} Slowdown : {tok_total_time / spm_total_time:.2f}\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "bindings/python/setup.cfg",
    "content": "[isort]\ndefault_section = FIRSTPARTY\nensure_newline_before_comments = True\nforce_grid_wrap = 0\ninclude_trailing_comma = True\nknown_first_party = transformers\nknown_third_party =\n    absl\n    conllu\n    datasets\n    elasticsearch\n    fairseq\n    faiss-cpu\n    fastprogress\n    fire\n    fugashi\n    git\n    h5py\n    matplotlib\n    nltk\n    numpy\n    packaging\n    pandas\n    PIL\n    psutil\n    pytest\n    pytorch_lightning\n    rouge_score\n    sacrebleu\n    seqeval\n    sklearn\n    streamlit\n    tensorboardX\n    tensorflow\n    tensorflow_datasets\n    timeout_decorator\n    torch\n    torchaudio\n    torchtext\n    torchvision\n    torch_xla\n    tqdm\n\nline_length = 119\nlines_after_imports = 2\nmulti_line_output = 3\nuse_parentheses = True\n\n[flake8]\nignore = E203, E501, E741, W503, W605\nmax-line-length = 119\n\n[tool:pytest]\ndoctest_optionflags=NUMBER NORMALIZE_WHITESPACE ELLIPSIS\n"
  },
  {
    "path": "bindings/python/src/decoders.rs",
    "content": "use std::sync::{Arc, RwLock};\n\nuse crate::pre_tokenizers::from_string;\nuse crate::tokenizer::PyTokenizer;\nuse crate::utils::PyPattern;\nuse pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse serde::de::Error;\nuse serde::{Deserialize, Deserializer, Serialize, Serializer};\nuse tk::decoders::bpe::BPEDecoder;\nuse tk::decoders::byte_fallback::ByteFallback;\nuse tk::decoders::byte_level::ByteLevel;\nuse tk::decoders::ctc::CTC;\nuse tk::decoders::fuse::Fuse;\nuse tk::decoders::metaspace::{Metaspace, PrependScheme};\nuse tk::decoders::sequence::Sequence;\nuse tk::decoders::strip::Strip;\nuse tk::decoders::wordpiece::WordPiece;\nuse tk::decoders::DecoderWrapper;\nuse tk::normalizers::replace::Replace;\nuse tk::Decoder;\nuse tokenizers as tk;\n\nuse super::error::ToPyResult;\n\n/// Base class for all decoders\n///\n/// This class is not supposed to be instantiated directly. Instead, any implementation of\n/// a Decoder will return an instance of this class when instantiated.\n#[pyclass(\n    dict,\n    module = \"tokenizers.decoders\",\n    name = \"Decoder\",\n    subclass,\n    from_py_object\n)]\n#[derive(Clone, Deserialize, Serialize)]\n#[serde(transparent)]\npub struct PyDecoder {\n    pub(crate) decoder: PyDecoderWrapper,\n}\n\nimpl PyDecoder {\n    pub(crate) fn new(decoder: PyDecoderWrapper) -> Self {\n        PyDecoder { decoder }\n    }\n\n    pub(crate) fn get_as_subtype(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        let base = self.clone();\n        Ok(match &self.decoder {\n            PyDecoderWrapper::Custom(_) => Py::new(py, base)?.into_any(),\n            PyDecoderWrapper::Wrapped(inner) => match &*inner.as_ref().read().unwrap() {\n                DecoderWrapper::Metaspace(_) => Py::new(py, (PyMetaspaceDec {}, base))?.into_any(),\n                DecoderWrapper::WordPiece(_) => Py::new(py, (PyWordPieceDec {}, base))?.into_any(),\n                DecoderWrapper::ByteFallback(_) => {\n                    Py::new(py, (PyByteFallbackDec {}, base))?.into_any()\n                }\n                DecoderWrapper::Strip(_) => Py::new(py, (PyStrip {}, base))?.into_any(),\n                DecoderWrapper::Fuse(_) => Py::new(py, (PyFuseDec {}, base))?.into_any(),\n                DecoderWrapper::ByteLevel(_) => Py::new(py, (PyByteLevelDec {}, base))?.into_any(),\n                DecoderWrapper::Replace(_) => Py::new(py, (PyReplaceDec {}, base))?.into_any(),\n                DecoderWrapper::BPE(_) => Py::new(py, (PyBPEDecoder {}, base))?.into_any(),\n                DecoderWrapper::CTC(_) => Py::new(py, (PyCTCDecoder {}, base))?.into_any(),\n                DecoderWrapper::Sequence(_) => {\n                    Py::new(py, (PySequenceDecoder {}, base))?.into_any()\n                }\n            },\n        })\n    }\n}\n\nimpl Decoder for PyDecoder {\n    fn decode_chain(&self, tokens: Vec<String>) -> tk::Result<Vec<String>> {\n        self.decoder.decode_chain(tokens)\n    }\n}\n\n#[pymethods]\nimpl PyDecoder {\n    #[staticmethod]\n    #[pyo3(text_signature = \"(decoder)\")]\n    fn custom(decoder: Py<PyAny>) -> Self {\n        let decoder = PyDecoderWrapper::Custom(Arc::new(RwLock::new(CustomDecoder::new(decoder))));\n        PyDecoder::new(decoder)\n    }\n\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.decoder).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle Decoder: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                self.decoder = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle Decoder: {e}\"\n                    ))\n                })?;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    /// Decode the given list of tokens to a final string\n    ///\n    /// Args:\n    ///     tokens (:obj:`List[str]`):\n    ///         The list of tokens to decode\n    ///\n    /// Returns:\n    ///     :obj:`str`: The decoded string\n    #[pyo3(text_signature = \"(self, tokens)\")]\n    fn decode(&self, tokens: Vec<String>) -> PyResult<String> {\n        ToPyResult(self.decoder.decode(tokens)).into()\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n}\n\nmacro_rules! getter {\n    ($self: ident, $variant: ident, $($name: tt)+) => {{\n        let super_ = $self.as_ref();\n        if let PyDecoderWrapper::Wrapped(ref wrap) = super_.decoder {\n            if let DecoderWrapper::$variant(ref dec) = *wrap.read().unwrap() {\n                dec.$($name)+\n            } else {\n                unreachable!()\n            }\n        } else {\n            unreachable!()\n        }\n    }};\n}\n\nmacro_rules! setter {\n    ($self: ident, $variant: ident, $name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyDecoderWrapper::Wrapped(ref wrap) = super_.decoder {\n            if let DecoderWrapper::$variant(ref mut dec) = *wrap.write().unwrap() {\n                dec.$name = $value;\n            }\n        }\n    }};\n    ($self: ident, $variant: ident, @$name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyDecoderWrapper::Wrapped(ref wrap) = super_.decoder {\n            if let DecoderWrapper::$variant(ref mut dec) = *wrap.write().unwrap() {\n                dec.$name($value);\n            }\n        }\n    }};\n}\n\n/// ByteLevel Decoder\n///\n/// This decoder is to be used in tandem with the :class:`~tokenizers.pre_tokenizers.ByteLevel`\n/// :class:`~tokenizers.pre_tokenizers.PreTokenizer`.\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"ByteLevel\")]\npub struct PyByteLevelDec {}\n#[pymethods]\nimpl PyByteLevelDec {\n    #[new]\n    #[pyo3(signature = (**_kwargs), text_signature = \"(self)\")]\n    fn new(_kwargs: Option<&Bound<'_, PyDict>>) -> (Self, PyDecoder) {\n        (PyByteLevelDec {}, ByteLevel::default().into())\n    }\n}\n\n/// Replace Decoder\n///\n/// This decoder is to be used in tandem with the :class:`~tokenizers.pre_tokenizers.Replace`\n/// :class:`~tokenizers.pre_tokenizers.PreTokenizer`.\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"Replace\")]\npub struct PyReplaceDec {}\n#[pymethods]\nimpl PyReplaceDec {\n    #[new]\n    #[pyo3(text_signature = \"(self, pattern, content)\")]\n    fn new(pattern: PyPattern, content: String) -> PyResult<(Self, PyDecoder)> {\n        Ok((\n            PyReplaceDec {},\n            ToPyResult(Replace::new(pattern, content)).into_py()?.into(),\n        ))\n    }\n}\n\n/// WordPiece Decoder\n///\n/// Args:\n///     prefix (:obj:`str`, `optional`, defaults to :obj:`##`):\n///         The prefix to use for subwords that are not a beginning-of-word\n///\n///     cleanup (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to cleanup some tokenization artifacts. Mainly spaces before punctuation,\n///         and some abbreviated english forms.\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"WordPiece\")]\npub struct PyWordPieceDec {}\n#[pymethods]\nimpl PyWordPieceDec {\n    #[getter]\n    fn get_prefix(self_: PyRef<Self>) -> String {\n        getter!(self_, WordPiece, prefix.clone())\n    }\n\n    #[setter]\n    fn set_prefix(self_: PyRef<Self>, prefix: String) {\n        setter!(self_, WordPiece, prefix, prefix);\n    }\n\n    #[getter]\n    fn get_cleanup(self_: PyRef<Self>) -> bool {\n        getter!(self_, WordPiece, cleanup)\n    }\n\n    #[setter]\n    fn set_cleanup(self_: PyRef<Self>, cleanup: bool) {\n        setter!(self_, WordPiece, cleanup, cleanup);\n    }\n\n    #[new]\n    #[pyo3(signature = (prefix = String::from(\"##\"), cleanup = true), text_signature = \"(self, prefix=\\\"##\\\", cleanup=True)\")]\n    fn new(prefix: String, cleanup: bool) -> (Self, PyDecoder) {\n        (PyWordPieceDec {}, WordPiece::new(prefix, cleanup).into())\n    }\n}\n\n/// ByteFallback Decoder\n/// ByteFallback is a simple trick which converts tokens looking like `<0x61>`\n/// to pure bytes, and attempts to make them into a string. If the tokens\n/// cannot be decoded you will get � instead for each inconvertible byte token\n///\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"ByteFallback\")]\npub struct PyByteFallbackDec {}\n#[pymethods]\nimpl PyByteFallbackDec {\n    #[new]\n    #[pyo3(signature = (), text_signature = \"(self)\")]\n    fn new() -> (Self, PyDecoder) {\n        (PyByteFallbackDec {}, ByteFallback::new().into())\n    }\n}\n\n/// Fuse Decoder\n/// Fuse simply fuses every token into a single string.\n/// This is the last step of decoding, this decoder exists only if\n/// there is need to add other decoders *after* the fusion\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"Fuse\")]\npub struct PyFuseDec {}\n#[pymethods]\nimpl PyFuseDec {\n    #[new]\n    #[pyo3(signature = (), text_signature = \"(self)\")]\n    fn new() -> (Self, PyDecoder) {\n        (PyFuseDec {}, Fuse::new().into())\n    }\n}\n\n/// Strip normalizer\n/// Strips n left characters of each token, or n right characters of each token\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"Strip\")]\npub struct PyStrip {}\n#[pymethods]\nimpl PyStrip {\n    #[getter]\n    fn get_start(self_: PyRef<Self>) -> usize {\n        getter!(self_, Strip, start)\n    }\n\n    #[setter]\n    fn set_start(self_: PyRef<Self>, start: usize) {\n        setter!(self_, Strip, start, start)\n    }\n\n    #[getter]\n    fn get_stop(self_: PyRef<Self>) -> usize {\n        getter!(self_, Strip, stop)\n    }\n\n    #[setter]\n    fn set_stop(self_: PyRef<Self>, stop: usize) {\n        setter!(self_, Strip, stop, stop)\n    }\n\n    #[getter]\n    fn get_content(self_: PyRef<Self>) -> char {\n        getter!(self_, Strip, content)\n    }\n\n    #[setter]\n    fn set_content(self_: PyRef<Self>, content: char) {\n        setter!(self_, Strip, content, content)\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (content=' ', left=0, right=0),\n        text_signature = \"(self, content=' ', left=0, right=0)\"\n    )]\n    fn new(content: char, left: usize, right: usize) -> (Self, PyDecoder) {\n        (PyStrip {}, Strip::new(content, left, right).into())\n    }\n}\n\n/// Metaspace Decoder\n///\n/// Args:\n///     replacement (:obj:`str`, `optional`, defaults to :obj:`▁`):\n///         The replacement character. Must be exactly one character. By default we\n///         use the `▁` (U+2581) meta symbol (Same as in SentencePiece).\n///\n///     prepend_scheme (:obj:`str`, `optional`, defaults to :obj:`\"always\"`):\n///         Whether to add a space to the first word if there isn't already one. This\n///         lets us treat `hello` exactly like `say hello`.\n///         Choices: \"always\", \"never\", \"first\". First means the space is only added on the first\n///         token (relevant when special tokens are used or other pre_tokenizer are used).\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"Metaspace\")]\npub struct PyMetaspaceDec {}\n#[pymethods]\nimpl PyMetaspaceDec {\n    #[getter]\n    fn get_replacement(self_: PyRef<Self>) -> String {\n        getter!(self_, Metaspace, get_replacement().to_string())\n    }\n\n    #[setter]\n    fn set_replacement(self_: PyRef<Self>, replacement: char) {\n        setter!(self_, Metaspace, @set_replacement, replacement);\n    }\n\n    #[getter]\n    fn get_split(self_: PyRef<Self>) -> bool {\n        getter!(self_, Metaspace, get_split())\n    }\n\n    #[setter]\n    fn set_split(self_: PyRef<Self>, split: bool) {\n        setter!(self_, Metaspace, @set_split, split);\n    }\n\n    #[getter]\n    fn get_prepend_scheme(self_: PyRef<Self>) -> String {\n        // Assuming Metaspace has a method to get the prepend_scheme as a string\n        let scheme: PrependScheme = getter!(self_, Metaspace, get_prepend_scheme());\n        match scheme {\n            PrependScheme::First => \"first\",\n            PrependScheme::Never => \"never\",\n            PrependScheme::Always => \"always\",\n        }\n        .to_string()\n    }\n\n    #[setter]\n    fn set_prepend_scheme(self_: PyRef<Self>, prepend_scheme: String) -> PyResult<()> {\n        let scheme = from_string(prepend_scheme)?;\n        setter!(self_, Metaspace, @set_prepend_scheme, scheme);\n        Ok(())\n    }\n\n    #[new]\n    #[pyo3(signature = (replacement = '▁', prepend_scheme = String::from(\"always\"), split = true), text_signature = \"(self, replacement = \\\"▁\\\",  prepend_scheme = \\\"always\\\", split = True)\")]\n    fn new(replacement: char, prepend_scheme: String, split: bool) -> PyResult<(Self, PyDecoder)> {\n        let prepend_scheme = from_string(prepend_scheme)?;\n        Ok((\n            PyMetaspaceDec {},\n            Metaspace::new(replacement, prepend_scheme, split).into(),\n        ))\n    }\n}\n\n/// BPEDecoder Decoder\n///\n/// Args:\n///     suffix (:obj:`str`, `optional`, defaults to :obj:`</w>`):\n///         The suffix that was used to characterize an end-of-word. This suffix will\n///         be replaced by whitespaces during the decoding\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"BPEDecoder\")]\npub struct PyBPEDecoder {}\n#[pymethods]\nimpl PyBPEDecoder {\n    #[getter]\n    fn get_suffix(self_: PyRef<Self>) -> String {\n        getter!(self_, BPE, suffix.clone())\n    }\n\n    #[setter]\n    fn set_suffix(self_: PyRef<Self>, suffix: String) {\n        setter!(self_, BPE, suffix, suffix);\n    }\n\n    #[new]\n    #[pyo3(signature = (suffix = String::from(\"</w>\")), text_signature = \"(self, suffix=\\\"</w>\\\")\")]\n    fn new(suffix: String) -> (Self, PyDecoder) {\n        (PyBPEDecoder {}, BPEDecoder::new(suffix).into())\n    }\n}\n\n/// CTC Decoder\n///\n/// Args:\n///     pad_token (:obj:`str`, `optional`, defaults to :obj:`<pad>`):\n///         The pad token used by CTC to delimit a new token.\n///     word_delimiter_token (:obj:`str`, `optional`, defaults to :obj:`|`):\n///         The word delimiter token. It will be replaced by a <space>\n///     cleanup (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to cleanup some tokenization artifacts.\n///         Mainly spaces before punctuation, and some abbreviated english forms.\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name = \"CTC\")]\npub struct PyCTCDecoder {}\n#[pymethods]\nimpl PyCTCDecoder {\n    #[getter]\n    fn get_pad_token(self_: PyRef<Self>) -> String {\n        getter!(self_, CTC, pad_token.clone())\n    }\n\n    #[setter]\n    fn set_pad_token(self_: PyRef<Self>, pad_token: String) {\n        setter!(self_, CTC, pad_token, pad_token);\n    }\n\n    #[getter]\n    fn get_word_delimiter_token(self_: PyRef<Self>) -> String {\n        getter!(self_, CTC, word_delimiter_token.clone())\n    }\n\n    #[setter]\n    fn set_word_delimiter_token(self_: PyRef<Self>, word_delimiter_token: String) {\n        setter!(self_, CTC, word_delimiter_token, word_delimiter_token);\n    }\n\n    #[getter]\n    fn get_cleanup(self_: PyRef<Self>) -> bool {\n        getter!(self_, CTC, cleanup)\n    }\n\n    #[setter]\n    fn set_cleanup(self_: PyRef<Self>, cleanup: bool) {\n        setter!(self_, CTC, cleanup, cleanup);\n    }\n\n    #[new]\n    #[pyo3(signature = (\n        pad_token = String::from(\"<pad>\"),\n        word_delimiter_token = String::from(\"|\"),\n        cleanup = true\n    ),\n        text_signature = \"(self, pad_token=\\\"<pad>\\\", word_delimiter_token=\\\"|\\\", cleanup=True)\")]\n    fn new(pad_token: String, word_delimiter_token: String, cleanup: bool) -> (Self, PyDecoder) {\n        (\n            PyCTCDecoder {},\n            CTC::new(pad_token, word_delimiter_token, cleanup).into(),\n        )\n    }\n}\n\n/// Sequence Decoder\n///\n/// Args:\n///     decoders (:obj:`List[Decoder]`)\n///         The decoders that need to be chained\n#[pyclass(extends=PyDecoder, module = \"tokenizers.decoders\", name=\"Sequence\")]\npub struct PySequenceDecoder {}\n#[pymethods]\nimpl PySequenceDecoder {\n    #[new]\n    #[pyo3(signature = (decoders_py), text_signature = \"(self, decoders)\")]\n    fn new(decoders_py: &Bound<'_, PyList>) -> PyResult<(Self, PyDecoder)> {\n        let mut decoders: Vec<DecoderWrapper> = Vec::with_capacity(decoders_py.len());\n        for decoder_py in decoders_py.iter() {\n            let decoder: PyRef<PyDecoder> = decoder_py.extract()?;\n            let decoder = match &decoder.decoder {\n                PyDecoderWrapper::Wrapped(inner) => inner,\n                PyDecoderWrapper::Custom(_) => unimplemented!(),\n            };\n            decoders.push(decoder.read().unwrap().clone());\n        }\n        Ok((PySequenceDecoder {}, Sequence::new(decoders).into()))\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [PyList::empty(py)])\n    }\n}\n\npub(crate) struct CustomDecoder {\n    inner: Py<PyAny>,\n}\n\nimpl CustomDecoder {\n    pub(crate) fn new(inner: Py<PyAny>) -> Self {\n        CustomDecoder { inner }\n    }\n}\n\nimpl Decoder for CustomDecoder {\n    fn decode(&self, tokens: Vec<String>) -> tk::Result<String> {\n        Python::attach(|py| {\n            let decoded = self\n                .inner\n                .call_method(py, \"decode\", (tokens,), None)?\n                .extract(py)?;\n            Ok(decoded)\n        })\n    }\n\n    fn decode_chain(&self, tokens: Vec<String>) -> tk::Result<Vec<String>> {\n        Python::attach(|py| {\n            let decoded = self\n                .inner\n                .call_method(py, \"decode_chain\", (tokens,), None)?\n                .extract(py)?;\n            Ok(decoded)\n        })\n    }\n}\n\nimpl Serialize for CustomDecoder {\n    fn serialize<S>(&self, _serializer: S) -> std::result::Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        Err(serde::ser::Error::custom(\n            \"Custom PyDecoder cannot be serialized\",\n        ))\n    }\n}\n\nimpl<'de> Deserialize<'de> for CustomDecoder {\n    fn deserialize<D>(_deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        Err(D::Error::custom(\"PyDecoder cannot be deserialized\"))\n    }\n}\n\n#[derive(Clone, Deserialize, Serialize)]\n#[serde(untagged)]\npub(crate) enum PyDecoderWrapper {\n    Custom(Arc<RwLock<CustomDecoder>>),\n    Wrapped(Arc<RwLock<DecoderWrapper>>),\n}\n\nimpl<I> From<I> for PyDecoderWrapper\nwhere\n    I: Into<DecoderWrapper>,\n{\n    fn from(norm: I) -> Self {\n        PyDecoderWrapper::Wrapped(Arc::new(RwLock::new(norm.into())))\n    }\n}\n\nimpl<I> From<I> for PyDecoder\nwhere\n    I: Into<DecoderWrapper>,\n{\n    fn from(dec: I) -> Self {\n        PyDecoder {\n            decoder: dec.into().into(),\n        }\n    }\n}\n\nimpl Decoder for PyDecoderWrapper {\n    fn decode_chain(&self, tokens: Vec<String>) -> tk::Result<Vec<String>> {\n        match self {\n            PyDecoderWrapper::Wrapped(inner) => inner.read().unwrap().decode_chain(tokens),\n            PyDecoderWrapper::Custom(inner) => inner.read().unwrap().decode_chain(tokens),\n        }\n    }\n}\n\n/// Decoders Module\n#[pymodule]\npub mod decoders {\n    #[pymodule_export]\n    pub use super::PyBPEDecoder;\n    #[pymodule_export]\n    pub use super::PyByteFallbackDec;\n    #[pymodule_export]\n    pub use super::PyByteLevelDec;\n    #[pymodule_export]\n    pub use super::PyCTCDecoder;\n    #[pymodule_export]\n    pub use super::PyDecodeStream;\n    #[pymodule_export]\n    pub use super::PyDecoder;\n    #[pymodule_export]\n    pub use super::PyFuseDec;\n    #[pymodule_export]\n    pub use super::PyMetaspaceDec;\n    #[pymodule_export]\n    pub use super::PyReplaceDec;\n    #[pymodule_export]\n    pub use super::PySequenceDecoder;\n    #[pymodule_export]\n    pub use super::PyStrip;\n    #[pymodule_export]\n    pub use super::PyWordPieceDec;\n}\n\n/// Class needed for streaming decode\n///\n#[pyclass(module = \"tokenizers.decoders\", name = \"DecodeStream\", from_py_object)]\n#[derive(Clone)]\npub struct PyDecodeStream {\n    /// Regular decode option that is kept throughout.\n    skip_special_tokens: bool,\n    /// A temporary buffer of the necessary token_ids needed\n    /// to produce valid string chunks.\n    /// This typically contains 3 parts:\n    ///  - read\n    ///  - prefix\n    ///  - rest\n    ///\n    /// Read is the bit necessary to surround the prefix\n    /// so decoding the whole ids produces a valid prefix.\n    /// Prefix is the previously produced string, kept around to trim off of\n    /// the next valid chunk\n    ids: Vec<u32>,\n    /// The previously returned chunk that needs to be discarded from the\n    /// decoding of the current ids to produce the next chunk\n    prefix: String,\n    /// The index within the ids corresponding to the prefix so we can drain\n    /// correctly\n    prefix_index: usize,\n}\n\n#[derive(Clone)]\nenum StreamInput {\n    Id(u32),\n    Ids(Vec<u32>),\n}\n\nimpl<'a, 'py> FromPyObject<'a, 'py> for StreamInput {\n    type Error = PyErr;\n\n    fn extract(obj: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        if let Ok(id) = obj.extract::<u32>() {\n            Ok(StreamInput::Id(id))\n        } else if let Ok(ids) = obj.extract::<Vec<u32>>() {\n            Ok(StreamInput::Ids(ids))\n        } else {\n            Err(PyErr::new::<pyo3::exceptions::PyTypeError, _>(\n                \"StreamInput must be either an integer or a list of integers\",\n            ))\n        }\n    }\n}\n\n#[pymethods]\nimpl PyDecodeStream {\n    #[new]\n    #[pyo3(signature = (ids=None, skip_special_tokens=false), text_signature = \"(self, ids=None, skip_special_tokens=False)\")]\n    fn new(ids: Option<Vec<u32>>, skip_special_tokens: Option<bool>) -> Self {\n        PyDecodeStream {\n            skip_special_tokens: skip_special_tokens.unwrap_or(false),\n            ids: ids.unwrap_or_default(),\n            prefix: String::new(),\n            prefix_index: 0,\n        }\n    }\n\n    /// Streaming decode step\n    ///\n    /// Args:\n    ///     tokenizer (:class:`~tokenizers.Tokenizer`):\n    ///        The tokenizer to use for decoding\n    ///    id (:obj:`int` or `List[int]`):\n    ///       The next token id or list of token ids to add to the stream\n    ///\n    ///\n    /// Returns:\n    ///     :obj:`Optional[str]`: The next decoded string chunk, or None if not enough\n    ///         tokens have been provided yet.\n    #[pyo3(signature = (tokenizer, id), text_signature = \"(self, tokenizer, id)\")]\n    fn step(&mut self, tokenizer: &PyTokenizer, id: StreamInput) -> PyResult<Option<String>> {\n        let id: Vec<u32> = match id {\n            StreamInput::Id(id) => vec![id],\n            StreamInput::Ids(ids) => ids,\n        };\n        ToPyResult(tk::tokenizer::step_decode_stream(\n            &tokenizer.tokenizer,\n            id,\n            self.skip_special_tokens,\n            &mut self.ids,\n            &mut self.prefix,\n            &mut self.prefix_index,\n        ))\n        .into()\n    }\n    fn __copy__(&self) -> Self {\n        self.clone()\n    }\n\n    fn __deepcopy__(&self, _memo: &Bound<'_, PyDict>) -> Self {\n        self.clone()\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use std::sync::{Arc, RwLock};\n\n    use pyo3::prelude::*;\n    use tk::decoders::metaspace::Metaspace;\n    use tk::decoders::DecoderWrapper;\n\n    use crate::decoders::{CustomDecoder, PyDecoder, PyDecoderWrapper};\n\n    #[test]\n    fn get_subtype() {\n        Python::attach(|py| {\n            let py_dec = PyDecoder::new(Metaspace::default().into());\n            let py_meta = py_dec.get_as_subtype(py).unwrap();\n            assert_eq!(\"Metaspace\", py_meta.bind(py).get_type().qualname().unwrap());\n        })\n    }\n\n    #[test]\n    fn serialize() {\n        let py_wrapped: PyDecoderWrapper = Metaspace::default().into();\n        let py_ser = serde_json::to_string(&py_wrapped).unwrap();\n        let rs_wrapped = DecoderWrapper::Metaspace(Metaspace::default());\n        let rs_ser = serde_json::to_string(&rs_wrapped).unwrap();\n        assert_eq!(py_ser, rs_ser);\n        let py_dec: PyDecoder = serde_json::from_str(&rs_ser).unwrap();\n        match py_dec.decoder {\n            PyDecoderWrapper::Wrapped(msp) => match *msp.as_ref().read().unwrap() {\n                DecoderWrapper::Metaspace(_) => {}\n                _ => panic!(\"Expected Metaspace\"),\n            },\n            _ => panic!(\"Expected wrapped, not custom.\"),\n        }\n\n        let obj = Python::attach(|py| {\n            let py_msp = PyDecoder::new(Metaspace::default().into());\n            Py::new(py, py_msp).unwrap().into_any()\n        });\n        let py_seq = PyDecoderWrapper::Custom(Arc::new(RwLock::new(CustomDecoder::new(obj))));\n        assert!(serde_json::to_string(&py_seq).is_err());\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/encoding.rs",
    "content": "use pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse tk::tokenizer::{Offsets, PaddingDirection};\nuse tk::utils::truncation::TruncationDirection;\nuse tokenizers as tk;\n\nuse crate::error::{deprecation_warning, PyError};\n\n/// The :class:`~tokenizers.Encoding` represents the output of a :class:`~tokenizers.Tokenizer`.\n#[pyclass(dict, module = \"tokenizers\", name = \"Encoding\")]\n#[repr(transparent)]\npub struct PyEncoding {\n    pub encoding: tk::tokenizer::Encoding,\n}\n\nimpl From<tk::tokenizer::Encoding> for PyEncoding {\n    fn from(v: tk::tokenizer::Encoding) -> Self {\n        Self { encoding: v }\n    }\n}\n\n#[pymethods]\nimpl PyEncoding {\n    #[new]\n    #[pyo3(signature = (), text_signature = \"(self)\")]\n    fn new() -> Self {\n        Self {\n            encoding: tk::tokenizer::Encoding::default(),\n        }\n    }\n\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.encoding).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle Encoding: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                self.encoding = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle Encoding: {e}\"\n                    ))\n                })?;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        Ok(format!(\n            \"Encoding(num_tokens={}, attributes=[ids, type_ids, tokens, offsets, \\\n             attention_mask, special_tokens_mask, overflowing])\",\n            self.encoding.get_ids().len()\n        ))\n    }\n\n    fn __len__(&self) -> PyResult<usize> {\n        Ok(self.encoding.len())\n    }\n\n    /// Merge the list of encodings into one final :class:`~tokenizers.Encoding`\n    ///\n    /// Args:\n    ///     encodings (A :obj:`List` of :class:`~tokenizers.Encoding`):\n    ///         The list of encodings that should be merged in one\n    ///\n    ///     growing_offsets (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether the offsets should accumulate while merging\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Encoding`: The resulting Encoding\n    #[staticmethod]\n    #[pyo3(signature = (encodings, growing_offsets = true) -> \"Encoding\")]\n    #[pyo3(text_signature = \"(encodings, growing_offsets=True)\")]\n    fn merge(encodings: Vec<PyRef<PyEncoding>>, growing_offsets: bool) -> PyEncoding {\n        tk::tokenizer::Encoding::merge(\n            encodings.into_iter().map(|e| e.encoding.clone()),\n            growing_offsets,\n        )\n        .into()\n    }\n\n    /// The number of sequences represented\n    ///\n    /// Returns:\n    ///     :obj:`int`: The number of sequences in this :class:`~tokenizers.Encoding`\n    #[getter]\n    fn get_n_sequences(&self) -> usize {\n        self.encoding.n_sequences()\n    }\n\n    /// Set the given sequence index\n    ///\n    /// Set the given sequence index for the whole range of tokens contained in this\n    /// :class:`~tokenizers.Encoding`.\n    #[pyo3(text_signature = \"(self, sequence_id)\")]\n    fn set_sequence_id(&mut self, sequence_id: usize) {\n        self.encoding.set_sequence_id(sequence_id);\n    }\n\n    /// The generated IDs\n    ///\n    /// The IDs are the main input to a Language Model. They are the token indices,\n    /// the numerical representations that a LM understands.\n    ///\n    /// Returns:\n    ///     :obj:`List[int]`: The list of IDs\n    #[getter]\n    fn get_ids(&self) -> Vec<u32> {\n        self.encoding.get_ids().to_vec()\n    }\n\n    /// The generated tokens\n    ///\n    /// They are the string representation of the IDs.\n    ///\n    /// Returns:\n    ///     :obj:`List[str]`: The list of tokens\n    #[getter]\n    fn get_tokens(&self) -> Vec<String> {\n        self.encoding.get_tokens().to_vec()\n    }\n\n    /// The generated word indices.\n    ///\n    /// .. warning::\n    ///     This is deprecated and will be removed in a future version.\n    ///     Please use :obj:`~tokenizers.Encoding.word_ids` instead.\n    ///\n    /// They represent the index of the word associated to each token.\n    /// When the input is pre-tokenized, they correspond to the ID of the given input label,\n    /// otherwise they correspond to the words indices as defined by the\n    /// :class:`~tokenizers.pre_tokenizers.PreTokenizer` that was used.\n    ///\n    /// For special tokens and such (any token that was generated from something that was\n    /// not part of the input), the output is :obj:`None`\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :obj:`Optional[int]`: A list of optional word index.\n    #[getter]\n    fn get_words(&self, py: Python<'_>) -> PyResult<Vec<Option<u32>>> {\n        deprecation_warning(\n            py,\n            \"0.9.4\",\n            \"Encoding.words is deprecated, please use Encoding.word_ids instead.\",\n        )?;\n        Ok(self.get_word_ids())\n    }\n\n    /// The generated word indices.\n    ///\n    /// They represent the index of the word associated to each token.\n    /// When the input is pre-tokenized, they correspond to the ID of the given input label,\n    /// otherwise they correspond to the words indices as defined by the\n    /// :class:`~tokenizers.pre_tokenizers.PreTokenizer` that was used.\n    ///\n    /// For special tokens and such (any token that was generated from something that was\n    /// not part of the input), the output is :obj:`None`\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :obj:`Optional[int]`: A list of optional word index.\n    #[getter]\n    fn get_word_ids(&self) -> Vec<Option<u32>> {\n        self.encoding.get_word_ids().to_vec()\n    }\n\n    /// The generated sequence indices.\n    ///\n    /// They represent the index of the input sequence associated to each token.\n    /// The sequence id can be None if the token is not related to any input sequence,\n    /// like for example with special tokens.\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :obj:`Optional[int]`: A list of optional sequence index.\n    #[getter]\n    fn get_sequence_ids(&self) -> Vec<Option<usize>> {\n        self.encoding.get_sequence_ids()\n    }\n\n    /// The generated type IDs\n    ///\n    /// Generally used for tasks like sequence classification or question answering,\n    /// these tokens let the LM know which input sequence corresponds to each tokens.\n    ///\n    /// Returns:\n    ///     :obj:`List[int]`: The list of type ids\n    #[getter]\n    fn get_type_ids(&self) -> Vec<u32> {\n        self.encoding.get_type_ids().to_vec()\n    }\n\n    /// The offsets associated to each token\n    ///\n    /// These offsets let's you slice the input string, and thus retrieve the original\n    /// part that led to producing the corresponding token.\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :obj:`Tuple[int, int]`: The list of offsets\n    #[getter]\n    fn get_offsets(&self) -> Vec<(usize, usize)> {\n        self.encoding.get_offsets().to_vec()\n    }\n\n    /// The special token mask\n    ///\n    /// This indicates which tokens are special tokens, and which are not.\n    ///\n    /// Returns:\n    ///     :obj:`List[int]`: The special tokens mask\n    #[getter]\n    fn get_special_tokens_mask(&self) -> Vec<u32> {\n        self.encoding.get_special_tokens_mask().to_vec()\n    }\n\n    /// The attention mask\n    ///\n    /// This indicates to the LM which tokens should be attended to, and which should not.\n    /// This is especially important when batching sequences, where we need to applying\n    /// padding.\n    ///\n    /// Returns:\n    ///    :obj:`List[int]`: The attention mask\n    #[getter]\n    fn get_attention_mask(&self) -> Vec<u32> {\n        self.encoding.get_attention_mask().to_vec()\n    }\n\n    /// A :obj:`List` of overflowing :class:`~tokenizers.Encoding`\n    ///\n    /// When using truncation, the :class:`~tokenizers.Tokenizer` takes care of splitting\n    /// the output into as many pieces as required to match the specified maximum length.\n    /// This field lets you retrieve all the subsequent pieces.\n    ///\n    /// When you use pairs of sequences, the overflowing pieces will contain enough\n    /// variations to cover all the possible combinations, while respecting the provided\n    /// maximum length.\n    #[getter]\n    fn get_overflowing(&self) -> Vec<PyEncoding> {\n        self.encoding\n            .get_overflowing()\n            .clone()\n            .into_iter()\n            .map(|e| e.into())\n            .collect()\n    }\n\n    /// Get the encoded tokens corresponding to the word at the given index\n    /// in one of the input sequences.\n    ///\n    /// Args:\n    ///     word_index (:obj:`int`):\n    ///         The index of a word in one of the input sequences.\n    ///     sequence_index (:obj:`int`, defaults to :obj:`0`):\n    ///         The index of the sequence that contains the target word\n    ///\n    /// Returns:\n    ///     :obj:`Tuple[int, int]`: The range of tokens: :obj:`(first, last + 1)`\n    #[pyo3(signature = (word_index, sequence_index = 0))]\n    #[pyo3(text_signature = \"(self, word_index, sequence_index=0)\")]\n    fn word_to_tokens(&self, word_index: u32, sequence_index: usize) -> Option<(usize, usize)> {\n        self.encoding.word_to_tokens(word_index, sequence_index)\n    }\n\n    /// Get the offsets of the word at the given index in one of the input sequences.\n    ///\n    /// Args:\n    ///     word_index (:obj:`int`):\n    ///         The index of a word in one of the input sequences.\n    ///     sequence_index (:obj:`int`, defaults to :obj:`0`):\n    ///         The index of the sequence that contains the target word\n    ///\n    /// Returns:\n    ///     :obj:`Tuple[int, int]`: The range of characters (span) :obj:`(first, last + 1)`\n    #[pyo3(signature = (word_index, sequence_index = 0))]\n    #[pyo3(text_signature = \"(self, word_index, sequence_index=0)\")]\n    fn word_to_chars(&self, word_index: u32, sequence_index: usize) -> Option<Offsets> {\n        self.encoding.word_to_chars(word_index, sequence_index)\n    }\n\n    /// Get the index of the sequence represented by the given token.\n    ///\n    /// In the general use case, this method returns :obj:`0` for a single sequence or\n    /// the first sequence of a pair, and :obj:`1` for the second sequence of a pair\n    ///\n    /// Args:\n    ///     token_index (:obj:`int`):\n    ///         The index of a token in the encoded sequence.\n    ///\n    /// Returns:\n    ///     :obj:`int`: The sequence id of the given token\n    #[pyo3(text_signature = \"(self, token_index)\")]\n    fn token_to_sequence(&self, token_index: usize) -> Option<usize> {\n        self.encoding.token_to_sequence(token_index)\n    }\n\n    /// Get the offsets of the token at the given index.\n    ///\n    /// The returned offsets are related to the input sequence that contains the\n    /// token.  In order to determine in which input sequence it belongs, you\n    /// must call :meth:`~tokenizers.Encoding.token_to_sequence()`.\n    ///\n    /// Args:\n    ///     token_index (:obj:`int`):\n    ///         The index of a token in the encoded sequence.\n    ///\n    /// Returns:\n    ///     :obj:`Tuple[int, int]`: The token offsets :obj:`(first, last + 1)`\n    #[pyo3(text_signature = \"(self, token_index)\")]\n    fn token_to_chars(&self, token_index: usize) -> Option<Offsets> {\n        let (_, offsets) = self.encoding.token_to_chars(token_index)?;\n        Some(offsets)\n    }\n\n    /// Get the index of the word that contains the token in one of the input sequences.\n    ///\n    /// The returned word index is related to the input sequence that contains\n    /// the token.  In order to determine in which input sequence it belongs, you\n    /// must call :meth:`~tokenizers.Encoding.token_to_sequence()`.\n    ///\n    /// Args:\n    ///     token_index (:obj:`int`):\n    ///         The index of a token in the encoded sequence.\n    ///\n    /// Returns:\n    ///     :obj:`int`: The index of the word in the relevant input sequence.\n    #[pyo3(text_signature = \"(self, token_index)\")]\n    fn token_to_word(&self, token_index: usize) -> Option<u32> {\n        let (_, word_idx) = self.encoding.token_to_word(token_index)?;\n        Some(word_idx)\n    }\n\n    /// Get the token that contains the char at the given position in the input sequence.\n    ///\n    /// Args:\n    ///     char_pos (:obj:`int`):\n    ///         The position of a char in the input string\n    ///     sequence_index (:obj:`int`, defaults to :obj:`0`):\n    ///         The index of the sequence that contains the target char\n    ///\n    /// Returns:\n    ///     :obj:`int`: The index of the token that contains this char in the encoded sequence\n    #[pyo3(signature = (char_pos, sequence_index = 0))]\n    #[pyo3(text_signature = \"(self, char_pos, sequence_index=0)\")]\n    fn char_to_token(&self, char_pos: usize, sequence_index: usize) -> Option<usize> {\n        self.encoding.char_to_token(char_pos, sequence_index)\n    }\n\n    /// Get the word that contains the char at the given position in the input sequence.\n    ///\n    /// Args:\n    ///     char_pos (:obj:`int`):\n    ///         The position of a char in the input string\n    ///     sequence_index (:obj:`int`, defaults to :obj:`0`):\n    ///         The index of the sequence that contains the target char\n    ///\n    /// Returns:\n    ///     :obj:`int`: The index of the word that contains this char in the input sequence\n    #[pyo3(signature = (char_pos, sequence_index = 0))]\n    #[pyo3(text_signature = \"(self, char_pos, sequence_index=0)\")]\n    fn char_to_word(&self, char_pos: usize, sequence_index: usize) -> Option<u32> {\n        self.encoding.char_to_word(char_pos, sequence_index)\n    }\n\n    /// Pad the :class:`~tokenizers.Encoding` at the given length\n    ///\n    /// Args:\n    ///     length (:obj:`int`):\n    ///         The desired length\n    ///\n    ///     direction: (:obj:`str`, defaults to :obj:`right`):\n    ///         The expected padding direction. Can be either :obj:`right` or :obj:`left`\n    ///\n    ///     pad_id (:obj:`int`, defaults to :obj:`0`):\n    ///         The ID corresponding to the padding token\n    ///\n    ///     pad_type_id (:obj:`int`, defaults to :obj:`0`):\n    ///         The type ID corresponding to the padding token\n    ///\n    ///     pad_token (:obj:`str`, defaults to `[PAD]`):\n    ///         The pad token to use\n    #[pyo3(signature = (length, **kwargs) -> \"None\")]\n    #[pyo3(\n        text_signature = \"(self, length, direction='right', pad_id=0, pad_type_id=0, pad_token='[PAD]')\"\n    )]\n    fn pad(&mut self, length: usize, kwargs: Option<&Bound<'_, PyDict>>) -> PyResult<()> {\n        let mut pad_id = 0;\n        let mut pad_type_id = 0;\n        let mut pad_token = \"[PAD]\".to_string();\n        let mut direction = PaddingDirection::Right;\n\n        if let Some(kwargs) = kwargs {\n            for (key, value) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"direction\" => {\n                        let value: String = value.extract()?;\n                        direction = match value.as_ref() {\n                            \"left\" => Ok(PaddingDirection::Left),\n                            \"right\" => Ok(PaddingDirection::Right),\n                            other => Err(PyError(format!(\n                                \"Unknown `direction`: `{other}`. Use \\\n                                 one of `left` or `right`\"\n                            ))\n                            .into_pyerr::<exceptions::PyValueError>()),\n                        }?;\n                    }\n                    \"pad_id\" => pad_id = value.extract()?,\n                    \"pad_type_id\" => pad_type_id = value.extract()?,\n                    \"pad_token\" => pad_token = value.extract()?,\n                    _ => println!(\"Ignored unknown kwarg option {key}\"),\n                }\n            }\n        }\n        self.encoding\n            .pad(length, pad_id, pad_type_id, &pad_token, direction);\n        Ok(())\n    }\n\n    /// Truncate the :class:`~tokenizers.Encoding` at the given length\n    ///\n    /// If this :class:`~tokenizers.Encoding` represents multiple sequences, when truncating\n    /// this information is lost. It will be considered as representing a single sequence.\n    ///\n    /// Args:\n    ///     max_length (:obj:`int`):\n    ///         The desired length\n    ///\n    ///     stride (:obj:`int`, defaults to :obj:`0`):\n    ///         The length of previous content to be included in each overflowing piece\n    ///\n    ///     direction (:obj:`str`, defaults to :obj:`right`):\n    ///         Truncate direction\n    #[pyo3(signature = (max_length, stride = 0, direction = \"right\") -> \"None\")]\n    #[pyo3(text_signature = \"(self, max_length, stride=0, direction='right')\")]\n    fn truncate(&mut self, max_length: usize, stride: usize, direction: &str) -> PyResult<()> {\n        let tdir = match direction {\n            \"left\" => Ok(TruncationDirection::Left),\n            \"right\" => Ok(TruncationDirection::Right),\n            _ => Err(\n                PyError(format!(\"Invalid truncation direction value : {direction}\"))\n                    .into_pyerr::<exceptions::PyValueError>(),\n            ),\n        }?;\n\n        self.encoding.truncate(max_length, stride, tdir);\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/error.rs",
    "content": "use pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::type_object::PyTypeInfo;\nuse std::ffi::CString;\nuse std::fmt::{Display, Formatter, Result as FmtResult};\nuse tokenizers::tokenizer::Result;\n\n#[derive(Debug)]\npub struct PyError(pub String);\nimpl PyError {\n    #[allow(dead_code)]\n    pub fn from(s: &str) -> Self {\n        PyError(String::from(s))\n    }\n    pub fn into_pyerr<T: PyTypeInfo>(self) -> PyErr {\n        PyErr::new::<T, _>(format!(\"{self}\"))\n    }\n}\nimpl Display for PyError {\n    fn fmt(&self, fmt: &mut Formatter) -> FmtResult {\n        write!(fmt, \"{}\", self.0)\n    }\n}\nimpl std::error::Error for PyError {}\n\npub struct ToPyResult<T>(pub Result<T>);\nimpl<T> From<ToPyResult<T>> for PyResult<T> {\n    fn from(v: ToPyResult<T>) -> Self {\n        v.0.map_err(|e| exceptions::PyException::new_err(format!(\"{e}\")))\n    }\n}\nimpl<T> ToPyResult<T> {\n    pub fn into_py(self) -> PyResult<T> {\n        self.into()\n    }\n}\n\npub(crate) fn deprecation_warning(py: Python<'_>, version: &str, message: &str) -> PyResult<()> {\n    let deprecation_warning = py.import(\"builtins\")?.getattr(\"DeprecationWarning\")?;\n    let full_message = format!(\"Deprecated in {version}: {message}\");\n    pyo3::PyErr::warn(py, &deprecation_warning, &CString::new(full_message)?, 0)\n}\n"
  },
  {
    "path": "bindings/python/src/lib.rs",
    "content": "#![warn(clippy::all)]\n#![allow(clippy::upper_case_acronyms)]\n// Many false positives with pyo3 it seems &str, and &PyAny get flagged\n#![allow(clippy::borrow_deref_ref)]\n\nextern crate tokenizers as tk;\n\nuse once_cell::sync::Lazy;\nuse std::sync::Arc;\nuse tokio::runtime::Runtime;\n\n// We create a global runtime that will be initialized once when first needed\n// This ensures we always have a runtime available for tokio::task::spawn_blocking\nstatic TOKIO_RUNTIME: Lazy<Arc<Runtime>> = Lazy::new(|| {\n    let rt = tokio::runtime::Builder::new_multi_thread()\n        .enable_all()\n        .build()\n        .expect(\"Failed to create global Tokio runtime\");\n    Arc::new(rt)\n});\nmod decoders;\nmod encoding;\nmod error;\nmod models;\nmod normalizers;\nmod pre_tokenizers;\nmod processors;\nmod token;\nmod tokenizer;\nmod trainers;\nmod utils;\n\nuse pyo3::prelude::*;\npub const VERSION: &str = env!(\"CARGO_PKG_VERSION\");\n\n// For users using multiprocessing in python, it is quite easy to fork the process running\n// tokenizers, ending up with a deadlock because we internally make use of multithreading. So\n// we register a callback to be called in the event of a fork to disable parallelism.\n#[cfg(target_family = \"unix\")]\nstatic mut REGISTERED_FORK_CALLBACK: bool = false;\n#[cfg(target_family = \"unix\")]\nextern \"C\" fn child_after_fork() {\n    use tk::parallelism::*;\n    if has_parallelism_been_used() && !is_parallelism_configured() {\n        set_parallelism(false);\n    }\n}\n\n/// Tokenizers Module\n#[pymodule]\npub mod tokenizers {\n    use super::*;\n\n    #[pymodule_export]\n    pub use super::encoding::PyEncoding;\n    #[pymodule_export]\n    pub use super::token::PyToken;\n    #[pymodule_export]\n    pub use super::tokenizer::PyAddedToken;\n    #[pymodule_export]\n    pub use super::tokenizer::PyTokenizer;\n    #[pymodule_export]\n    pub use super::utils::PyNormalizedString;\n    #[pymodule_export]\n    pub use super::utils::PyPreTokenizedString;\n    #[pymodule_export]\n    pub use super::utils::PyRegex;\n\n    #[pymodule_export]\n    pub use super::decoders::decoders;\n    #[pymodule_export]\n    pub use super::models::models;\n    #[pymodule_export]\n    pub use super::normalizers::normalizers;\n    #[pymodule_export]\n    pub use super::pre_tokenizers::pre_tokenizers;\n    #[pymodule_export]\n    pub use super::processors::processors;\n    #[pymodule_export]\n    pub use super::trainers::trainers;\n\n    #[allow(non_upper_case_globals)]\n    #[pymodule_export]\n    pub const __version__: &str = env!(\"CARGO_PKG_VERSION\");\n\n    #[pymodule_init]\n    fn init(_m: &Bound<'_, PyModule>) -> PyResult<()> {\n        let _ = env_logger::try_init_from_env(\"TOKENIZERS_LOG\");\n\n        // Register the fork callback\n        #[cfg(target_family = \"unix\")]\n        unsafe {\n            if !REGISTERED_FORK_CALLBACK {\n                libc::pthread_atfork(None, None, Some(child_after_fork));\n                REGISTERED_FORK_CALLBACK = true;\n            }\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/models.rs",
    "content": "use std::collections::HashMap;\nuse std::path::{Path, PathBuf};\nuse std::sync::{Arc, RwLock};\n\nuse crate::token::PyToken;\nuse crate::trainers::PyTrainer;\nuse ahash::AHashMap;\nuse pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse serde::{Deserialize, Serialize};\nuse tk::models::bpe::{BpeBuilder, Merges, BPE};\nuse tk::models::unigram::Unigram;\nuse tk::models::wordlevel::WordLevel;\nuse tk::models::wordpiece::{WordPiece, WordPieceBuilder};\nuse tk::models::ModelWrapper;\nuse tk::{Model, Token};\nuse tokenizers as tk;\n\nuse super::error::{deprecation_warning, ToPyResult};\n\n/// Base class for all models\n///\n/// The model represents the actual tokenization algorithm. This is the part that\n/// will contain and manage the learned vocabulary.\n///\n/// This class cannot be constructed directly. Please use one of the concrete models.\n#[pyclass(module = \"tokenizers.models\", name = \"Model\", subclass, from_py_object)]\n#[derive(Clone, Serialize, Deserialize)]\n#[serde(transparent)]\npub struct PyModel {\n    pub model: Arc<RwLock<ModelWrapper>>,\n}\n\nimpl PyModel {\n    pub(crate) fn get_as_subtype(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        let base = self.clone();\n        Ok(match *self.model.as_ref().read().unwrap() {\n            ModelWrapper::BPE(_) => Py::new(py, (PyBPE {}, base))?.into_any(),\n            ModelWrapper::WordPiece(_) => Py::new(py, (PyWordPiece {}, base))?.into_any(),\n            ModelWrapper::WordLevel(_) => Py::new(py, (PyWordLevel {}, base))?.into_any(),\n            ModelWrapper::Unigram(_) => Py::new(py, (PyUnigram {}, base))?.into_any(),\n        })\n    }\n}\n\nimpl Model for PyModel {\n    type Trainer = PyTrainer;\n\n    fn tokenize(&self, tokens: &str) -> tk::Result<Vec<Token>> {\n        self.model.read().unwrap().tokenize(tokens)\n    }\n\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.model.read().unwrap().token_to_id(token)\n    }\n\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.model.read().unwrap().id_to_token(id)\n    }\n\n    fn get_vocab(&self) -> HashMap<String, u32> {\n        self.model.read().unwrap().get_vocab()\n    }\n\n    fn get_vocab_size(&self) -> usize {\n        self.model.read().unwrap().get_vocab_size()\n    }\n\n    fn save(&self, folder: &Path, name: Option<&str>) -> tk::Result<Vec<PathBuf>> {\n        self.model.read().unwrap().save(folder, name)\n    }\n\n    fn get_trainer(&self) -> Self::Trainer {\n        self.model.read().unwrap().get_trainer().into()\n    }\n}\n\nimpl<I> From<I> for PyModel\nwhere\n    I: Into<ModelWrapper>,\n{\n    fn from(model: I) -> Self {\n        Self {\n            model: Arc::new(RwLock::new(model.into())),\n        }\n    }\n}\n\n#[pymethods]\nimpl PyModel {\n    #[new]\n    #[pyo3(signature = () -> \"Model\", text_signature = \"(self)\")]\n    fn __new__() -> Self {\n        // Instantiate a default empty model. This doesn't really make sense, but we need\n        // to be able to instantiate an empty model for pickle capabilities.\n        PyModel {\n            model: Arc::new(RwLock::new(BPE::default().into())),\n        }\n    }\n\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.model).map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while attempting to pickle Model: {e}\"))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                self.model = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle Model: {e}\"\n                    ))\n                })?;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    /// Tokenize a sequence\n    ///\n    /// Args:\n    ///     sequence (:obj:`str`):\n    ///         A sequence to tokenize\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :class:`~tokenizers.Token`: The generated tokens\n    #[pyo3(text_signature = \"(self, sequence)\")]\n    fn tokenize(&self, sequence: &str) -> PyResult<Vec<PyToken>> {\n        Ok(ToPyResult(self.model.read().unwrap().tokenize(sequence))\n            .into_py()?\n            .into_iter()\n            .map(|t| t.into())\n            .collect())\n    }\n\n    /// Get the ID associated to a token\n    ///\n    /// Args:\n    ///     token (:obj:`str`):\n    ///         A token to convert to an ID\n    ///\n    /// Returns:\n    ///     :obj:`int`: The ID associated to the token\n    #[pyo3(text_signature = \"(self, tokens)\")]\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.model.read().unwrap().token_to_id(token)\n    }\n\n    /// Get the token associated to an ID\n    ///\n    /// Args:\n    ///     id (:obj:`int`):\n    ///         An ID to convert to a token\n    ///\n    /// Returns:\n    ///     :obj:`str`: The token associated to the ID\n    #[pyo3(text_signature = \"(self, id)\")]\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.model.read().unwrap().id_to_token(id)\n    }\n\n    /// Save the current model\n    ///\n    /// Save the current model in the given folder, using the given prefix for the various\n    /// files that will get created.\n    /// Any file with the same name that already exists in this folder will be overwritten.\n    ///\n    /// Args:\n    ///     folder (:obj:`str`):\n    ///         The path to the target folder in which to save the various files\n    ///\n    ///     prefix (:obj:`str`, `optional`):\n    ///         An optional prefix, used to prefix each file name\n    ///\n    /// Returns:\n    ///     :obj:`List[str]`: The list of saved files\n    #[pyo3(signature = (folder, prefix=None, name=None) -> \"list[str]\", text_signature = \"(self, folder, prefix)\")]\n    fn save<'a>(\n        &self,\n        py: Python<'_>,\n        folder: &str,\n        mut prefix: Option<&'a str>,\n        name: Option<&'a str>,\n    ) -> PyResult<Vec<String>> {\n        if name.is_some() {\n            deprecation_warning(\n                py,\n                \"0.10.0\",\n                \"Parameter `name` of Model.save has been renamed `prefix`\",\n            )?;\n            if prefix.is_none() {\n                prefix = name;\n            }\n        }\n\n        let saved: PyResult<Vec<_>> =\n            ToPyResult(self.model.read().unwrap().save(Path::new(folder), prefix)).into();\n\n        Ok(saved?\n            .into_iter()\n            .map(|path| path.to_string_lossy().into_owned())\n            .collect())\n    }\n\n    /// Get the associated :class:`~tokenizers.trainers.Trainer`\n    ///\n    /// Retrieve the :class:`~tokenizers.trainers.Trainer` associated to this\n    /// :class:`~tokenizers.models.Model`.\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.trainers.Trainer`: The Trainer used to train this model\n    #[pyo3(text_signature = \"(self)\")]\n    fn get_trainer(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        PyTrainer::from(self.model.read().unwrap().get_trainer()).get_as_subtype(py)\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n}\n\n/// An implementation of the BPE (Byte-Pair Encoding) algorithm\n///\n/// Args:\n///     vocab (:obj:`Dict[str, int]`, `optional`):\n///         A dictionary of string keys and their ids :obj:`{\"am\": 0,...}`\n///\n///     merges (:obj:`List[Tuple[str, str]]`, `optional`):\n///         A list of pairs of tokens (:obj:`Tuple[str, str]`) :obj:`[(\"a\", \"b\"),...]`\n///\n///     cache_capacity (:obj:`int`, `optional`):\n///         The number of words that the BPE cache can contain. The cache allows\n///         to speed-up the process by keeping the result of the merge operations\n///         for a number of words.\n///\n///     dropout (:obj:`float`, `optional`):\n///         A float between 0 and 1 that represents the BPE dropout to use.\n///\n///     unk_token (:obj:`str`, `optional`):\n///         The unknown token to be used by the model.\n///\n///     continuing_subword_prefix (:obj:`str`, `optional`):\n///         The prefix to attach to subword units that don't represent a beginning of word.\n///\n///     end_of_word_suffix (:obj:`str`, `optional`):\n///         The suffix to attach to subword units that represent an end of word.\n///\n///     fuse_unk (:obj:`bool`, `optional`):\n///         Whether to fuse any subsequent unknown tokens into a single one\n///\n///     byte_fallback (:obj:`bool`, `optional`):\n///         Whether to use spm byte-fallback trick (defaults to False)\n///\n///     ignore_merges (:obj:`bool`, `optional`):\n///         Whether or not to match tokens with the vocab before using merges.\n#[pyclass(extends=PyModel, module = \"tokenizers.models\", name = \"BPE\")]\npub struct PyBPE {}\n\nimpl PyBPE {\n    fn with_builder(\n        mut builder: BpeBuilder,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<(Self, PyModel)> {\n        if let Some(kwargs) = kwargs {\n            for (key, value) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"cache_capacity\" => builder = builder.cache_capacity(value.extract()?),\n                    \"dropout\" => {\n                        if let Some(dropout) = value.extract()? {\n                            builder = builder.dropout(dropout);\n                        }\n                    }\n                    \"unk_token\" => {\n                        if let Some(unk) = value.extract()? {\n                            builder = builder.unk_token(unk);\n                        }\n                    }\n                    \"continuing_subword_prefix\" => {\n                        builder = builder.continuing_subword_prefix(value.extract()?)\n                    }\n                    \"end_of_word_suffix\" => builder = builder.end_of_word_suffix(value.extract()?),\n                    \"fuse_unk\" => builder = builder.fuse_unk(value.extract()?),\n                    \"byte_fallback\" => builder = builder.byte_fallback(value.extract()?),\n                    \"ignore_merges\" => builder = builder.ignore_merges(value.extract()?),\n                    _ => println!(\"Ignored unknown kwarg option {key}\"),\n                };\n            }\n        }\n\n        match builder.build() {\n            Err(e) => Err(exceptions::PyException::new_err(format!(\n                \"Error while initializing BPE: {e}\"\n            ))),\n            Ok(bpe) => Ok((PyBPE {}, bpe.into())),\n        }\n    }\n}\n\nmacro_rules! getter {\n    ($self: ident, $variant: ident, $($name: tt)+) => {{\n        let super_ = $self.as_ref();\n        let model = super_.model.read().unwrap();\n        if let ModelWrapper::$variant(ref mo) = *model {\n            mo.$($name)+\n        } else {\n            unreachable!()\n        }\n    }};\n}\n\nmacro_rules! setter {\n    ($self: ident, $variant: ident, $name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        let mut model = super_.model.write().unwrap();\n        if let ModelWrapper::$variant(ref mut mo) = *model {\n            mo.$name = $value;\n        }\n    }};\n}\n\n#[derive(FromPyObject)]\nenum PyVocab {\n    Vocab(HashMap<String, u32>),\n    Filename(String),\n}\n\n#[derive(FromPyObject)]\nenum PyMerges {\n    Merges(Merges),\n    Filename(String),\n}\n\n#[pymethods]\nimpl PyBPE {\n    #[getter]\n    fn get_dropout(self_: PyRef<Self>) -> Option<f32> {\n        getter!(self_, BPE, dropout)\n    }\n\n    #[setter]\n    fn set_dropout(self_: PyRef<Self>, dropout: Option<f32>) {\n        setter!(self_, BPE, dropout, dropout);\n    }\n\n    #[getter]\n    fn get_unk_token(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, BPE, unk_token.clone())\n    }\n\n    #[setter]\n    fn set_unk_token(self_: PyRef<Self>, unk_token: Option<String>) {\n        setter!(self_, BPE, unk_token, unk_token);\n    }\n\n    #[getter]\n    fn get_continuing_subword_prefix(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, BPE, continuing_subword_prefix.clone())\n    }\n\n    #[setter]\n    fn set_continuing_subword_prefix(\n        self_: PyRef<Self>,\n        continuing_subword_prefix: Option<String>,\n    ) {\n        setter!(\n            self_,\n            BPE,\n            continuing_subword_prefix,\n            continuing_subword_prefix\n        );\n    }\n\n    #[getter]\n    fn get_end_of_word_suffix(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, BPE, end_of_word_suffix.clone())\n    }\n\n    #[setter]\n    fn set_end_of_word_suffix(self_: PyRef<Self>, end_of_word_suffix: Option<String>) {\n        setter!(self_, BPE, end_of_word_suffix, end_of_word_suffix);\n    }\n\n    #[getter]\n    fn get_fuse_unk(self_: PyRef<Self>) -> bool {\n        getter!(self_, BPE, fuse_unk)\n    }\n\n    #[setter]\n    fn set_fuse_unk(self_: PyRef<Self>, fuse_unk: bool) {\n        setter!(self_, BPE, fuse_unk, fuse_unk);\n    }\n\n    #[getter]\n    fn get_byte_fallback(self_: PyRef<Self>) -> bool {\n        getter!(self_, BPE, byte_fallback)\n    }\n\n    #[setter]\n    fn set_byte_fallback(self_: PyRef<Self>, byte_fallback: bool) {\n        setter!(self_, BPE, byte_fallback, byte_fallback);\n    }\n    #[getter]\n    fn get_ignore_merges(self_: PyRef<Self>) -> bool {\n        getter!(self_, BPE, ignore_merges)\n    }\n\n    #[setter]\n    fn set_ignore_merges(self_: PyRef<Self>, ignore_merges: bool) {\n        setter!(self_, BPE, ignore_merges, ignore_merges);\n    }\n    #[new]\n    #[pyo3(\n        signature = (vocab=None, merges=None, **kwargs),\n        text_signature = \"(self, vocab=None, merges=None, cache_capacity=None, dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=None, byte_fallback=False, ignore_merges=False)\")]\n    fn new(\n        _py: Python<'_>,\n        vocab: Option<PyVocab>,\n        merges: Option<PyMerges>,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<(Self, PyModel)> {\n        if (vocab.is_some() && merges.is_none()) || (vocab.is_none() && merges.is_some()) {\n            return Err(exceptions::PyValueError::new_err(\n                \"`vocab` and `merges` must be both specified\",\n            ));\n        }\n\n        let mut builder = BPE::builder();\n        if let (Some(vocab), Some(merges)) = (vocab, merges) {\n            match (vocab, merges) {\n                (PyVocab::Vocab(vocab), PyMerges::Merges(merges)) => {\n                    let vocab: AHashMap<_, _> = vocab.into_iter().collect();\n                    builder = builder.vocab_and_merges(vocab, merges);\n                }\n                (PyVocab::Filename(vocab_filename), PyMerges::Filename(merges_filename)) => {\n                    builder =\n                        builder.files(vocab_filename.to_string(), merges_filename.to_string());\n                }\n                _ => {\n                    return Err(exceptions::PyValueError::new_err(\n                        \"`vocab` and `merges` must be both be from memory or both filenames\",\n                    ));\n                }\n            }\n        }\n\n        PyBPE::with_builder(builder, kwargs)\n    }\n\n    /// Read a :obj:`vocab.json` and a :obj:`merges.txt` files\n    ///\n    /// This method provides a way to read and parse the content of these files,\n    /// returning the relevant data structures. If you want to instantiate some BPE models\n    /// from memory, this method gives you the expected input from the standard files.\n    ///\n    /// Args:\n    ///     vocab (:obj:`str`):\n    ///         The path to a :obj:`vocab.json` file\n    ///\n    ///     merges (:obj:`str`):\n    ///         The path to a :obj:`merges.txt` file\n    ///\n    /// Returns:\n    ///     A :obj:`Tuple` with the vocab and the merges:\n    ///         The vocabulary and merges loaded into memory\n    #[staticmethod]\n    #[pyo3(text_signature = \"(vocab, merges)\")]\n    fn read_file(vocab: &str, merges: &str) -> PyResult<(HashMap<String, u32>, Merges)> {\n        let (vocab, merges) = BPE::read_file(vocab, merges).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while reading vocab & merges files: {e}\"\n            ))\n        })?;\n        let vocab = vocab.into_iter().collect();\n        Ok((vocab, merges))\n    }\n\n    /// Instantiate a BPE model from the given files.\n    ///\n    /// This method is roughly equivalent to doing::\n    ///\n    ///    vocab, merges = BPE.read_file(vocab_filename, merges_filename)\n    ///    bpe = BPE(vocab, merges)\n    ///\n    /// If you don't need to keep the :obj:`vocab, merges` values lying around,\n    /// this method is more optimized than manually calling\n    /// :meth:`~tokenizers.models.BPE.read_file` to initialize a :class:`~tokenizers.models.BPE`\n    ///\n    /// Args:\n    ///     vocab (:obj:`str`):\n    ///         The path to a :obj:`vocab.json` file\n    ///\n    ///     merges (:obj:`str`):\n    ///         The path to a :obj:`merges.txt` file\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.models.BPE`: An instance of BPE loaded from these files\n    #[classmethod]\n    #[pyo3(signature = (vocab, merges, **kwargs) -> \"BPE\")]\n    #[pyo3(text_signature = \"(vocab, merges, **kwargs)\")]\n    fn from_file(\n        _cls: &Bound<'_, PyType>,\n        py: Python,\n        vocab: &str,\n        merges: &str,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<Py<Self>> {\n        let (vocab, merges) = BPE::read_file(vocab, merges).map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while reading BPE files: {e}\"))\n        })?;\n        let vocab = vocab.into_iter().collect();\n        Py::new(\n            py,\n            PyBPE::new(\n                py,\n                Some(PyVocab::Vocab(vocab)),\n                Some(PyMerges::Merges(merges)),\n                kwargs,\n            )?,\n        )\n    }\n\n    /// Clears the internal cache\n    #[pyo3(signature = () -> \"None\")]\n    #[pyo3(text_signature = \"(self)\")]\n    fn _clear_cache(self_: PyRef<Self>) -> PyResult<()> {\n        let super_ = self_.as_ref();\n        let mut model = super_.model.write().map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while clearing BPE cache: {e}\"))\n        })?;\n        model.clear_cache();\n        Ok(())\n    }\n\n    /// Resize the internal cache\n    #[pyo3(signature = (capacity) -> \"None\")]\n    #[pyo3(text_signature = \"(self, capacity)\")]\n    fn _resize_cache(self_: PyRef<Self>, capacity: usize) -> PyResult<()> {\n        let super_ = self_.as_ref();\n        let mut model = super_.model.write().map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while resizing BPE cache: {e}\"))\n        })?;\n        model.resize_cache(capacity);\n        Ok(())\n    }\n}\n\n/// An implementation of the WordPiece algorithm\n///\n/// Args:\n///     vocab (:obj:`Dict[str, int]`, `optional`):\n///         A dictionary of string keys and their ids :obj:`{\"am\": 0,...}`\n///\n///     unk_token (:obj:`str`, `optional`):\n///         The unknown token to be used by the model.\n///\n///     max_input_chars_per_word (:obj:`int`, `optional`):\n///         The maximum number of characters to authorize in a single word.\n#[pyclass(extends=PyModel, module = \"tokenizers.models\", name = \"WordPiece\")]\npub struct PyWordPiece {}\n\nimpl PyWordPiece {\n    fn with_builder(\n        mut builder: WordPieceBuilder,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<(Self, PyModel)> {\n        if let Some(kwargs) = kwargs {\n            for (key, val) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"unk_token\" => {\n                        builder = builder.unk_token(val.extract()?);\n                    }\n                    \"max_input_chars_per_word\" => {\n                        builder = builder.max_input_chars_per_word(val.extract()?);\n                    }\n                    \"continuing_subword_prefix\" => {\n                        builder = builder.continuing_subword_prefix(val.extract()?);\n                    }\n                    _ => println!(\"Ignored unknown kwargs option {key}\"),\n                }\n            }\n        }\n\n        match builder.build() {\n            Err(e) => Err(exceptions::PyException::new_err(format!(\n                \"Error while initializing WordPiece: {e}\"\n            ))),\n            Ok(wordpiece) => Ok((PyWordPiece {}, wordpiece.into())),\n        }\n    }\n}\n\n#[pymethods]\nimpl PyWordPiece {\n    #[getter]\n    fn get_unk_token(self_: PyRef<Self>) -> String {\n        getter!(self_, WordPiece, unk_token.clone())\n    }\n\n    #[setter]\n    fn set_unk_token(self_: PyRef<Self>, unk_token: String) {\n        setter!(self_, WordPiece, unk_token, unk_token);\n    }\n\n    #[getter]\n    fn get_continuing_subword_prefix(self_: PyRef<Self>) -> String {\n        getter!(self_, WordPiece, continuing_subword_prefix.clone())\n    }\n\n    #[setter]\n    fn set_continuing_subword_prefix(self_: PyRef<Self>, continuing_subword_prefix: String) {\n        setter!(\n            self_,\n            WordPiece,\n            continuing_subword_prefix,\n            continuing_subword_prefix\n        );\n    }\n\n    #[getter]\n    fn get_max_input_chars_per_word(self_: PyRef<Self>) -> usize {\n        getter!(self_, WordPiece, max_input_chars_per_word)\n    }\n\n    #[setter]\n    fn set_max_input_chars_per_word(self_: PyRef<Self>, max: usize) {\n        setter!(self_, WordPiece, max_input_chars_per_word, max);\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (vocab=None, **kwargs),\n        text_signature = \"(self, vocab=None, unk_token='[UNK]', max_input_chars_per_word=100, continuing_subword_prefix='##')\"\n    )]\n    fn new(\n        _py: Python<'_>,\n        vocab: Option<PyVocab>,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<(Self, PyModel)> {\n        let mut builder = WordPiece::builder();\n\n        if let Some(vocab) = vocab {\n            match vocab {\n                PyVocab::Vocab(vocab) => {\n                    let vocab: AHashMap<_, _> = vocab.into_iter().collect();\n                    builder = builder.vocab(vocab);\n                }\n                PyVocab::Filename(vocab_filename) => {\n                    builder = builder.files(vocab_filename.to_string());\n                }\n            }\n        }\n\n        PyWordPiece::with_builder(builder, kwargs)\n    }\n\n    /// Read a :obj:`vocab.txt` file\n    ///\n    /// This method provides a way to read and parse the content of a standard `vocab.txt`\n    /// file as used by the WordPiece Model, returning the relevant data structures. If you\n    /// want to instantiate some WordPiece models from memory, this method gives you the\n    /// expected input from the standard files.\n    ///\n    /// Args:\n    ///     vocab (:obj:`str`):\n    ///         The path to a :obj:`vocab.txt` file\n    ///\n    /// Returns:\n    ///     :obj:`Dict[str, int]`: The vocabulary as a :obj:`dict`\n    #[staticmethod]\n    #[pyo3(text_signature = \"(vocab)\")]\n    fn read_file(vocab: &str) -> PyResult<HashMap<String, u32>> {\n        let vocab = WordPiece::read_file(vocab).map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while reading WordPiece file: {e}\"))\n        })?;\n        Ok(vocab.into_iter().collect())\n    }\n\n    /// Instantiate a WordPiece model from the given file\n    ///\n    /// This method is roughly equivalent to doing::\n    ///\n    ///     vocab = WordPiece.read_file(vocab_filename)\n    ///     wordpiece = WordPiece(vocab)\n    ///\n    /// If you don't need to keep the :obj:`vocab` values lying around, this method is\n    /// more optimized than manually calling :meth:`~tokenizers.models.WordPiece.read_file` to\n    /// initialize a :class:`~tokenizers.models.WordPiece`\n    ///\n    /// Args:\n    ///     vocab (:obj:`str`):\n    ///         The path to a :obj:`vocab.txt` file\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.models.WordPiece`: An instance of WordPiece loaded from file\n    #[classmethod]\n    #[pyo3(signature = (vocab, **kwargs) -> \"WordPiece\")]\n    #[pyo3(text_signature = \"(vocab, **kwargs)\")]\n    fn from_file(\n        _cls: &Bound<'_, PyType>,\n        py: Python,\n        vocab: &str,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<Py<Self>> {\n        let vocab = WordPiece::read_file(vocab).map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while reading WordPiece file: {e}\"))\n        })?;\n        let vocab = vocab.into_iter().collect();\n        Py::new(\n            py,\n            PyWordPiece::new(py, Some(PyVocab::Vocab(vocab)), kwargs)?,\n        )\n    }\n}\n\n/// An implementation of the WordLevel algorithm\n///\n/// Most simple tokenizer model based on mapping tokens to their corresponding id.\n///\n/// Args:\n///     vocab (:obj:`str`, `optional`):\n///         A dictionary of string keys and their ids :obj:`{\"am\": 0,...}`\n///\n///     unk_token (:obj:`str`, `optional`):\n///         The unknown token to be used by the model.\n#[pyclass(extends=PyModel, module = \"tokenizers.models\", name = \"WordLevel\")]\npub struct PyWordLevel {}\n\n#[pymethods]\nimpl PyWordLevel {\n    #[getter]\n    fn get_unk_token(self_: PyRef<Self>) -> String {\n        getter!(self_, WordLevel, unk_token.clone())\n    }\n\n    #[setter]\n    fn set_unk_token(self_: PyRef<Self>, unk_token: String) {\n        setter!(self_, WordLevel, unk_token, unk_token);\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (vocab=None, unk_token = None),\n        text_signature = \"(self, vocab=None, unk_token=None)\"\n    )]\n    fn new(\n        _py: Python<'_>,\n        vocab: Option<PyVocab>,\n        unk_token: Option<String>,\n    ) -> PyResult<(Self, PyModel)> {\n        let mut builder = WordLevel::builder();\n\n        if let Some(vocab) = vocab {\n            match vocab {\n                PyVocab::Vocab(vocab) => {\n                    let vocab = vocab.into_iter().collect();\n                    builder = builder.vocab(vocab);\n                }\n                PyVocab::Filename(vocab_filename) => {\n                    builder = builder.files(vocab_filename.to_string());\n                }\n            };\n        }\n        if let Some(unk_token) = unk_token {\n            builder = builder.unk_token(unk_token);\n        }\n\n        Ok((\n            PyWordLevel {},\n            builder\n                .build()\n                .map_err(|e| exceptions::PyException::new_err(e.to_string()))?\n                .into(),\n        ))\n    }\n\n    /// Read a :obj:`vocab.json`\n    ///\n    /// This method provides a way to read and parse the content of a vocabulary file,\n    /// returning the relevant data structures. If you want to instantiate some WordLevel models\n    /// from memory, this method gives you the expected input from the standard files.\n    ///\n    /// Args:\n    ///     vocab (:obj:`str`):\n    ///         The path to a :obj:`vocab.json` file\n    ///\n    /// Returns:\n    ///     :obj:`Dict[str, int]`: The vocabulary as a :obj:`dict`\n    #[staticmethod]\n    #[pyo3(text_signature = \"(vocab)\")]\n    fn read_file(vocab: &str) -> PyResult<HashMap<String, u32>> {\n        let vocab = WordLevel::read_file(vocab).map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while reading WordLevel file: {e}\"))\n        })?;\n        let vocab: HashMap<_, _> = vocab.into_iter().collect();\n        Ok(vocab)\n    }\n\n    /// Instantiate a WordLevel model from the given file\n    ///\n    /// This method is roughly equivalent to doing::\n    ///\n    ///     vocab = WordLevel.read_file(vocab_filename)\n    ///     wordlevel = WordLevel(vocab)\n    ///\n    /// If you don't need to keep the :obj:`vocab` values lying around, this method is\n    /// more optimized than manually calling :meth:`~tokenizers.models.WordLevel.read_file` to\n    /// initialize a :class:`~tokenizers.models.WordLevel`\n    ///\n    /// Args:\n    ///     vocab (:obj:`str`):\n    ///         The path to a :obj:`vocab.json` file\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.models.WordLevel`: An instance of WordLevel loaded from file\n    #[classmethod]\n    #[pyo3(signature = (vocab, unk_token = None)-> \"WordLevel\")]\n    #[pyo3(text_signature = \"(vocab, unk_token=None)\")]\n    fn from_file(\n        _cls: &Bound<'_, PyType>,\n        py: Python,\n        vocab: &str,\n        unk_token: Option<String>,\n    ) -> PyResult<Py<Self>> {\n        let vocab = WordLevel::read_file(vocab).map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while reading WordLevel file: {e}\"))\n        })?;\n        let vocab = vocab.into_iter().collect();\n        Py::new(\n            py,\n            PyWordLevel::new(py, Some(PyVocab::Vocab(vocab)), unk_token)?,\n        )\n    }\n}\n\n/// An implementation of the Unigram algorithm\n///\n/// Args:\n///     vocab (:obj:`List[Tuple[str, float]]`, `optional`, `optional`):\n///         A list of vocabulary items and their relative score [(\"am\", -0.2442),...]\n#[pyclass(extends=PyModel, module = \"tokenizers.models\", name = \"Unigram\")]\npub struct PyUnigram {}\n\n#[pymethods]\nimpl PyUnigram {\n    #[new]\n    #[pyo3(signature = (vocab=None, unk_id=None, byte_fallback=None), text_signature = \"(self, vocab=None, unk_id=None, byte_fallback=None)\")]\n    fn new(\n        vocab: Option<Vec<(String, f64)>>,\n        unk_id: Option<usize>,\n        byte_fallback: Option<bool>,\n    ) -> PyResult<(Self, PyModel)> {\n        match (vocab, unk_id, byte_fallback) {\n            (Some(vocab), unk_id, byte_fallback) => {\n                let model =\n                    Unigram::from(vocab, unk_id, byte_fallback.unwrap_or(false)).map_err(|e| {\n                        exceptions::PyException::new_err(format!(\n                            \"Error while loading Unigram: {e}\"\n                        ))\n                    })?;\n                Ok((PyUnigram {}, model.into()))\n            }\n            (None, None, _) => Ok((PyUnigram {}, Unigram::default().into())),\n            _ => Err(exceptions::PyValueError::new_err(\n                \"`vocab` and `unk_id` must be both specified\",\n            )),\n        }\n    }\n\n    /// Clears the internal cache\n    #[pyo3(signature = () -> \"None\")]\n    #[pyo3(text_signature = \"(self)\")]\n    fn _clear_cache(self_: PyRef<Self>) -> PyResult<()> {\n        let super_ = self_.as_ref();\n        let mut model = super_.model.write().map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while clearing Unigram cache: {e}\"))\n        })?;\n        model.clear_cache();\n        Ok(())\n    }\n\n    /// Resize the internal cache\n    #[pyo3(signature = (capacity) -> \"None\")]\n    #[pyo3(text_signature = \"(self, capacity)\")]\n    fn _resize_cache(self_: PyRef<Self>, capacity: usize) -> PyResult<()> {\n        let super_ = self_.as_ref();\n        let mut model = super_.model.write().map_err(|e| {\n            exceptions::PyException::new_err(format!(\"Error while resizing Unigram cache: {e}\"))\n        })?;\n        model.resize_cache(capacity);\n        Ok(())\n    }\n}\n\n/// Models Module\n#[pymodule]\npub mod models {\n    #[pymodule_export]\n    pub use super::PyBPE;\n    #[pymodule_export]\n    pub use super::PyModel;\n    #[pymodule_export]\n    pub use super::PyUnigram;\n    #[pymodule_export]\n    pub use super::PyWordLevel;\n    #[pymodule_export]\n    pub use super::PyWordPiece;\n}\n\n#[cfg(test)]\nmod test {\n    use crate::models::PyModel;\n    use pyo3::prelude::*;\n    use tk::models::bpe::BPE;\n    use tk::models::ModelWrapper;\n\n    #[test]\n    fn get_subtype() {\n        Python::attach(|py| {\n            let py_model = PyModel::from(BPE::default());\n            let py_bpe = py_model.get_as_subtype(py).unwrap();\n            assert_eq!(\"BPE\", py_bpe.bind(py).get_type().qualname().unwrap());\n        })\n    }\n\n    #[test]\n    fn serialize() {\n        let rs_bpe = BPE::default();\n        let rs_bpe_ser = serde_json::to_string(&rs_bpe).unwrap();\n        let rs_wrapper: ModelWrapper = rs_bpe.into();\n        let rs_wrapper_ser = serde_json::to_string(&rs_wrapper).unwrap();\n\n        let py_model = PyModel::from(rs_wrapper);\n        let py_ser = serde_json::to_string(&py_model).unwrap();\n        assert_eq!(py_ser, rs_bpe_ser);\n        assert_eq!(py_ser, rs_wrapper_ser);\n\n        let py_model: PyModel = serde_json::from_str(&rs_bpe_ser).unwrap();\n        match *py_model.model.as_ref().read().unwrap() {\n            ModelWrapper::BPE(_) => (),\n            _ => panic!(\"Expected Bert postprocessor.\"),\n        };\n\n        let py_model: PyModel = serde_json::from_str(&rs_wrapper_ser).unwrap();\n        match *py_model.model.as_ref().read().unwrap() {\n            ModelWrapper::BPE(_) => (),\n            _ => panic!(\"Expected Bert postprocessor.\"),\n        };\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/normalizers.rs",
    "content": "use pyo3::exceptions::PyException;\nuse pyo3::types::*;\nuse pyo3::{exceptions, prelude::*};\nuse std::sync::{Arc, RwLock};\n\nuse crate::error::ToPyResult;\nuse crate::utils::{PyNormalizedString, PyNormalizedStringRefMut, PyPattern};\nuse serde::ser::SerializeStruct;\nuse serde::{Deserialize, Deserializer, Serialize, Serializer};\nuse tk::normalizers::{\n    BertNormalizer, ByteLevel, Lowercase, Nmt, NormalizerWrapper, Precompiled, Prepend, Replace,\n    Strip, StripAccents, NFC, NFD, NFKC, NFKD,\n};\nuse tk::{NormalizedString, Normalizer};\nuse tokenizers as tk;\n\n/// Represents the different kind of NormalizedString we can receive from Python:\n///  - Owned: Created in Python and owned by Python\n///  - RefMut: A mutable reference to a NormalizedString owned by Rust\n#[derive(FromPyObject)]\nenum PyNormalizedStringMut<'p> {\n    Owned(PyRefMut<'p, PyNormalizedString>),\n    RefMut(PyNormalizedStringRefMut),\n}\n\nimpl PyNormalizedStringMut<'_> {\n    /// Normalized the underlying `NormalizedString` using the provided normalizer\n    pub fn normalize_with<N>(&mut self, normalizer: &N) -> PyResult<()>\n    where\n        N: Normalizer,\n    {\n        match self {\n            PyNormalizedStringMut::Owned(ref mut n) => normalizer.normalize(&mut n.normalized),\n            PyNormalizedStringMut::RefMut(n) => n.map_as_mut(|n| normalizer.normalize(n))?,\n        }\n        .map_err(|e| exceptions::PyException::new_err(format!(\"{e}\")))\n    }\n}\n\n/// Base class for all normalizers\n///\n/// This class is not supposed to be instantiated directly. Instead, any implementation of a\n/// Normalizer will return an instance of this class when instantiated.\n#[pyclass(\n    dict,\n    module = \"tokenizers.normalizers\",\n    name = \"Normalizer\",\n    subclass,\n    from_py_object\n)]\n#[derive(Clone, Debug, Serialize, Deserialize)]\n#[serde(transparent)]\npub struct PyNormalizer {\n    pub(crate) normalizer: PyNormalizerTypeWrapper,\n}\n\nimpl PyNormalizer {\n    pub(crate) fn new(normalizer: PyNormalizerTypeWrapper) -> Self {\n        PyNormalizer { normalizer }\n    }\n    pub(crate) fn get_as_subtype(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        let base = self.clone();\n        Ok(match self.normalizer {\n            PyNormalizerTypeWrapper::Sequence(_) => Py::new(py, (PySequence {}, base))?.into_any(),\n            PyNormalizerTypeWrapper::Single(ref inner) => match &*inner\n                .as_ref()\n                .read()\n                .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\"))?\n            {\n                PyNormalizerWrapper::Custom(_) => {\n                    Py::new(py, base)?.into_any()\n                }\n                PyNormalizerWrapper::Wrapped(ref inner) => match inner {\n                    NormalizerWrapper::Sequence(_) => Py::new(py, (PySequence {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::BertNormalizer(_) => {\n                        Py::new(py, (PyBertNormalizer {}, base))?.into_any()\n                    }\n                    NormalizerWrapper::StripNormalizer(_) => Py::new(py, (PyStrip {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::Prepend(_) => Py::new(py, (PyPrepend {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::ByteLevel(_) => Py::new(py, (PyByteLevel {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::StripAccents(_) => Py::new(py, (PyStripAccents {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::NFC(_) => Py::new(py, (PyNFC {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::NFD(_) => Py::new(py, (PyNFD {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::NFKC(_) => Py::new(py, (PyNFKC {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::NFKD(_) => Py::new(py, (PyNFKD {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::Lowercase(_) => Py::new(py, (PyLowercase {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::Precompiled(_) => Py::new(py, (PyPrecompiled {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::Replace(_) => Py::new(py, (PyReplace {}, base))?\n                        .into_any(),\n                    NormalizerWrapper::Nmt(_) => Py::new(py, (PyNmt {}, base))?\n                        .into_any(),\n                },\n            },\n        })\n    }\n}\n\nimpl Normalizer for PyNormalizer {\n    fn normalize(&self, normalized: &mut NormalizedString) -> tk::Result<()> {\n        self.normalizer.normalize(normalized)\n    }\n}\n\n#[pymethods]\nimpl PyNormalizer {\n    #[staticmethod]\n    #[pyo3(text_signature = \"(normalizer)\")]\n    fn custom(obj: Py<PyAny>) -> Self {\n        Self {\n            normalizer: PyNormalizerWrapper::Custom(CustomNormalizer::new(obj)).into(),\n        }\n    }\n\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.normalizer).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle Normalizer: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                self.normalizer = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle Normalizer: {e}\"\n                    ))\n                })?;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    /// Normalize a :class:`~tokenizers.NormalizedString` in-place\n    ///\n    /// This method allows to modify a :class:`~tokenizers.NormalizedString` to\n    /// keep track of the alignment information. If you just want to see the result\n    /// of the normalization on a raw string, you can use\n    /// :meth:`~tokenizers.normalizers.Normalizer.normalize_str`\n    ///\n    /// Args:\n    ///     normalized (:class:`~tokenizers.NormalizedString`):\n    ///         The normalized string on which to apply this\n    ///         :class:`~tokenizers.normalizers.Normalizer`\n    #[pyo3(text_signature = \"(self, normalized)\")]\n    fn normalize(&self, mut normalized: PyNormalizedStringMut) -> PyResult<()> {\n        normalized.normalize_with(&self.normalizer)\n    }\n\n    /// Normalize the given string\n    ///\n    /// This method provides a way to visualize the effect of a\n    /// :class:`~tokenizers.normalizers.Normalizer` but it does not keep track of the alignment\n    /// information. If you need to get/convert offsets, you can use\n    /// :meth:`~tokenizers.normalizers.Normalizer.normalize`\n    ///\n    /// Args:\n    ///     sequence (:obj:`str`):\n    ///         A string to normalize\n    ///\n    /// Returns:\n    ///     :obj:`str`: A string after normalization\n    #[pyo3(text_signature = \"(self, sequence)\")]\n    fn normalize_str(&self, sequence: &str) -> PyResult<String> {\n        let mut normalized = NormalizedString::from(sequence);\n        ToPyResult(self.normalizer.normalize(&mut normalized)).into_py()?;\n        Ok(normalized.get().to_owned())\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n}\n\nmacro_rules! getter {\n    ($self: ident, $variant: ident, $name: ident) => {{\n        let super_ = $self.as_ref();\n        if let PyNormalizerTypeWrapper::Single(ref norm) = super_.normalizer {\n            let wrapper = norm.read().expect(\n                \"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\",\n            );\n            if let PyNormalizerWrapper::Wrapped(NormalizerWrapper::$variant(o)) = (&*wrapper) {\n                o.$name.clone()\n            } else {\n                unreachable!()\n            }\n        } else {\n            unreachable!()\n        }\n    }};\n}\n\nmacro_rules! setter {\n    ($self: ident, $variant: ident, $name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyNormalizerTypeWrapper::Single(ref norm) = super_.normalizer {\n            let mut wrapper = norm.write().expect(\n                \"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\",\n            );\n            if let PyNormalizerWrapper::Wrapped(NormalizerWrapper::$variant(ref mut o)) = *wrapper {\n                o.$name = $value;\n            }\n        }\n    }};\n}\n\n/// BertNormalizer\n///\n/// Takes care of normalizing raw text before giving it to a Bert model.\n/// This includes cleaning the text, handling accents, chinese chars and lowercasing\n///\n/// Args:\n///     clean_text (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to clean the text, by removing any control characters\n///         and replacing all whitespaces by the classic one.\n///\n///     handle_chinese_chars (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to handle chinese chars by putting spaces around them.\n///\n///     strip_accents (:obj:`bool`, `optional`):\n///         Whether to strip all accents. If this option is not specified (ie == None),\n///         then it will be determined by the value for `lowercase` (as in the original Bert).\n///\n///     lowercase (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to lowercase.\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"BertNormalizer\")]\npub struct PyBertNormalizer {}\n#[pymethods]\nimpl PyBertNormalizer {\n    #[getter]\n    fn get_clean_text(self_: PyRef<Self>) -> bool {\n        getter!(self_, BertNormalizer, clean_text)\n    }\n\n    #[setter]\n    fn set_clean_text(self_: PyRef<Self>, clean_text: bool) {\n        setter!(self_, BertNormalizer, clean_text, clean_text);\n    }\n\n    #[getter]\n    fn get_handle_chinese_chars(self_: PyRef<Self>) -> bool {\n        getter!(self_, BertNormalizer, handle_chinese_chars)\n    }\n\n    #[setter]\n    fn set_handle_chinese_chars(self_: PyRef<Self>, handle_chinese_chars: bool) {\n        setter!(\n            self_,\n            BertNormalizer,\n            handle_chinese_chars,\n            handle_chinese_chars\n        );\n    }\n\n    #[getter]\n    fn get_strip_accents(self_: PyRef<Self>) -> Option<bool> {\n        getter!(self_, BertNormalizer, strip_accents)\n    }\n\n    #[setter]\n    fn set_strip_accents(self_: PyRef<Self>, strip_accents: Option<bool>) {\n        setter!(self_, BertNormalizer, strip_accents, strip_accents);\n    }\n\n    #[getter]\n    fn get_lowercase(self_: PyRef<Self>) -> bool {\n        getter!(self_, BertNormalizer, lowercase)\n    }\n\n    #[setter]\n    fn set_lowercase(self_: PyRef<Self>, lowercase: bool) {\n        setter!(self_, BertNormalizer, lowercase, lowercase)\n    }\n\n    #[new]\n    #[pyo3(signature = (\n        clean_text = true,\n        handle_chinese_chars = true,\n        strip_accents = None,\n        lowercase = true\n    ),\n        text_signature = \"(self, clean_text=True, handle_chinese_chars=True, strip_accents=None, lowercase=True)\")]\n    fn new(\n        clean_text: bool,\n        handle_chinese_chars: bool,\n        strip_accents: Option<bool>,\n        lowercase: bool,\n    ) -> (Self, PyNormalizer) {\n        let normalizer =\n            BertNormalizer::new(clean_text, handle_chinese_chars, strip_accents, lowercase);\n        (PyBertNormalizer {}, normalizer.into())\n    }\n}\n\n/// NFD Unicode Normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"NFD\")]\npub struct PyNFD {}\n#[pymethods]\nimpl PyNFD {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyNFD {}, PyNormalizer::new(NFD.into()))\n    }\n}\n\n/// NFKD Unicode Normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"NFKD\")]\npub struct PyNFKD {}\n#[pymethods]\nimpl PyNFKD {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyNFKD {}, NFKD.into())\n    }\n}\n\n/// NFC Unicode Normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"NFC\")]\npub struct PyNFC {}\n#[pymethods]\nimpl PyNFC {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyNFC {}, NFC.into())\n    }\n}\n\n/// NFKC Unicode Normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"NFKC\")]\npub struct PyNFKC {}\n#[pymethods]\nimpl PyNFKC {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyNFKC {}, NFKC.into())\n    }\n}\n\n/// Allows concatenating multiple other Normalizer as a Sequence.\n/// All the normalizers run in sequence in the given order\n///\n/// Args:\n///     normalizers (:obj:`List[Normalizer]`):\n///         A list of Normalizer to be run as a sequence\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Sequence\")]\npub struct PySequence {}\n\n#[pymethods]\nimpl PySequence {\n    #[new]\n    #[pyo3(signature = (normalizers), text_signature = \"(self, normalizers)\")]\n    fn new(normalizers: &Bound<'_, PyList>) -> PyResult<(Self, PyNormalizer)> {\n        let mut sequence = Vec::with_capacity(normalizers.len());\n        for n in normalizers.iter() {\n            let normalizer: PyRef<PyNormalizer> = n.extract()?;\n            match &normalizer.normalizer {\n                PyNormalizerTypeWrapper::Sequence(inner) => sequence.extend(inner.iter().cloned()),\n                PyNormalizerTypeWrapper::Single(inner) => sequence.push(inner.clone()),\n            }\n        }\n        Ok((\n            PySequence {},\n            PyNormalizer::new(PyNormalizerTypeWrapper::Sequence(sequence)),\n        ))\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [PyList::empty(py)])\n    }\n\n    fn __len__(self_: PyRef<'_, Self>) -> usize {\n        match &self_.as_ref().normalizer {\n            PyNormalizerTypeWrapper::Sequence(inner) => inner.len(),\n            PyNormalizerTypeWrapper::Single(_) => 1,\n        }\n    }\n\n    fn __getitem__(self_: PyRef<'_, Self>, py: Python<'_>, index: usize) -> PyResult<Py<PyAny>> {\n        match &self_.as_ref().normalizer {\n            PyNormalizerTypeWrapper::Sequence(inner) => match inner.get(index) {\n                Some(item) => PyNormalizer::new(PyNormalizerTypeWrapper::Single(item.clone()))\n                    .get_as_subtype(py),\n                _ => Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                    \"Index not found\",\n                )),\n            },\n            PyNormalizerTypeWrapper::Single(inner) => {\n                PyNormalizer::new(PyNormalizerTypeWrapper::Single(inner.clone())).get_as_subtype(py)\n            }\n        }\n    }\n\n    fn __setitem__(self_: PyRef<'_, Self>, index: usize, value: Bound<'_, PyAny>) -> PyResult<()> {\n        let norm: PyNormalizer = value.extract()?;\n        let PyNormalizerTypeWrapper::Single(norm) = norm.normalizer else {\n            return Err(PyException::new_err(\"normalizer should not be a sequence\"));\n        };\n        match &self_.as_ref().normalizer {\n            PyNormalizerTypeWrapper::Sequence(inner) => match inner.get(index) {\n                Some(item) => {\n                    *item\n                        .write()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\"))? = norm\n                        .read()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\"))?\n                        .clone();\n                }\n                _ => {\n                    return Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                        \"Index not found\",\n                    ))\n                }\n            },\n            PyNormalizerTypeWrapper::Single(_) => {\n                return Err(PyException::new_err(\"normalizer is not a sequence\"))\n            }\n        };\n        Ok(())\n    }\n}\n\n/// Lowercase Normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Lowercase\")]\npub struct PyLowercase {}\n#[pymethods]\nimpl PyLowercase {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyLowercase {}, Lowercase.into())\n    }\n}\n\n/// Strip normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Strip\")]\npub struct PyStrip {}\n#[pymethods]\nimpl PyStrip {\n    #[getter]\n    fn get_left(self_: PyRef<Self>) -> bool {\n        getter!(self_, StripNormalizer, strip_left)\n    }\n\n    #[setter]\n    fn set_left(self_: PyRef<Self>, left: bool) {\n        setter!(self_, StripNormalizer, strip_left, left)\n    }\n\n    #[getter]\n    fn get_right(self_: PyRef<Self>) -> bool {\n        getter!(self_, StripNormalizer, strip_right)\n    }\n\n    #[setter]\n    fn set_right(self_: PyRef<Self>, right: bool) {\n        setter!(self_, StripNormalizer, strip_right, right)\n    }\n\n    #[new]\n    #[pyo3(signature = (left = true, right = true), text_signature = \"(self, left=True, right=True)\")]\n    fn new(left: bool, right: bool) -> (Self, PyNormalizer) {\n        (PyStrip {}, Strip::new(left, right).into())\n    }\n}\n\n/// Prepend normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Prepend\")]\npub struct PyPrepend {}\n#[pymethods]\nimpl PyPrepend {\n    #[getter]\n    fn get_prepend(self_: PyRef<Self>) -> String {\n        getter!(self_, Prepend, prepend)\n    }\n\n    #[setter]\n    fn set_prepend(self_: PyRef<Self>, prepend: String) {\n        setter!(self_, Prepend, prepend, prepend)\n    }\n\n    #[new]\n    #[pyo3(signature = (prepend=\"▁\".to_string()), text_signature = \"(self, prepend)\")]\n    fn new(prepend: String) -> (Self, PyNormalizer) {\n        (PyPrepend {}, Prepend::new(prepend).into())\n    }\n}\n\n/// Bytelevel Normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"ByteLevel\")]\npub struct PyByteLevel {}\n#[pymethods]\nimpl PyByteLevel {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyByteLevel {}, ByteLevel::new().into())\n    }\n}\n\n/// StripAccents normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"StripAccents\")]\npub struct PyStripAccents {}\n#[pymethods]\nimpl PyStripAccents {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyStripAccents {}, StripAccents.into())\n    }\n}\n\n/// Nmt normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Nmt\")]\npub struct PyNmt {}\n#[pymethods]\nimpl PyNmt {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyNormalizer) {\n        (PyNmt {}, Nmt.into())\n    }\n}\n\n/// Precompiled normalizer\n/// Don't use manually it is used for compatibility for SentencePiece.\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Precompiled\")]\npub struct PyPrecompiled {}\n#[pymethods]\nimpl PyPrecompiled {\n    #[new]\n    #[pyo3(text_signature = \"(self, precompiled_charsmap)\")]\n    fn new(precompiled_charsmap: Vec<u8>) -> PyResult<(Self, PyNormalizer)> {\n        // let precompiled_charsmap: Vec<u8> = FromPyObject::extract(py_precompiled_charsmap)?;\n        Ok((\n            PyPrecompiled {},\n            Precompiled::from(&precompiled_charsmap)\n                .map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to build Precompiled normalizer: {e}\"\n                    ))\n                })?\n                .into(),\n        ))\n    }\n}\n\n/// Replace normalizer\n#[pyclass(extends=PyNormalizer, module = \"tokenizers.normalizers\", name = \"Replace\")]\npub struct PyReplace {}\n#[pymethods]\nimpl PyReplace {\n    #[new]\n    #[pyo3(text_signature = \"(self, pattern, content)\")]\n    fn new(pattern: PyPattern, content: String) -> PyResult<(Self, PyNormalizer)> {\n        Ok((\n            PyReplace {},\n            ToPyResult(Replace::new(pattern, content)).into_py()?.into(),\n        ))\n    }\n\n    #[getter]\n    fn get_pattern(_self: PyRef<Self>) -> PyResult<()> {\n        Err(PyException::new_err(\"Cannot get pattern\"))\n    }\n\n    #[setter]\n    fn set_pattern(_self: PyRef<Self>, _pattern: PyPattern) -> PyResult<()> {\n        Err(PyException::new_err(\n            \"Cannot set pattern, please instantiate a new replace pattern instead\",\n        ))\n    }\n\n    #[getter]\n    fn get_content(self_: PyRef<Self>) -> String {\n        getter!(self_, Replace, content)\n    }\n\n    #[setter]\n    fn set_content(self_: PyRef<Self>, content: String) {\n        setter!(self_, Replace, content, content)\n    }\n}\n\n#[derive(Clone, Debug)]\npub(crate) struct CustomNormalizer {\n    inner: Py<PyAny>,\n}\nimpl CustomNormalizer {\n    pub fn new(inner: Py<PyAny>) -> Self {\n        Self { inner }\n    }\n}\n\nimpl tk::tokenizer::Normalizer for CustomNormalizer {\n    fn normalize(&self, normalized: &mut NormalizedString) -> tk::Result<()> {\n        Python::attach(|py| {\n            let normalized = PyNormalizedStringRefMut::new(normalized);\n            let py_normalized = self.inner.bind(py);\n            py_normalized.call_method(\"normalize\", (normalized.get().clone(),), None)?;\n            Ok(())\n        })\n    }\n}\n\nimpl Serialize for CustomNormalizer {\n    fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        Err(serde::ser::Error::custom(\n            \"Custom Normalizer cannot be serialized\",\n        ))\n    }\n}\n\nimpl<'de> Deserialize<'de> for CustomNormalizer {\n    fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        Err(serde::de::Error::custom(\n            \"Custom Normalizer cannot be deserialized\",\n        ))\n    }\n}\n\n#[derive(Clone, Debug, Deserialize)]\n#[serde(untagged)]\npub(crate) enum PyNormalizerWrapper {\n    Custom(CustomNormalizer),\n    Wrapped(NormalizerWrapper),\n}\n\nimpl Serialize for PyNormalizerWrapper {\n    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>\n    where\n        S: Serializer,\n    {\n        match self {\n            PyNormalizerWrapper::Wrapped(inner) => inner.serialize(serializer),\n            PyNormalizerWrapper::Custom(inner) => inner.serialize(serializer),\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub(crate) enum PyNormalizerTypeWrapper {\n    Sequence(Vec<Arc<RwLock<PyNormalizerWrapper>>>),\n    Single(Arc<RwLock<PyNormalizerWrapper>>),\n}\n\n/// XXX: we need to manually implement deserialize here because of the structure of the\n/// PyNormalizerTypeWrapper enum. Given the underlying PyNormalizerWrapper can contain a Sequence,\n/// default deserialization will give us a PyNormalizerTypeWrapper::Single(Sequence) when we'd like\n/// it to be PyNormalizerTypeWrapper::Sequence(// ...).\nimpl<'de> Deserialize<'de> for PyNormalizerTypeWrapper {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let wrapper = NormalizerWrapper::deserialize(deserializer)?;\n        let py_wrapper: PyNormalizerWrapper = wrapper.into();\n        Ok(py_wrapper.into())\n    }\n}\n\nimpl Serialize for PyNormalizerTypeWrapper {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self {\n            PyNormalizerTypeWrapper::Sequence(seq) => {\n                let mut ser = serializer.serialize_struct(\"Sequence\", 2)?;\n                ser.serialize_field(\"type\", \"Sequence\")?;\n                ser.serialize_field(\"normalizers\", seq)?;\n                ser.end()\n            }\n            PyNormalizerTypeWrapper::Single(inner) => inner.serialize(serializer),\n        }\n    }\n}\n\nimpl<I> From<I> for PyNormalizerWrapper\nwhere\n    I: Into<NormalizerWrapper>,\n{\n    fn from(norm: I) -> Self {\n        PyNormalizerWrapper::Wrapped(norm.into())\n    }\n}\n\nimpl<I> From<I> for PyNormalizerTypeWrapper\nwhere\n    I: Into<PyNormalizerWrapper>,\n{\n    fn from(norm: I) -> Self {\n        let norm = norm.into();\n        match norm {\n            PyNormalizerWrapper::Wrapped(NormalizerWrapper::Sequence(seq)) => {\n                PyNormalizerTypeWrapper::Sequence(\n                    seq.into_iter()\n                        .map(|e| Arc::new(RwLock::new(PyNormalizerWrapper::Wrapped(e.clone()))))\n                        .collect(),\n                )\n            }\n            _ => PyNormalizerTypeWrapper::Single(Arc::new(RwLock::new(norm))),\n        }\n    }\n}\n\nimpl<I> From<I> for PyNormalizer\nwhere\n    I: Into<NormalizerWrapper>,\n{\n    fn from(norm: I) -> Self {\n        PyNormalizer {\n            normalizer: norm.into().into(),\n        }\n    }\n}\n\nimpl Normalizer for PyNormalizerTypeWrapper {\n    fn normalize(&self, normalized: &mut NormalizedString) -> tk::Result<()> {\n        match self {\n            PyNormalizerTypeWrapper::Single(inner) => inner\n                .read()\n                .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\"))?\n                .normalize(normalized),\n            PyNormalizerTypeWrapper::Sequence(inner) => inner.iter().try_for_each(|n| {\n                n.read()\n                    .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyNormalizer\"))?\n                    .normalize(normalized)\n            }),\n        }\n    }\n}\n\nimpl Normalizer for PyNormalizerWrapper {\n    fn normalize(&self, normalized: &mut NormalizedString) -> tk::Result<()> {\n        match self {\n            PyNormalizerWrapper::Wrapped(inner) => inner.normalize(normalized),\n            PyNormalizerWrapper::Custom(inner) => inner.normalize(normalized),\n        }\n    }\n}\n\n/// Normalizers Module\n#[pymodule]\npub mod normalizers {\n    #[pymodule_export]\n    pub use super::PyBertNormalizer;\n    #[pymodule_export]\n    pub use super::PyByteLevel;\n    #[pymodule_export]\n    pub use super::PyLowercase;\n    #[pymodule_export]\n    pub use super::PyNFC;\n    #[pymodule_export]\n    pub use super::PyNFD;\n    #[pymodule_export]\n    pub use super::PyNFKC;\n    #[pymodule_export]\n    pub use super::PyNFKD;\n    #[pymodule_export]\n    pub use super::PyNmt;\n    #[pymodule_export]\n    pub use super::PyNormalizer;\n    #[pymodule_export]\n    pub use super::PyPrecompiled;\n    #[pymodule_export]\n    pub use super::PyPrepend;\n    #[pymodule_export]\n    pub use super::PyReplace;\n    #[pymodule_export]\n    pub use super::PySequence;\n    #[pymodule_export]\n    pub use super::PyStrip;\n    #[pymodule_export]\n    pub use super::PyStripAccents;\n}\n\n#[cfg(test)]\nmod test {\n    use pyo3::prelude::*;\n    use tk::normalizers::unicode::{NFC, NFKC};\n    use tk::normalizers::utils::Sequence;\n    use tk::normalizers::NormalizerWrapper;\n\n    use crate::normalizers::{PyNormalizer, PyNormalizerTypeWrapper, PyNormalizerWrapper};\n\n    #[test]\n    fn get_subtype() {\n        Python::attach(|py| {\n            let py_norm = PyNormalizer::new(NFC.into());\n            let py_nfc = py_norm.get_as_subtype(py).unwrap();\n            assert_eq!(\"NFC\", py_nfc.bind(py).get_type().qualname().unwrap());\n        })\n    }\n\n    #[test]\n    fn serialize() {\n        let py_wrapped: PyNormalizerWrapper = NFKC.into();\n        let py_ser = serde_json::to_string(&py_wrapped).unwrap();\n        let rs_wrapped = NormalizerWrapper::NFKC(NFKC);\n        let rs_ser = serde_json::to_string(&rs_wrapped).unwrap();\n        assert_eq!(py_ser, rs_ser);\n        let py_norm: PyNormalizer = serde_json::from_str(&rs_ser).unwrap();\n        match py_norm.normalizer {\n            PyNormalizerTypeWrapper::Single(inner) => match *inner.as_ref().read().unwrap() {\n                PyNormalizerWrapper::Wrapped(NormalizerWrapper::NFKC(_)) => {}\n                _ => panic!(\"Expected NFKC\"),\n            },\n            _ => panic!(\"Expected wrapped, not sequence.\"),\n        }\n\n        let py_seq: PyNormalizerWrapper = Sequence::new(vec![NFC.into(), NFKC.into()]).into();\n        let py_wrapper_ser = serde_json::to_string(&py_seq).unwrap();\n        let rs_wrapped = NormalizerWrapper::Sequence(Sequence::new(vec![NFC.into(), NFKC.into()]));\n        let rs_ser = serde_json::to_string(&rs_wrapped).unwrap();\n        assert_eq!(py_wrapper_ser, rs_ser);\n\n        let py_seq = PyNormalizer::new(py_seq.into());\n        let py_ser = serde_json::to_string(&py_seq).unwrap();\n        assert_eq!(py_wrapper_ser, py_ser);\n\n        let rs_seq = Sequence::new(vec![NFC.into(), NFKC.into()]);\n        let rs_ser = serde_json::to_string(&rs_seq).unwrap();\n        assert_eq!(py_wrapper_ser, rs_ser);\n    }\n\n    #[test]\n    fn deserialize_sequence() {\n        let string = r#\"{\"type\": \"NFKC\"}\"#;\n        let normalizer: PyNormalizer = serde_json::from_str(string).unwrap();\n        match normalizer.normalizer {\n            PyNormalizerTypeWrapper::Single(inner) => match *inner.as_ref().read().unwrap() {\n                PyNormalizerWrapper::Wrapped(NormalizerWrapper::NFKC(_)) => {}\n                _ => panic!(\"Expected NFKC\"),\n            },\n            _ => panic!(\"Expected wrapped, not sequence.\"),\n        }\n\n        let sequence_string = format!(r#\"{{\"type\": \"Sequence\", \"normalizers\": [{string}]}}\"#);\n        let normalizer: PyNormalizer = serde_json::from_str(&sequence_string).unwrap();\n\n        match normalizer.normalizer {\n            PyNormalizerTypeWrapper::Sequence(inner) => {\n                assert_eq!(inner.len(), 1);\n                match *inner[0].as_ref().read().unwrap() {\n                    PyNormalizerWrapper::Wrapped(NormalizerWrapper::NFKC(_)) => {}\n                    _ => panic!(\"Expected NFKC\"),\n                };\n            }\n            _ => panic!(\"Expected sequence\"),\n        };\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/pre_tokenizers.rs",
    "content": "use std::sync::{Arc, RwLock};\n\nuse pyo3::exceptions;\nuse pyo3::exceptions::PyException;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse serde::ser::SerializeStruct;\nuse serde::{Deserialize, Deserializer, Serialize, Serializer};\n\nuse tk::normalizer::SplitDelimiterBehavior;\nuse tk::pre_tokenizers::bert::BertPreTokenizer;\nuse tk::pre_tokenizers::byte_level::ByteLevel;\nuse tk::pre_tokenizers::delimiter::CharDelimiterSplit;\nuse tk::pre_tokenizers::digits::Digits;\nuse tk::pre_tokenizers::fixed_length::FixedLength;\nuse tk::pre_tokenizers::metaspace::{Metaspace, PrependScheme};\nuse tk::pre_tokenizers::punctuation::Punctuation;\nuse tk::pre_tokenizers::split::Split;\nuse tk::pre_tokenizers::unicode_scripts::UnicodeScripts;\nuse tk::pre_tokenizers::whitespace::{Whitespace, WhitespaceSplit};\nuse tk::pre_tokenizers::PreTokenizerWrapper;\nuse tk::tokenizer::Offsets;\nuse tk::{PreTokenizedString, PreTokenizer};\nuse tokenizers as tk;\n\nuse super::error::ToPyResult;\nuse super::utils::*;\n\n/// Base class for all pre-tokenizers\n///\n/// This class is not supposed to be instantiated directly. Instead, any implementation of a\n/// PreTokenizer will return an instance of this class when instantiated.\n#[pyclass(\n    dict,\n    module = \"tokenizers.pre_tokenizers\",\n    name = \"PreTokenizer\",\n    subclass,\n    from_py_object\n)]\n#[derive(Clone, Serialize, Deserialize)]\n#[serde(transparent)]\npub struct PyPreTokenizer {\n    pub(crate) pretok: PyPreTokenizerTypeWrapper,\n}\n\nimpl PyPreTokenizer {\n    #[allow(dead_code)]\n    pub(crate) fn new(pretok: PyPreTokenizerTypeWrapper) -> Self {\n        PyPreTokenizer { pretok }\n    }\n\n    pub(crate) fn get_as_subtype(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        let base = self.clone();\n        Ok(match self.pretok {\n            PyPreTokenizerTypeWrapper::Sequence(_) => Py::new(py, (PySequence {}, base))?\n                .into_any(),\n            PyPreTokenizerTypeWrapper::Single(ref inner) => {\n                match &*inner\n                    .as_ref()\n                    .read()\n                    .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))?\n                {\n                    PyPreTokenizerWrapper::Custom(_) => {\n                        Py::new(py, base)?.into_pyobject(py)?.into_any().into()\n                    }\n                    PyPreTokenizerWrapper::Wrapped(inner) => match inner {\n                        PreTokenizerWrapper::Whitespace(_) => Py::new(py, (PyWhitespace {}, base))?\n                            .into_any(),\n                        PreTokenizerWrapper::Split(_) => Py::new(py, (PySplit {}, base))?\n                            .into_any(),\n                        PreTokenizerWrapper::Punctuation(_) => {\n                            Py::new(py, (PyPunctuation {}, base))?\n                                .into_any()\n                        }\n                        PreTokenizerWrapper::Sequence(_) => Py::new(py, (PySequence {}, base))?\n                            .into_any(),\n                        PreTokenizerWrapper::Metaspace(_) => Py::new(py, (PyMetaspace {}, base))?\n                            .into_any(),\n                        PreTokenizerWrapper::Delimiter(_) => {\n                            Py::new(py, (PyCharDelimiterSplit {}, base))?\n                                .into_any()\n                        }\n                        PreTokenizerWrapper::WhitespaceSplit(_) => {\n                            Py::new(py, (PyWhitespaceSplit {}, base))?\n                                .into_any()\n                        }\n                        PreTokenizerWrapper::ByteLevel(_) => Py::new(py, (PyByteLevel {}, base))?\n                            .into_any(),\n                        PreTokenizerWrapper::BertPreTokenizer(_) => {\n                            Py::new(py, (PyBertPreTokenizer {}, base))?\n                                .into_any()\n                        }\n                        PreTokenizerWrapper::Digits(_) => Py::new(py, (PyDigits {}, base))?\n                            .into_any(),\n                        PreTokenizerWrapper::UnicodeScripts(_) => {\n                            Py::new(py, (PyUnicodeScripts {}, base))?\n                                .into_any()\n                        }\n                        PreTokenizerWrapper::FixedLength(_) => {\n                            Py::new(py, (PyFixedLength {}, base))?\n                                .into_any()\n                        }\n                    },\n                }\n            }\n        })\n    }\n}\n\nimpl PreTokenizer for PyPreTokenizer {\n    fn pre_tokenize(&self, normalized: &mut PreTokenizedString) -> tk::Result<()> {\n        self.pretok.pre_tokenize(normalized)\n    }\n}\n\n#[pymethods]\nimpl PyPreTokenizer {\n    #[staticmethod]\n    #[pyo3(text_signature = \"(pretok)\")]\n    fn custom(pretok: Py<PyAny>) -> Self {\n        PyPreTokenizer {\n            pretok: PyPreTokenizerWrapper::Custom(CustomPreTokenizer::new(pretok)).into(),\n        }\n    }\n\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.pretok).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle PreTokenizer: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                let unpickled = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle PreTokenizer: {e}\"\n                    ))\n                })?;\n                self.pretok = unpickled;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    /// Pre-tokenize a :class:`~tokenizers.PyPreTokenizedString` in-place\n    ///\n    /// This method allows to modify a :class:`~tokenizers.PreTokenizedString` to\n    /// keep track of the pre-tokenization, and leverage the capabilities of the\n    /// :class:`~tokenizers.PreTokenizedString`. If you just want to see the result of\n    /// the pre-tokenization of a raw string, you can use\n    /// :meth:`~tokenizers.pre_tokenizers.PreTokenizer.pre_tokenize_str`\n    ///\n    /// Args:\n    ///     pretok (:class:`~tokenizers.PreTokenizedString):\n    ///         The pre-tokenized string on which to apply this\n    ///         :class:`~tokenizers.pre_tokenizers.PreTokenizer`\n    #[pyo3(text_signature = \"(self, pretok)\")]\n    fn pre_tokenize(&self, pretok: &mut PyPreTokenizedString) -> PyResult<()> {\n        ToPyResult(self.pretok.pre_tokenize(&mut pretok.pretok)).into()\n    }\n\n    /// Pre tokenize the given string\n    ///\n    /// This method provides a way to visualize the effect of a\n    /// :class:`~tokenizers.pre_tokenizers.PreTokenizer` but it does not keep track of the\n    /// alignment, nor does it provide all the capabilities of the\n    /// :class:`~tokenizers.PreTokenizedString`. If you need some of these, you can use\n    /// :meth:`~tokenizers.pre_tokenizers.PreTokenizer.pre_tokenize`\n    ///\n    /// Args:\n    ///     sequence (:obj:`str`):\n    ///         A string to pre-tokeize\n    ///\n    /// Returns:\n    ///     :obj:`List[Tuple[str, Offsets]]`:\n    ///         A list of tuple with the pre-tokenized parts and their offsets\n    #[pyo3(text_signature = \"(self, sequence)\")]\n    fn pre_tokenize_str(&self, s: &str) -> PyResult<Vec<(String, Offsets)>> {\n        let mut pretokenized = tk::tokenizer::PreTokenizedString::from(s);\n\n        ToPyResult(self.pretok.pre_tokenize(&mut pretokenized)).into_py()?;\n\n        Ok(pretokenized\n            .get_splits(tk::OffsetReferential::Original, tk::OffsetType::Char)\n            .into_iter()\n            .map(|(s, o, _)| (s.to_owned(), o))\n            .collect())\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n}\n\nmacro_rules! getter {\n    ($self: ident, $variant: ident, $($name: tt)+) => {{\n        let super_ = $self.as_ref();\n        if let PyPreTokenizerTypeWrapper::Single(ref single) = super_.pretok {\n            if let PyPreTokenizerWrapper::Wrapped(PreTokenizerWrapper::$variant(ref pretok)) =\n                *single.read().expect(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\") {\n                    pretok.$($name)+\n                } else {\n                    unreachable!()\n                }\n        } else {\n            unreachable!()\n        }\n    }};\n}\n\nmacro_rules! setter {\n    ($self: ident, $variant: ident, $name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyPreTokenizerTypeWrapper::Single(ref single) = super_.pretok {\n            if let PyPreTokenizerWrapper::Wrapped(PreTokenizerWrapper::$variant(ref mut pretok)) =\n                *single.write().expect(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\")\n            {\n                pretok.$name = $value;\n            }\n        }\n    }};\n    ($self: ident, $variant: ident, @$name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyPreTokenizerTypeWrapper::Single(ref single) = super_.pretok {\n            if let PyPreTokenizerWrapper::Wrapped(PreTokenizerWrapper::$variant(ref mut pretok)) =\n                *single.write().expect(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\")\n            {\n                pretok.$name($value);\n            }\n        }\n    }};\n}\n\n/// ByteLevel PreTokenizer\n///\n/// This pre-tokenizer takes care of replacing all bytes of the given string\n/// with a corresponding representation, as well as splitting into words.\n///\n/// Args:\n///     add_prefix_space (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to add a space to the first word if there isn't already one. This\n///         lets us treat `hello` exactly like `say hello`.\n///     use_regex (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Set this to :obj:`False` to prevent this `pre_tokenizer` from using\n///         the GPT2 specific regexp for spliting on whitespace.\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"ByteLevel\")]\npub struct PyByteLevel {}\n#[pymethods]\nimpl PyByteLevel {\n    #[getter]\n    fn get_add_prefix_space(self_: PyRef<Self>) -> bool {\n        getter!(self_, ByteLevel, add_prefix_space)\n    }\n\n    #[setter]\n    fn set_add_prefix_space(self_: PyRef<Self>, add_prefix_space: bool) {\n        setter!(self_, ByteLevel, add_prefix_space, add_prefix_space);\n    }\n\n    #[getter]\n    fn get_use_regex(self_: PyRef<Self>) -> bool {\n        getter!(self_, ByteLevel, use_regex)\n    }\n\n    #[setter]\n    fn set_use_regex(self_: PyRef<Self>, use_regex: bool) {\n        setter!(self_, ByteLevel, use_regex, use_regex);\n    }\n\n    #[getter]\n    fn get_trim_offsets(self_: PyRef<Self>) -> bool {\n        getter!(self_, ByteLevel, trim_offsets)\n    }\n\n    #[setter]\n    fn set_trim_offsets(self_: PyRef<Self>, trim_offsets: bool) {\n        setter!(self_, ByteLevel, trim_offsets, trim_offsets)\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (add_prefix_space = true, trim_offsets = true, use_regex = true, **_kwargs),\n        text_signature = \"(self, add_prefix_space=True, trim_offsets=True, use_regex=True)\"\n    )]\n    fn new(\n        add_prefix_space: bool,\n        trim_offsets: bool,\n        use_regex: bool,\n        _kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> (Self, PyPreTokenizer) {\n        (\n            PyByteLevel {},\n            ByteLevel::default()\n                .add_prefix_space(add_prefix_space)\n                .trim_offsets(trim_offsets)\n                .use_regex(use_regex)\n                .into(),\n        )\n    }\n\n    /// Returns the alphabet used by this PreTokenizer.\n    ///\n    /// Since the ByteLevel works as its name suggests, at the byte level, it\n    /// encodes each byte value to a unique visible character. This means that there is a\n    /// total of 256 different characters composing this alphabet.\n    ///\n    /// Returns:\n    ///     :obj:`List[str]`: A list of characters that compose the alphabet\n    #[staticmethod]\n    #[pyo3(text_signature = \"()\")]\n    fn alphabet() -> Vec<String> {\n        ByteLevel::alphabet()\n            .into_iter()\n            .map(|c| c.to_string())\n            .collect()\n    }\n}\n\n/// This pre-tokenizer splits on word boundaries according to the `\\w+|[^\\w\\s]+`\n/// regex pattern. It splits on word characters or characters that aren't words or\n/// whitespaces (punctuation such as hyphens, apostrophes, commas, etc.).\n///\n/// Example:\n///     Use the `Whitespace` function as shown below::\n///\n///         ```python\n///         from tokenizers.pre_tokenizers import Whitespace\n///\n///         pre_tokenizer = Whitespace()\n///         text = \"Hello, world! Let's try the Whitespace pre-tokenizer.\"\n///         pre_tokenizer.pre_tokenize_str(text)\n///         [('Hello', (0, 5)),\n///          (',', (5, 6)),\n///          ('world', (7, 12)),\n///          ('!', (12, 13)),\n///          ('Let', (14, 17)),\n///          (\"'\", (17, 18)),\n///          ('s', (18, 19)),\n///          ('try', (20, 23)),\n///          ('the', (24, 27)),\n///          ('Whitespace', (28, 38)),\n///          ('pre', (39, 42)),\n///          ('-', (42, 43)),\n///          ('tokenizer', (43, 52)),\n///          ('.', (52, 53))]\n///         ```\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"Whitespace\")]\npub struct PyWhitespace {}\n#[pymethods]\nimpl PyWhitespace {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyPreTokenizer) {\n        (PyWhitespace {}, Whitespace {}.into())\n    }\n}\n\n/// This pre-tokenizer simply splits on the whitespace. Works like `.split()`\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"WhitespaceSplit\")]\npub struct PyWhitespaceSplit {}\n#[pymethods]\nimpl PyWhitespaceSplit {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyPreTokenizer) {\n        (PyWhitespaceSplit {}, WhitespaceSplit.into())\n    }\n}\n\n/// Split PreTokenizer\n///\n/// This versatile pre-tokenizer splits using the provided pattern and\n/// according to the provided behavior. The pattern can be inverted by\n/// making use of the invert flag.\n///\n/// Args:\n///     pattern (:obj:`str` or :class:`~tokenizers.Regex`):\n///         A pattern used to split the string. Usually a string or a regex built with `tokenizers.Regex`.\n///         If you want to use a regex pattern, it has to be wrapped around a `tokenizers.Regex`,\n///         otherwise we consider is as a string pattern. For example `pattern=\"|\"`\n///         means you want to split on `|` (imagine a csv file for example), while\n///         `pattern=tokenizers.Regex(\"1|2\")` means you split on either '1' or '2'.\n///     behavior (:class:`~tokenizers.SplitDelimiterBehavior`):\n///         The behavior to use when splitting.\n///         Choices: \"removed\", \"isolated\", \"merged_with_previous\", \"merged_with_next\",\n///         \"contiguous\"\n///\n///     invert (:obj:`bool`, `optional`, defaults to :obj:`False`):\n///         Whether to invert the pattern.\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"Split\")]\npub struct PySplit {}\n#[pymethods]\nimpl PySplit {\n    #[new]\n    #[pyo3(signature = (pattern, behavior, invert = false), text_signature = \"(self, pattern, behavior, invert=False)\")]\n    fn new(\n        pattern: PyPattern,\n        behavior: PySplitDelimiterBehavior,\n        invert: bool,\n    ) -> PyResult<(Self, PyPreTokenizer)> {\n        Ok((\n            PySplit {},\n            ToPyResult(Split::new(pattern, behavior.into(), invert))\n                .into_py()?\n                .into(),\n        ))\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [\" \", \"removed\"])\n    }\n\n    #[getter]\n    fn get_pattern(_self: PyRef<Self>) -> PyResult<()> {\n        Err(PyException::new_err(\"Cannot get pattern\"))\n    }\n\n    #[setter]\n    fn set_pattern(_self: PyRef<Self>, _pattern: PyPattern) -> PyResult<()> {\n        Err(PyException::new_err(\n            \"Cannot set pattern, please instantiate a new split pattern instead\",\n        ))\n    }\n\n    #[getter]\n    fn get_behavior(self_: PyRef<Self>) -> String {\n        getter!(self_, Split, behavior).to_string().to_lowercase()\n    }\n\n    #[setter]\n    fn set_behavior(self_: PyRef<Self>, behavior: String) -> PyResult<()> {\n        let behavior = match behavior.as_ref() {\n            \"removed\" => SplitDelimiterBehavior::Removed,\n            \"isolated\" => SplitDelimiterBehavior::Isolated,\n            \"merged_with_previous\" => SplitDelimiterBehavior::MergedWithPrevious,\n            \"merged_with_next\" => SplitDelimiterBehavior::MergedWithNext,\n            \"contiguous\" => SplitDelimiterBehavior::Contiguous,\n            _ => {\n                return Err(exceptions::PyValueError::new_err(\n                    \"Wrong value for SplitDelimiterBehavior, expected one of: \\\n                `removed, isolated, merged_with_previous, merged_with_next, contiguous`\",\n                ))\n            }\n        };\n        setter!(self_, Split, behavior, behavior);\n        Ok(())\n    }\n\n    #[getter]\n    fn get_invert(self_: PyRef<Self>) -> bool {\n        getter!(self_, Split, invert)\n    }\n\n    #[setter]\n    fn set_invert(self_: PyRef<Self>, invert: bool) {\n        setter!(self_, Split, invert, invert)\n    }\n}\n\n/// This pre-tokenizer simply splits on the provided char. Works like `.split(delimiter)`\n///\n/// Args:\n///     delimiter: str:\n///         The delimiter char that will be used to split input\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"CharDelimiterSplit\")]\npub struct PyCharDelimiterSplit {}\n#[pymethods]\nimpl PyCharDelimiterSplit {\n    #[getter]\n    fn get_delimiter(self_: PyRef<Self>) -> String {\n        getter!(self_, Delimiter, delimiter.to_string())\n    }\n\n    #[setter]\n    fn set_delimiter(self_: PyRef<Self>, delimiter: char) {\n        setter!(self_, Delimiter, delimiter, delimiter);\n    }\n\n    #[new]\n    #[pyo3(signature = (delimiter), text_signature = \"(self, delimiter)\")]\n    pub fn new(delimiter: char) -> PyResult<(Self, PyPreTokenizer)> {\n        Ok((\n            PyCharDelimiterSplit {},\n            CharDelimiterSplit::new(delimiter).into(),\n        ))\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [\" \"])\n    }\n}\n\n/// BertPreTokenizer\n///\n/// This pre-tokenizer splits tokens on spaces, and also on punctuation.\n/// Each occurrence of a punctuation character will be treated separately.\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"BertPreTokenizer\")]\npub struct PyBertPreTokenizer {}\n#[pymethods]\nimpl PyBertPreTokenizer {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyPreTokenizer) {\n        (PyBertPreTokenizer {}, BertPreTokenizer.into())\n    }\n}\n\n/// This pre-tokenizer simply splits on punctuation as individual characters.\n///\n/// Args:\n///     behavior (:class:`~tokenizers.SplitDelimiterBehavior`):\n///         The behavior to use when splitting.\n///         Choices: \"removed\", \"isolated\" (default), \"merged_with_previous\", \"merged_with_next\",\n///         \"contiguous\"\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"Punctuation\")]\npub struct PyPunctuation {}\n#[pymethods]\nimpl PyPunctuation {\n    #[new]\n    #[pyo3( signature = (behavior = PySplitDelimiterBehavior(SplitDelimiterBehavior::Isolated)), text_signature = \"(self, behavior=\\\"isolated\\\")\")]\n    fn new(behavior: PySplitDelimiterBehavior) -> (Self, PyPreTokenizer) {\n        (PyPunctuation {}, Punctuation::new(behavior.into()).into())\n    }\n\n    #[getter]\n    fn get_behavior(self_: PyRef<Self>) -> String {\n        getter!(self_, Punctuation, behavior)\n            .to_string()\n            .to_lowercase()\n    }\n\n    #[setter]\n    fn set_behavior(self_: PyRef<Self>, behavior: String) -> PyResult<()> {\n        let behavior = match behavior.as_ref() {\n            \"removed\" => SplitDelimiterBehavior::Removed,\n            \"isolated\" => SplitDelimiterBehavior::Isolated,\n            \"merged_with_previous\" => SplitDelimiterBehavior::MergedWithPrevious,\n            \"merged_with_next\" => SplitDelimiterBehavior::MergedWithNext,\n            \"contiguous\" => SplitDelimiterBehavior::Contiguous,\n            _ => {\n                return Err(exceptions::PyValueError::new_err(\n                    \"Wrong value for SplitDelimiterBehavior, expected one of: \\\n                `removed, isolated, merged_with_previous, merged_with_next, contiguous`\",\n                ))\n            }\n        };\n        setter!(self_, Punctuation, behavior, behavior);\n        Ok(())\n    }\n}\n\n/// This pre-tokenizer composes other pre_tokenizers and applies them in sequence\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"Sequence\")]\npub struct PySequence {}\n#[pymethods]\nimpl PySequence {\n    #[new]\n    #[pyo3(text_signature = \"(self, pretokenizers)\")]\n    fn new(pre_tokenizers: &Bound<'_, PyList>) -> PyResult<(Self, PyPreTokenizer)> {\n        let mut sequence = Vec::with_capacity(pre_tokenizers.len());\n        for n in pre_tokenizers.iter() {\n            let pretokenizer: PyRef<PyPreTokenizer> = n.extract()?;\n            match &pretokenizer.pretok {\n                PyPreTokenizerTypeWrapper::Sequence(inner) => {\n                    sequence.extend(inner.iter().cloned())\n                }\n                PyPreTokenizerTypeWrapper::Single(inner) => sequence.push(inner.clone()),\n            }\n        }\n        Ok((\n            PySequence {},\n            PyPreTokenizer::new(PyPreTokenizerTypeWrapper::Sequence(sequence)),\n        ))\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [PyList::empty(py)])\n    }\n\n    fn __getitem__(self_: PyRef<'_, Self>, py: Python<'_>, index: usize) -> PyResult<Py<PyAny>> {\n        match &self_.as_ref().pretok {\n            PyPreTokenizerTypeWrapper::Sequence(inner) => match inner.get(index) {\n                Some(item) => PyPreTokenizer::new(PyPreTokenizerTypeWrapper::Single(item.clone()))\n                    .get_as_subtype(py),\n                _ => Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                    \"Index not found\",\n                )),\n            },\n            _ => Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                \"This processor is not a Sequence, it does not support __getitem__\",\n            )),\n        }\n    }\n\n    fn __setitem__(self_: PyRef<'_, Self>, index: usize, value: Bound<'_, PyAny>) -> PyResult<()> {\n        let pretok: PyPreTokenizer = value.extract()?;\n        let PyPreTokenizerTypeWrapper::Single(pretok) = pretok.pretok else {\n            return Err(PyException::new_err(\n                \"pre tokenizer should not be a sequence\",\n            ));\n        };\n        match &self_.as_ref().pretok {\n            PyPreTokenizerTypeWrapper::Sequence(inner) => match inner.get(index) {\n                Some(item) => {\n                    *item\n                        .write()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))? = (*pretok\n                        .read()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))?)\n                    .clone();\n                }\n                _ => {\n                    return Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                        \"Index not found\",\n                    ))\n                }\n            },\n            PyPreTokenizerTypeWrapper::Single(_) => {\n                return Err(PyException::new_err(\"pre tokenizer is not a sequence\"))\n            }\n        };\n        Ok(())\n    }\n}\n\npub(crate) fn from_string(string: String) -> Result<PrependScheme, PyErr> {\n    let scheme = match string.as_str() {\n        \"first\" => PrependScheme::First,\n        \"never\" => PrependScheme::Never,\n        \"always\" => PrependScheme::Always,\n        _ => {\n            return Err(exceptions::PyValueError::new_err(format!(\n                \"{string} is an unknown variant, should be one of ['first', 'never', 'always']\"\n            )));\n        }\n    };\n    Ok(scheme)\n}\n\n/// Metaspace pre-tokenizer\n///\n/// This pre-tokenizer replaces any whitespace by the provided replacement character.\n/// It then tries to split on these spaces.\n///\n/// Args:\n///     replacement (:obj:`str`, `optional`, defaults to :obj:`▁`):\n///         The replacement character. Must be exactly one character. By default we\n///         use the `▁` (U+2581) meta symbol (Same as in SentencePiece).\n///\n///     prepend_scheme (:obj:`str`, `optional`, defaults to :obj:`\"always\"`):\n///         Whether to add a space to the first word if there isn't already one. This\n///         lets us treat `hello` exactly like `say hello`.\n///         Choices: \"always\", \"never\", \"first\". First means the space is only added on the first\n///         token (relevant when special tokens are used or other pre_tokenizer are used).\n///\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"Metaspace\")]\npub struct PyMetaspace {}\n#[pymethods]\nimpl PyMetaspace {\n    #[getter]\n    fn get_replacement(self_: PyRef<Self>) -> String {\n        getter!(self_, Metaspace, get_replacement().to_string())\n    }\n\n    #[setter]\n    fn set_replacement(self_: PyRef<Self>, replacement: char) {\n        setter!(self_, Metaspace, @set_replacement, replacement);\n    }\n\n    #[getter]\n    fn get_split(self_: PyRef<Self>) -> bool {\n        getter!(self_, Metaspace, get_split())\n    }\n\n    #[setter]\n    fn set_split(self_: PyRef<Self>, split: bool) {\n        setter!(self_, Metaspace, @set_split, split);\n    }\n\n    #[getter]\n    fn get_prepend_scheme(self_: PyRef<Self>) -> String {\n        // Assuming Metaspace has a method to get the prepend_scheme as a string\n        getter!(self_, Metaspace, get_prepend_scheme()).to_string()\n    }\n\n    #[setter]\n    fn set_prepend_scheme(self_: PyRef<Self>, prepend_scheme: String) -> PyResult<()> {\n        let scheme = from_string(prepend_scheme)?;\n        setter!(self_, Metaspace, @set_prepend_scheme, scheme);\n        Ok(())\n    }\n\n    #[new]\n    #[pyo3(signature = (replacement = '▁', prepend_scheme=String::from(\"always\"), split=true), text_signature = \"(self, replacement=\\\"_\\\", prepend_scheme=\\\"always\\\", split=True)\")]\n    fn new(\n        replacement: char,\n        prepend_scheme: String,\n        split: bool,\n    ) -> PyResult<(Self, PyPreTokenizer)> {\n        // Create a new Metaspace instance\n        let prepend_scheme = from_string(prepend_scheme)?;\n        let new_instance: Metaspace = Metaspace::new(replacement, prepend_scheme, split);\n        Ok((PyMetaspace {}, new_instance.into()))\n    }\n}\n\n/// This pre-tokenizer simply splits using the digits in separate tokens\n///\n/// Args:\n///     individual_digits (:obj:`bool`, `optional`, defaults to :obj:`False`):\n///         If set to True, digits will each be separated as follows::\n///\n///             \"Call 123 please\" -> \"Call \", \"1\", \"2\", \"3\", \" please\"\n///\n///         If set to False, digits will grouped as follows::\n///\n///             \"Call 123 please\" -> \"Call \", \"123\", \" please\"\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"Digits\")]\npub struct PyDigits {}\n#[pymethods]\nimpl PyDigits {\n    #[getter]\n    fn get_individual_digits(self_: PyRef<Self>) -> bool {\n        getter!(self_, Digits, individual_digits)\n    }\n\n    #[setter]\n    fn set_individual_digits(self_: PyRef<Self>, individual_digits: bool) {\n        setter!(self_, Digits, individual_digits, individual_digits);\n    }\n\n    #[new]\n    #[pyo3(signature = (individual_digits = false), text_signature = \"(self, individual_digits=False)\")]\n    fn new(individual_digits: bool) -> (Self, PyPreTokenizer) {\n        (PyDigits {}, Digits::new(individual_digits).into())\n    }\n}\n\n/// This pre-tokenizer splits the text into fixed length chunks as used\n/// [here](https://www.biorxiv.org/content/10.1101/2023.01.11.523679v1.full)\n///\n/// Args:\n///     length (:obj:`int`, `optional`, defaults to :obj:`5`):\n///         The length of the chunks to split the text into.\n///\n///         Strings are split on the character level rather than the byte level to avoid\n///         splitting unicode characters consisting of multiple bytes.\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"FixedLength\")]\npub struct PyFixedLength {}\n#[pymethods]\nimpl PyFixedLength {\n    #[getter]\n    fn get_length(self_: PyRef<Self>) -> usize {\n        getter!(self_, FixedLength, length)\n    }\n\n    #[setter]\n    fn set_length(self_: PyRef<Self>, length: usize) {\n        setter!(self_, FixedLength, length, length);\n    }\n\n    #[new]\n    #[pyo3(signature = (length = 5), text_signature = \"(self, length=5)\")]\n    fn new(length: usize) -> (Self, PyPreTokenizer) {\n        (PyFixedLength {}, FixedLength::new(length).into())\n    }\n}\n\n/// This pre-tokenizer splits on characters that belong to different language family\n/// It roughly follows https://github.com/google/sentencepiece/blob/master/data/Scripts.txt\n/// Actually Hiragana and Katakana are fused with Han, and 0x30FC is Han too.\n/// This mimicks SentencePiece Unigram implementation.\n#[pyclass(extends=PyPreTokenizer, module = \"tokenizers.pre_tokenizers\", name = \"UnicodeScripts\")]\npub struct PyUnicodeScripts {}\n#[pymethods]\nimpl PyUnicodeScripts {\n    #[new]\n    #[pyo3(text_signature = \"(self)\")]\n    fn new() -> (Self, PyPreTokenizer) {\n        (PyUnicodeScripts {}, UnicodeScripts::new().into())\n    }\n}\n\n#[derive(Clone)]\npub(crate) struct CustomPreTokenizer {\n    inner: Py<PyAny>,\n}\n\nimpl CustomPreTokenizer {\n    pub fn new(inner: Py<PyAny>) -> Self {\n        Self { inner }\n    }\n}\n\nimpl tk::tokenizer::PreTokenizer for CustomPreTokenizer {\n    fn pre_tokenize(&self, sentence: &mut PreTokenizedString) -> tk::Result<()> {\n        Python::attach(|py| {\n            let pretok = PyPreTokenizedStringRefMut::new(sentence);\n            let py_pretok = self.inner.bind(py);\n            py_pretok.call_method(\"pre_tokenize\", (pretok.get().clone(),), None)?;\n            Ok(())\n        })\n    }\n}\n\nimpl Serialize for CustomPreTokenizer {\n    fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        Err(serde::ser::Error::custom(\n            \"Custom PreTokenizer cannot be serialized\",\n        ))\n    }\n}\n\nimpl<'de> Deserialize<'de> for CustomPreTokenizer {\n    fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        Err(serde::de::Error::custom(\n            \"Custom PreTokenizer cannot be deserialized\",\n        ))\n    }\n}\n\n#[derive(Clone, Deserialize)]\n#[serde(untagged)]\npub(crate) enum PyPreTokenizerWrapper {\n    Custom(CustomPreTokenizer),\n    Wrapped(PreTokenizerWrapper),\n}\n\nimpl Serialize for PyPreTokenizerWrapper {\n    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>\n    where\n        S: Serializer,\n    {\n        match self {\n            PyPreTokenizerWrapper::Wrapped(inner) => inner.serialize(serializer),\n            PyPreTokenizerWrapper::Custom(inner) => inner.serialize(serializer),\n        }\n    }\n}\n\n#[derive(Clone)]\npub(crate) enum PyPreTokenizerTypeWrapper {\n    Sequence(Vec<Arc<RwLock<PyPreTokenizerWrapper>>>),\n    Single(Arc<RwLock<PyPreTokenizerWrapper>>),\n}\n\nimpl<'de> Deserialize<'de> for PyPreTokenizerTypeWrapper {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let wrapper = PreTokenizerWrapper::deserialize(deserializer)?;\n        let py_wrapper: PyPreTokenizerWrapper = wrapper.into();\n        Ok(py_wrapper.into())\n    }\n}\n\nimpl Serialize for PyPreTokenizerTypeWrapper {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self {\n            PyPreTokenizerTypeWrapper::Sequence(seq) => {\n                let mut ser = serializer.serialize_struct(\"Sequence\", 2)?;\n                ser.serialize_field(\"type\", \"Sequence\")?;\n                ser.serialize_field(\"pretokenizers\", seq)?;\n                ser.end()\n            }\n            PyPreTokenizerTypeWrapper::Single(inner) => inner.serialize(serializer),\n        }\n    }\n}\n\nimpl<I> From<I> for PyPreTokenizerWrapper\nwhere\n    I: Into<PreTokenizerWrapper>,\n{\n    fn from(pretok: I) -> Self {\n        PyPreTokenizerWrapper::Wrapped(pretok.into())\n    }\n}\n\nimpl<I> From<I> for PyPreTokenizerTypeWrapper\nwhere\n    I: Into<PyPreTokenizerWrapper>,\n{\n    fn from(pretok: I) -> Self {\n        let pretok = pretok.into();\n        match pretok {\n            PyPreTokenizerWrapper::Wrapped(PreTokenizerWrapper::Sequence(seq)) => {\n                PyPreTokenizerTypeWrapper::Sequence(\n                    seq.into_iter()\n                        .map(|e| Arc::new(RwLock::new(PyPreTokenizerWrapper::Wrapped(e.clone()))))\n                        .collect(),\n                )\n            }\n            _ => PyPreTokenizerTypeWrapper::Single(Arc::new(RwLock::new(pretok))),\n        }\n    }\n}\n\nimpl<I> From<I> for PyPreTokenizer\nwhere\n    I: Into<PreTokenizerWrapper>,\n{\n    fn from(pretok: I) -> Self {\n        PyPreTokenizer {\n            pretok: pretok.into().into(),\n        }\n    }\n}\n\nimpl PreTokenizer for PyPreTokenizerTypeWrapper {\n    fn pre_tokenize(&self, pretok: &mut PreTokenizedString) -> tk::Result<()> {\n        match self {\n            PyPreTokenizerTypeWrapper::Single(inner) => inner\n                .read()\n                .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))?\n                .pre_tokenize(pretok),\n            PyPreTokenizerTypeWrapper::Sequence(inner) => inner.iter().try_for_each(|n| {\n                n.read()\n                    .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))?\n                    .pre_tokenize(pretok)\n            }),\n        }\n    }\n}\n\nimpl PreTokenizer for PyPreTokenizerWrapper {\n    fn pre_tokenize(&self, pretok: &mut PreTokenizedString) -> tk::Result<()> {\n        match self {\n            PyPreTokenizerWrapper::Wrapped(inner) => inner.pre_tokenize(pretok),\n            PyPreTokenizerWrapper::Custom(inner) => inner.pre_tokenize(pretok),\n        }\n    }\n}\n\n/// PreTokenizers Module\n#[pymodule]\npub mod pre_tokenizers {\n    #[pymodule_export]\n    pub use super::PyBertPreTokenizer;\n    #[pymodule_export]\n    pub use super::PyByteLevel;\n    #[pymodule_export]\n    pub use super::PyCharDelimiterSplit;\n    #[pymodule_export]\n    pub use super::PyDigits;\n    #[pymodule_export]\n    pub use super::PyFixedLength;\n    #[pymodule_export]\n    pub use super::PyMetaspace;\n    #[pymodule_export]\n    pub use super::PyPreTokenizer;\n    #[pymodule_export]\n    pub use super::PyPunctuation;\n    #[pymodule_export]\n    pub use super::PySequence;\n    #[pymodule_export]\n    pub use super::PySplit;\n    #[pymodule_export]\n    pub use super::PyUnicodeScripts;\n    #[pymodule_export]\n    pub use super::PyWhitespace;\n    #[pymodule_export]\n    pub use super::PyWhitespaceSplit;\n}\n\n#[cfg(test)]\nmod test {\n    use pyo3::prelude::*;\n    use tk::pre_tokenizers::sequence::Sequence;\n    use tk::pre_tokenizers::whitespace::{Whitespace, WhitespaceSplit};\n    use tk::pre_tokenizers::PreTokenizerWrapper;\n\n    use crate::pre_tokenizers::{\n        CustomPreTokenizer, PyPreTokenizer, PyPreTokenizerTypeWrapper, PyPreTokenizerWrapper,\n    };\n\n    #[test]\n    fn get_subtype() {\n        Python::attach(|py| {\n            let py_norm = PyPreTokenizer::new(Whitespace {}.into());\n            let py_wsp = py_norm.get_as_subtype(py).unwrap();\n            assert_eq!(\"Whitespace\", py_wsp.bind(py).get_type().qualname().unwrap());\n        })\n    }\n\n    #[test]\n    fn serialize() {\n        let py_wrapped: PyPreTokenizerWrapper = Whitespace {}.into();\n        let py_ser = serde_json::to_string(&py_wrapped).unwrap();\n        let rs_wrapped = PreTokenizerWrapper::Whitespace(Whitespace {});\n        let rs_ser = serde_json::to_string(&rs_wrapped).unwrap();\n        assert_eq!(py_ser, rs_ser);\n        let py_pretok: PyPreTokenizer = serde_json::from_str(&rs_ser).unwrap();\n        match py_pretok.pretok {\n            PyPreTokenizerTypeWrapper::Single(inner) => match *inner.as_ref().read().unwrap() {\n                PyPreTokenizerWrapper::Wrapped(PreTokenizerWrapper::Whitespace(_)) => {}\n                _ => panic!(\"Expected Whitespace\"),\n            },\n            _ => panic!(\"Expected wrapped, not custom.\"),\n        }\n\n        let py_seq: PyPreTokenizerWrapper =\n            Sequence::new(vec![Whitespace {}.into(), WhitespaceSplit.into()]).into();\n        let py_wrapper_ser = serde_json::to_string(&py_seq).unwrap();\n        let rs_wrapped = PreTokenizerWrapper::Sequence(Sequence::new(vec![\n            Whitespace {}.into(),\n            WhitespaceSplit.into(),\n        ]));\n        let rs_ser = serde_json::to_string(&rs_wrapped).unwrap();\n        assert_eq!(py_wrapper_ser, rs_ser);\n\n        let py_seq = PyPreTokenizer::new(py_seq.into());\n        let py_ser = serde_json::to_string(&py_seq).unwrap();\n        assert_eq!(py_wrapper_ser, py_ser);\n\n        let obj = Python::attach(|py| {\n            let py_wsp = PyPreTokenizer::new(Whitespace {}.into());\n            Py::new(py, py_wsp).unwrap().into_any()\n        });\n        let py_seq: PyPreTokenizerWrapper =\n            PyPreTokenizerWrapper::Custom(CustomPreTokenizer::new(obj));\n        assert!(serde_json::to_string(&py_seq).is_err());\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/processors.rs",
    "content": "use std::convert::TryInto;\nuse std::sync::Arc;\nuse std::sync::RwLock;\n\nuse crate::encoding::PyEncoding;\nuse crate::error::ToPyResult;\nuse pyo3::exceptions;\nuse pyo3::exceptions::PyException;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse pyo3::IntoPyObjectExt;\nuse serde::ser::SerializeStruct;\nuse serde::Deserializer;\nuse serde::Serializer;\nuse serde::{Deserialize, Serialize};\nuse tk::processors::bert::BertProcessing;\nuse tk::processors::byte_level::ByteLevel;\nuse tk::processors::roberta::RobertaProcessing;\nuse tk::processors::template::{SpecialToken, Template};\nuse tk::processors::PostProcessorWrapper;\nuse tk::{Encoding, PostProcessor};\nuse tokenizers as tk;\n\n/// Base class for all post-processors\n///\n/// This class is not supposed to be instantiated directly. Instead, any implementation of\n/// a PostProcessor will return an instance of this class when instantiated.\n#[pyclass(\n    dict,\n    module = \"tokenizers.processors\",\n    name = \"PostProcessor\",\n    subclass,\n    from_py_object\n)]\n#[derive(Clone, Deserialize, Serialize)]\n#[serde(transparent)]\npub struct PyPostProcessor {\n    processor: PyPostProcessorTypeWrapper,\n}\n\nimpl<I> From<I> for PyPostProcessor\nwhere\n    I: Into<PostProcessorWrapper>,\n{\n    fn from(processor: I) -> Self {\n        PyPostProcessor {\n            processor: processor.into().into(),\n        }\n    }\n}\n\nimpl PyPostProcessor {\n    pub(crate) fn new(processor: PyPostProcessorTypeWrapper) -> Self {\n        PyPostProcessor { processor }\n    }\n\n    pub(crate) fn get_as_subtype(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        let base = self.clone();\n        Ok(\n            match self.processor {\n                PyPostProcessorTypeWrapper::Sequence(_) => Py::new(py, (PySequence {}, base))?.into_any(),\n                PyPostProcessorTypeWrapper::Single(ref inner) => {\n\n            match &*inner.read().map_err(|_| {\n                PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\")\n            })? {\n                PostProcessorWrapper::ByteLevel(_) => Py::new(py, (PyByteLevel {}, base))?\n                    .into_any(),\n                PostProcessorWrapper::Bert(_) => Py::new(py, (PyBertProcessing {}, base))?\n                    .into_any(),\n                PostProcessorWrapper::Roberta(_) => Py::new(py, (PyRobertaProcessing {}, base))?\n                    .into_any(),\n                PostProcessorWrapper::Template(_) => Py::new(py, (PyTemplateProcessing {}, base))?\n                    .into_any(),\n                PostProcessorWrapper::Sequence(_) => Py::new(py, (PySequence {}, base))?\n                    .into_any(),\n            }\n                }\n            }\n        )\n    }\n}\n\nimpl PostProcessor for PyPostProcessor {\n    // TODO: update signature to `tk::Result<usize>`\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        self.processor.added_tokens(is_pair)\n    }\n\n    fn process_encodings(\n        &self,\n        encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> tk::Result<Vec<Encoding>> {\n        self.processor\n            .process_encodings(encodings, add_special_tokens)\n    }\n}\n\n#[pymethods]\nimpl PyPostProcessor {\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.processor).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle PostProcessor: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                self.processor = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle PostProcessor: {e}\"\n                    ))\n                })?;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    /// Return the number of special tokens that would be added for single/pair sentences.\n    ///\n    /// Args:\n    ///     is_pair (:obj:`bool`):\n    ///         Whether the input would be a pair of sequences\n    ///\n    /// Returns:\n    ///     :obj:`int`: The number of tokens to add\n    #[pyo3(text_signature = \"(self, is_pair)\")]\n    fn num_special_tokens_to_add(&self, is_pair: bool) -> PyResult<usize> {\n        Ok(self.processor.added_tokens(is_pair))\n    }\n\n    /// Post-process the given encodings, generating the final one\n    ///\n    /// Args:\n    ///     encoding (:class:`~tokenizers.Encoding`):\n    ///         The encoding for the first sequence\n    ///\n    ///     pair (:class:`~tokenizers.Encoding`, `optional`):\n    ///         The encoding for the pair sequence\n    ///\n    ///     add_special_tokens (:obj:`bool`):\n    ///         Whether to add the special tokens\n    ///\n    /// Return:\n    ///     :class:`~tokenizers.Encoding`: The final encoding\n    #[pyo3(\n        signature = (encoding, pair = None, add_special_tokens = true) -> \"tokenizers.Encoding\"\n    )]\n    #[pyo3(text_signature = \"(self, encoding, pair=None, add_special_tokens=True)\")]\n    fn process(\n        &self,\n        encoding: &PyEncoding,\n        pair: Option<&PyEncoding>,\n        add_special_tokens: bool,\n    ) -> PyResult<PyEncoding> {\n        let final_encoding = ToPyResult(self.processor.process(\n            encoding.encoding.clone(),\n            pair.map(|e| e.encoding.clone()),\n            add_special_tokens,\n        ))\n        .into_py()?;\n        Ok(final_encoding.into())\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n}\n\nmacro_rules! getter {\n    ($self: ident, $variant: ident, $($name: tt)+) => {{\n        let super_ = $self.as_ref();\n        if let PyPostProcessorTypeWrapper::Single(ref single) = super_.processor {\n            if let PostProcessorWrapper::$variant(ref post) = *single.read().expect(\n                \"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\"\n            ) {\n                post.$($name)+\n            } else {\n                unreachable!()\n            }\n        } else {\n            unreachable!()\n        }\n    }};\n}\n\nmacro_rules! setter {\n    ($self: ident, $variant: ident, $name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyPostProcessorTypeWrapper::Single(ref single) = super_.processor {\n        if let PostProcessorWrapper::$variant(ref mut post) = *single.write().expect(\n            \"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\",\n        ) {\n            post.$name = $value;\n        }\n        }\n    }};\n    ($self: ident, $variant: ident, @$name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let PyPostProcessorTypeWrapper::Single(ref single) = super_.processor {\n        if let PostProcessorWrapper::$variant(ref mut post) = *single.write().expect(\n            \"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\",\n        ) {\n            post.$name($value);\n        }\n        }\n    };};\n}\n\n#[derive(Clone)]\npub(crate) enum PyPostProcessorTypeWrapper {\n    Sequence(Vec<Arc<RwLock<PostProcessorWrapper>>>),\n    Single(Arc<RwLock<PostProcessorWrapper>>),\n}\n\nimpl PostProcessor for PyPostProcessorTypeWrapper {\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        match self {\n            PyPostProcessorTypeWrapper::Single(inner) => inner\n                .read()\n                .expect(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\")\n                .added_tokens(is_pair),\n            PyPostProcessorTypeWrapper::Sequence(inner) => inner.iter().map(|p| {\n                p.read()\n                    .expect(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\")\n                    .added_tokens(is_pair)\n            }).sum::<usize>(),\n        }\n    }\n\n    fn process_encodings(\n        &self,\n        mut encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> tk::Result<Vec<Encoding>> {\n        match self {\n            PyPostProcessorTypeWrapper::Single(inner) => inner\n                .read()\n                .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))?\n                .process_encodings(encodings, add_special_tokens),\n            PyPostProcessorTypeWrapper::Sequence(inner) => {\n                for processor in inner.iter() {\n                    encodings = processor\n                        .read()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPreTokenizer\"))?\n                        .process_encodings(encodings, add_special_tokens)?;\n                }\n        Ok(encodings)\n            },\n        }\n    }\n}\n\nimpl<'de> Deserialize<'de> for PyPostProcessorTypeWrapper {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let wrapper = PostProcessorWrapper::deserialize(deserializer)?;\n        Ok(wrapper.into())\n    }\n}\n\nimpl Serialize for PyPostProcessorTypeWrapper {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        match self {\n            PyPostProcessorTypeWrapper::Sequence(seq) => {\n                let mut ser = serializer.serialize_struct(\"Sequence\", 2)?;\n                ser.serialize_field(\"type\", \"Sequence\")?;\n                ser.serialize_field(\"processors\", seq)?;\n                ser.end()\n            }\n            PyPostProcessorTypeWrapper::Single(inner) => inner.serialize(serializer),\n        }\n    }\n}\n\nimpl<I> From<I> for PyPostProcessorTypeWrapper\nwhere\n    I: Into<PostProcessorWrapper>,\n{\n    fn from(processor: I) -> Self {\n        let processor = processor.into();\n        match processor {\n            PostProcessorWrapper::Sequence(seq) => PyPostProcessorTypeWrapper::Sequence(\n                seq.into_iter().map(|p| Arc::new(RwLock::new(p))).collect(),\n            ),\n            _ => PyPostProcessorTypeWrapper::Single(Arc::new(RwLock::new(processor.clone()))),\n        }\n    }\n}\n\n/// This post-processor takes care of adding the special tokens needed by\n/// a Bert model:\n///\n///     - a SEP token\n///     - a CLS token\n///\n/// Args:\n///     sep (:obj:`Tuple[str, int]`):\n///         A tuple with the string representation of the SEP token, and its id\n///\n///     cls (:obj:`Tuple[str, int]`):\n///         A tuple with the string representation of the CLS token, and its id\n#[pyclass(extends=PyPostProcessor, module = \"tokenizers.processors\", name = \"BertProcessing\")]\npub struct PyBertProcessing {}\n#[pymethods]\nimpl PyBertProcessing {\n    #[new]\n    #[pyo3(text_signature = \"(self, sep, cls_token: str| int)\")]\n    fn new(sep: (String, u32), cls_token: (String, u32)) -> (Self, PyPostProcessor) {\n        (\n            PyBertProcessing {},\n            BertProcessing::new(sep, cls_token).into(),\n        )\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [(\"\", 0), (\"\", 0)])\n    }\n\n    #[getter]\n    fn get_sep(self_: PyRef<'_, Self>) -> Result<Bound<'_, PyTuple>, PyErr> {\n        let py = self_.py();\n        let (tok, id) = getter!(self_, Bert, get_sep_copy());\n        PyTuple::new(\n            py,\n            Vec::<Py<PyAny>>::from([tok.into_py_any(py)?, id.into_py_any(py)?]),\n        )\n    }\n\n    #[setter]\n    fn set_sep(self_: PyRef<Self>, sep: Bound<'_, PyTuple>) -> PyResult<()> {\n        let sep = sep.extract()?;\n        setter!(self_, Bert, sep, sep);\n        Ok(())\n    }\n\n    #[getter]\n    fn get_cls(self_: PyRef<'_, Self>) -> Result<Bound<'_, PyTuple>, PyErr> {\n        let py = self_.py();\n        let (tok, id) = getter!(self_, Bert, get_cls_copy());\n        PyTuple::new(\n            py,\n            Vec::<Py<PyAny>>::from([tok.into_py_any(py)?, id.into_py_any(py)?]),\n        )\n    }\n\n    #[setter]\n    fn set_cls(self_: PyRef<Self>, cls: Bound<'_, PyTuple>) -> PyResult<()> {\n        let cls = cls.extract()?;\n        setter!(self_, Bert, cls, cls);\n        Ok(())\n    }\n}\n\n/// This post-processor takes care of adding the special tokens needed by\n/// a Roberta model:\n///\n///     - a SEP token\n///     - a CLS token\n///\n/// It also takes care of trimming the offsets.\n/// By default, the ByteLevel BPE might include whitespaces in the produced tokens. If you don't\n/// want the offsets to include these whitespaces, then this PostProcessor should be initialized\n/// with :obj:`trim_offsets=True`\n///\n/// Args:\n///     sep (:obj:`Tuple[str, int]`):\n///         A tuple with the string representation of the SEP token, and its id\n///\n///     cls (:obj:`Tuple[str, int]`):\n///         A tuple with the string representation of the CLS token, and its id\n///\n///     trim_offsets (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether to trim the whitespaces from the produced offsets.\n///\n///     add_prefix_space (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         Whether the add_prefix_space option was enabled during pre-tokenization. This\n///         is relevant because it defines the way the offsets are trimmed out.\n#[pyclass(extends=PyPostProcessor, module = \"tokenizers.processors\", name = \"RobertaProcessing\")]\npub struct PyRobertaProcessing {}\n#[pymethods]\nimpl PyRobertaProcessing {\n    #[new]\n    #[pyo3(\n        signature = (sep, cls_token, trim_offsets = true, add_prefix_space = true),\n        text_signature = \"(self, sep, cls_token, trim_offsets=True, add_prefix_space=True)\"\n    )]\n    fn new(\n        sep: (String, u32),\n        cls_token: (String, u32),\n        trim_offsets: bool,\n        add_prefix_space: bool,\n    ) -> (Self, PyPostProcessor) {\n        let proc = RobertaProcessing::new(sep, cls_token)\n            .trim_offsets(trim_offsets)\n            .add_prefix_space(add_prefix_space);\n        (PyRobertaProcessing {}, proc.into())\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [(\"\", 0), (\"\", 0)])\n    }\n\n    #[getter]\n    fn get_sep(self_: PyRef<'_, Self>) -> Result<Bound<'_, PyTuple>, PyErr> {\n        let py = self_.py();\n        let (tok, id) = getter!(self_, Roberta, get_sep_copy());\n        PyTuple::new(\n            py,\n            Vec::<Py<PyAny>>::from([tok.into_py_any(py)?, id.into_py_any(py)?]),\n        )\n    }\n\n    #[setter]\n    fn set_sep(self_: PyRef<Self>, sep: Bound<'_, PyTuple>) -> PyResult<()> {\n        let sep = sep.extract()?;\n        setter!(self_, Roberta, sep, sep);\n        Ok(())\n    }\n\n    #[getter]\n    fn get_cls(self_: PyRef<'_, Self>) -> Result<Bound<'_, PyTuple>, PyErr> {\n        let py = self_.py();\n        let (tok, id) = getter!(self_, Roberta, get_cls_copy());\n        PyTuple::new(\n            py,\n            Vec::<Py<PyAny>>::from([tok.into_py_any(py)?, id.into_py_any(py)?]),\n        )\n    }\n\n    #[setter]\n    fn set_cls(self_: PyRef<Self>, cls: Bound<'_, PyTuple>) -> PyResult<()> {\n        let cls = cls.extract()?;\n        setter!(self_, Roberta, cls, cls);\n        Ok(())\n    }\n\n    #[getter]\n    fn get_trim_offsets(self_: PyRef<Self>) -> bool {\n        getter!(self_, Roberta, trim_offsets)\n    }\n\n    #[setter]\n    fn set_trim_offsets(self_: PyRef<Self>, trim_offsets: bool) {\n        setter!(self_, Roberta, trim_offsets, trim_offsets)\n    }\n\n    #[getter]\n    fn get_add_prefix_space(self_: PyRef<Self>) -> bool {\n        getter!(self_, Roberta, add_prefix_space)\n    }\n\n    #[setter]\n    fn set_add_prefix_space(self_: PyRef<Self>, add_prefix_space: bool) {\n        setter!(self_, Roberta, add_prefix_space, add_prefix_space)\n    }\n}\n\n/// This post-processor takes care of trimming the offsets.\n///\n/// By default, the ByteLevel BPE might include whitespaces in the produced tokens. If you don't\n/// want the offsets to include these whitespaces, then this PostProcessor must be used.\n///\n/// Args:\n///     trim_offsets (:obj:`bool`):\n///         Whether to trim the whitespaces from the produced offsets.\n///\n///     add_prefix_space (:obj:`bool`, `optional`, defaults to :obj:`True`):\n///         If :obj:`True`, keeps the first token's offset as is. If :obj:`False`, increments\n///         the start of the first token's offset by 1. Only has an effect if :obj:`trim_offsets`\n///         is set to :obj:`True`.\n#[pyclass(extends=PyPostProcessor, module = \"tokenizers.processors\", name = \"ByteLevel\")]\npub struct PyByteLevel {}\n#[pymethods]\nimpl PyByteLevel {\n    #[new]\n    #[pyo3(\n        signature = (add_prefix_space = None, trim_offsets = None, use_regex = None, **_kwargs),\n        text_signature = \"(self, add_prefix_space=None, trim_offsets=None, use_regex=None)\"\n    )]\n    fn new(\n        add_prefix_space: Option<bool>,\n        trim_offsets: Option<bool>,\n        use_regex: Option<bool>,\n        _kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> (Self, PyPostProcessor) {\n        let mut byte_level = ByteLevel::default();\n\n        if let Some(aps) = add_prefix_space {\n            byte_level = byte_level.add_prefix_space(aps);\n        }\n\n        if let Some(to) = trim_offsets {\n            byte_level = byte_level.trim_offsets(to);\n        }\n\n        if let Some(ur) = use_regex {\n            byte_level = byte_level.use_regex(ur);\n        }\n\n        (PyByteLevel {}, byte_level.into())\n    }\n\n    #[getter]\n    fn get_add_prefix_space(self_: PyRef<Self>) -> bool {\n        getter!(self_, ByteLevel, add_prefix_space)\n    }\n\n    #[setter]\n    fn set_add_prefix_space(self_: PyRef<Self>, add_prefix_space: bool) {\n        setter!(self_, ByteLevel, add_prefix_space, add_prefix_space)\n    }\n\n    #[getter]\n    fn get_trim_offsets(self_: PyRef<Self>) -> bool {\n        getter!(self_, ByteLevel, trim_offsets)\n    }\n\n    #[setter]\n    fn set_trim_offsets(self_: PyRef<Self>, trim_offsets: bool) {\n        setter!(self_, ByteLevel, trim_offsets, trim_offsets)\n    }\n\n    #[getter]\n    fn get_use_regex(self_: PyRef<Self>) -> bool {\n        getter!(self_, ByteLevel, use_regex)\n    }\n\n    #[setter]\n    fn set_use_regex(self_: PyRef<Self>, use_regex: bool) {\n        setter!(self_, ByteLevel, use_regex, use_regex)\n    }\n}\n\n#[derive(Clone, Debug)]\npub struct PySpecialToken(SpecialToken);\n\nimpl From<PySpecialToken> for SpecialToken {\n    fn from(v: PySpecialToken) -> Self {\n        v.0\n    }\n}\n\nimpl<'a, 'py> FromPyObject<'a, 'py> for PySpecialToken {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        if let Ok(v) = ob.extract::<(String, u32)>() {\n            Ok(Self(v.into()))\n        } else if let Ok(v) = ob.extract::<(u32, String)>() {\n            Ok(Self(v.into()))\n        } else if let Ok(d) = ob.cast::<PyDict>() {\n            let id = d\n                .get_item(\"id\")?\n                .ok_or_else(|| exceptions::PyValueError::new_err(\"`id` must be specified\"))?\n                .extract::<String>()?;\n            let ids = d\n                .get_item(\"ids\")?\n                .ok_or_else(|| exceptions::PyValueError::new_err(\"`ids` must be specified\"))?\n                .extract::<Vec<u32>>()?;\n            let tokens = d\n                .get_item(\"tokens\")?\n                .ok_or_else(|| exceptions::PyValueError::new_err(\"`tokens` must be specified\"))?\n                .extract::<Vec<String>>()?;\n\n            Ok(Self(\n                ToPyResult(SpecialToken::new(id, ids, tokens)).into_py()?,\n            ))\n        } else {\n            Err(exceptions::PyTypeError::new_err(\n                \"Expected Union[Tuple[str, int], Tuple[int, str], dict]\",\n            ))\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub struct PyTemplate(Template);\n\nimpl From<PyTemplate> for Template {\n    fn from(v: PyTemplate) -> Self {\n        v.0\n    }\n}\n\nimpl<'a, 'py> FromPyObject<'a, 'py> for PyTemplate {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        if let Ok(s) = ob.extract::<String>() {\n            Ok(Self(\n                s.try_into().map_err(exceptions::PyValueError::new_err)?,\n            ))\n        } else if let Ok(s) = ob.extract::<Vec<String>>() {\n            Ok(Self(\n                s.try_into().map_err(exceptions::PyValueError::new_err)?,\n            ))\n        } else {\n            Err(exceptions::PyTypeError::new_err(\n                \"Expected Union[str, List[str]]\",\n            ))\n        }\n    }\n}\n\n/// Provides a way to specify templates in order to add the special tokens to each\n/// input sequence as relevant.\n///\n/// Let's take :obj:`BERT` tokenizer as an example. It uses two special tokens, used to\n/// delimitate each sequence. :obj:`[CLS]` is always used at the beginning of the first\n/// sequence, and :obj:`[SEP]` is added at the end of both the first, and the pair\n/// sequences. The final result looks like this:\n///\n///     - Single sequence: :obj:`[CLS] Hello there [SEP]`\n///     - Pair sequences: :obj:`[CLS] My name is Anthony [SEP] What is my name? [SEP]`\n///\n/// With the type ids as following::\n///\n///     [CLS]   ...   [SEP]   ...   [SEP]\n///       0      0      0      1      1\n///\n/// You can achieve such behavior using a TemplateProcessing::\n///\n///     TemplateProcessing(\n///         single=\"[CLS] $0 [SEP]\",\n///         pair=\"[CLS] $A [SEP] $B:1 [SEP]:1\",\n///         special_tokens=[(\"[CLS]\", 1), (\"[SEP]\", 0)],\n///     )\n///\n/// In this example, each input sequence is identified using a ``$`` construct. This identifier\n/// lets us specify each input sequence, and the type_id to use. When nothing is specified,\n/// it uses the default values. Here are the different ways to specify it:\n///\n///     - Specifying the sequence, with default ``type_id == 0``: ``$A`` or ``$B``\n///     - Specifying the `type_id` with default ``sequence == A``: ``$0``, ``$1``, ``$2``, ...\n///     - Specifying both: ``$A:0``, ``$B:1``, ...\n///\n/// The same construct is used for special tokens: ``<identifier>(:<type_id>)?``.\n///\n/// **Warning**: You must ensure that you are giving the correct tokens/ids as these\n/// will be added to the Encoding without any further check. If the given ids correspond\n/// to something totally different in a `Tokenizer` using this `PostProcessor`, it\n/// might lead to unexpected results.\n///\n/// Args:\n///     single (:obj:`Template`):\n///         The template used for single sequences\n///\n///     pair (:obj:`Template`):\n///         The template used when both sequences are specified\n///\n///     special_tokens (:obj:`Tokens`):\n///         The list of special tokens used in each sequences\n///\n/// Types:\n///\n///     Template (:obj:`str` or :obj:`List`):\n///         - If a :obj:`str` is provided, the whitespace is used as delimiter between tokens\n///         - If a :obj:`List[str]` is provided, a list of tokens\n///\n///     Tokens (:obj:`List[Union[Tuple[int, str], Tuple[str, int], dict]]`):\n///         - A :obj:`Tuple` with both a token and its associated ID, in any order\n///         - A :obj:`dict` with the following keys:\n///             - \"id\": :obj:`str` => The special token id, as specified in the Template\n///             - \"ids\": :obj:`List[int]` => The associated IDs\n///             - \"tokens\": :obj:`List[str]` => The associated tokens\n///\n///          The given dict expects the provided :obj:`ids` and :obj:`tokens` lists to have\n///          the same length.\n#[pyclass(extends=PyPostProcessor, module = \"tokenizers.processors\", name = \"TemplateProcessing\")]\npub struct PyTemplateProcessing {}\n#[pymethods]\nimpl PyTemplateProcessing {\n    #[new]\n    #[pyo3(\n        signature = (single = None, pair = None, special_tokens = None),\n        text_signature = \"(self, single=None, pair=None, special_tokens=None)\"\n    )]\n    fn new(\n        single: Option<PyTemplate>,\n        pair: Option<PyTemplate>,\n        special_tokens: Option<Vec<PySpecialToken>>,\n    ) -> PyResult<(Self, PyPostProcessor)> {\n        let mut builder = tk::processors::template::TemplateProcessing::builder();\n\n        if let Some(seq) = single {\n            builder.single(seq.into());\n        }\n        if let Some(seq) = pair {\n            builder.pair(seq.into());\n        }\n        if let Some(sp) = special_tokens {\n            builder.special_tokens(sp);\n        }\n        let processor = builder\n            .build()\n            .map_err(|e| exceptions::PyValueError::new_err(e.to_string()))?;\n\n        Ok((PyTemplateProcessing {}, processor.into()))\n    }\n\n    #[getter]\n    fn get_single(self_: PyRef<Self>) -> String {\n        getter!(self_, Template, get_single())\n    }\n\n    #[setter]\n    fn set_single(self_: PyRef<Self>, single: PyTemplate) -> PyResult<()> {\n        let template: Template = Template::from(single);\n        let super_ = self_.as_ref();\n        if let PyPostProcessorTypeWrapper::Single(ref inner) = super_.processor {\n            if let PostProcessorWrapper::Template(ref mut post) = *inner\n                .write()\n                .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\"))? {\n                post.set_single(template);\n            }\n        }\n        Ok(())\n    }\n}\n\n/// Sequence Processor\n///\n/// Args:\n///     processors (:obj:`List[PostProcessor]`)\n///         The processors that need to be chained\n#[pyclass(extends=PyPostProcessor, module = \"tokenizers.processors\", name = \"Sequence\")]\npub struct PySequence {}\n\n#[pymethods]\nimpl PySequence {\n    #[new]\n    #[pyo3(signature = (processors_py), text_signature = \"(self, processors)\")]\n    fn new(processors_py: &Bound<'_, PyList>) -> PyResult<(Self, PyPostProcessor)> {\n        let mut processors = Vec::with_capacity(processors_py.len());\n        for n in processors_py.iter() {\n            let processor: PyRef<PyPostProcessor> = n.extract()?;\n            match &processor.processor {\n                PyPostProcessorTypeWrapper::Sequence(inner) => {\n                    processors.extend(inner.iter().cloned())\n                }\n                PyPostProcessorTypeWrapper::Single(inner) => processors.push(inner.clone()),\n            }\n        }\n        Ok((\n            PySequence {},\n            PyPostProcessor::new(PyPostProcessorTypeWrapper::Sequence(processors)),\n        ))\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        PyTuple::new(py, [PyList::empty(py)])\n    }\n\n    fn __getitem__(self_: PyRef<'_, Self>, py: Python<'_>, index: usize) -> PyResult<Py<PyAny>> {\n        match &self_.as_ref().processor {\n            PyPostProcessorTypeWrapper::Sequence(ref inner) => match inner.get(index) {\n                Some(item) => {\n                    PyPostProcessor::new(PyPostProcessorTypeWrapper::Single(item.clone()))\n                        .get_as_subtype(py)\n                }\n                _ => Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                    \"Index not found\",\n                )),\n            },\n            _ => Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                \"This processor is not a Sequence, it does not support __getitem__\",\n            )),\n        }\n    }\n\n    fn __setitem__(self_: PyRef<'_, Self>, index: usize, value: Bound<'_, PyAny>) -> PyResult<()> {\n        let processor: PyPostProcessor = value.extract()?;\n        let PyPostProcessorTypeWrapper::Single(processor) = processor.processor else {\n            return Err(PyException::new_err(\"processor should not be a sequence\"));\n        };\n\n        match &self_.as_ref().processor {\n            PyPostProcessorTypeWrapper::Sequence(inner) => match inner.get(index) {\n                Some(item) => {\n                    *item\n                        .write()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\"))? = processor\n                        .read()\n                        .map_err(|_| PyException::new_err(\"RwLock synchronisation primitive is poisoned, cannot get subtype of PyPostProcessor\"))?\n                        .clone();\n                }\n                _ => {\n                    return Err(PyErr::new::<pyo3::exceptions::PyIndexError, _>(\n                        \"Index not found\",\n                    ))\n                }\n            },\n            _ => {\n                return Err(PyException::new_err(\n                    \"This processor is not a Sequence, it does not support __setitem__\",\n                ))\n            }\n        };\n        Ok(())\n    }\n}\n\n/// Processors Module\n#[pymodule]\npub mod processors {\n    #[pymodule_export]\n    pub use super::PyBertProcessing;\n    #[pymodule_export]\n    pub use super::PyByteLevel;\n    #[pymodule_export]\n    pub use super::PyPostProcessor;\n    #[pymodule_export]\n    pub use super::PyRobertaProcessing;\n    #[pymodule_export]\n    pub use super::PySequence;\n    #[pymodule_export]\n    pub use super::PyTemplateProcessing;\n}\n\n#[cfg(test)]\nmod test {\n    use std::sync::{Arc, RwLock};\n\n    use pyo3::prelude::*;\n    use tk::processors::bert::BertProcessing;\n    use tk::processors::PostProcessorWrapper;\n\n    use crate::processors::{PyPostProcessor, PyPostProcessorTypeWrapper};\n\n    #[test]\n    fn get_subtype() {\n        Python::attach(|py| {\n            let py_proc = PyPostProcessor::new(PyPostProcessorTypeWrapper::Single(Arc::new(\n                RwLock::new(BertProcessing::new((\"SEP\".into(), 0), (\"CLS\".into(), 1)).into()),\n            )));\n            let py_bert = py_proc.get_as_subtype(py).unwrap();\n            assert_eq!(\n                \"BertProcessing\",\n                py_bert.bind(py).get_type().qualname().unwrap()\n            );\n        })\n    }\n\n    #[test]\n    fn serialize() {\n        let rs_processing = BertProcessing::new((\"SEP\".into(), 0), (\"CLS\".into(), 1));\n        let rs_wrapper: PostProcessorWrapper = rs_processing.clone().into();\n        let rs_processing_ser = serde_json::to_string(&rs_processing).unwrap();\n        let rs_wrapper_ser = serde_json::to_string(&rs_wrapper).unwrap();\n\n        let py_processing = PyPostProcessor::new(PyPostProcessorTypeWrapper::Single(Arc::new(\n            RwLock::new(rs_wrapper),\n        )));\n        let py_ser = serde_json::to_string(&py_processing).unwrap();\n        assert_eq!(py_ser, rs_processing_ser);\n        assert_eq!(py_ser, rs_wrapper_ser);\n\n        let py_processing: PyPostProcessor = serde_json::from_str(&rs_processing_ser).unwrap();\n        match py_processing.processor {\n            PyPostProcessorTypeWrapper::Single(inner) => match *inner.as_ref().read().unwrap() {\n                PostProcessorWrapper::Bert(_) => (),\n                _ => panic!(\"Expected Bert postprocessor.\"),\n            },\n            _ => panic!(\"Expected a single processor, got a sequence\"),\n        }\n\n        let py_processing: PyPostProcessor = serde_json::from_str(&rs_wrapper_ser).unwrap();\n        match py_processing.processor {\n            PyPostProcessorTypeWrapper::Single(inner) => match *inner.as_ref().read().unwrap() {\n                PostProcessorWrapper::Bert(_) => (),\n                _ => panic!(\"Expected Bert postprocessor.\"),\n            },\n            _ => panic!(\"Expected a single processor, got a sequence\"),\n        };\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/token.rs",
    "content": "use pyo3::prelude::*;\nuse tk::Token;\n\n#[pyclass(module = \"tokenizers\", name = \"Token\", frozen, from_py_object)]\n#[derive(Clone)]\npub struct PyToken {\n    token: Token,\n}\nimpl From<Token> for PyToken {\n    fn from(token: Token) -> Self {\n        Self { token }\n    }\n}\nimpl From<PyToken> for Token {\n    fn from(token: PyToken) -> Self {\n        token.token\n    }\n}\n\n#[pymethods]\nimpl PyToken {\n    /// Create a token from id, string value and byte offsets\n    #[new]\n    #[pyo3(\n        signature = (id, value, offsets),\n        text_signature = \"(self, id, value, offsets)\"\n    )]\n    fn new(id: u32, value: String, offsets: (usize, usize)) -> PyToken {\n        Token::new(id, value, offsets).into()\n    }\n\n    #[getter]\n    fn get_id(&self) -> u32 {\n        self.token.id\n    }\n\n    #[getter]\n    fn get_value(&self) -> &str {\n        &self.token.value\n    }\n\n    #[getter]\n    fn get_offsets(&self) -> (usize, usize) {\n        self.token.offsets\n    }\n\n    fn as_tuple(&self) -> (u32, &str, (usize, usize)) {\n        (self.token.id, &self.token.value, self.token.offsets)\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/tokenizer.rs",
    "content": "use serde::Serialize;\nuse std::collections::{hash_map::DefaultHasher, HashMap};\nuse std::hash::{Hash, Hasher};\n\nuse numpy::{npyffi, PyArray1, PyArrayMethods};\nuse pyo3::class::basic::CompareOp;\nuse pyo3::intern;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse pyo3::IntoPyObject;\nuse pyo3::{exceptions, IntoPyObjectExt};\nuse tk::models::bpe::BPE;\nuse tk::tokenizer::{\n    Model, PaddingDirection, PaddingParams, PaddingStrategy, PostProcessor, TokenizerImpl,\n    TruncationDirection, TruncationParams, TruncationStrategy,\n};\nuse tk::utils::iter::ResultShunt;\nuse tokenizers as tk;\n\nuse super::decoders::PyDecoder;\nuse super::encoding::PyEncoding;\nuse super::error::{PyError, ToPyResult};\nuse super::models::PyModel;\nuse super::normalizers::PyNormalizer;\nuse super::pre_tokenizers::PyPreTokenizer;\nuse super::trainers::PyTrainer;\nuse crate::processors::PyPostProcessor;\nuse crate::utils::{MaybeSizedIterator, PyBufferedIterator};\nuse std::collections::BTreeMap;\n\n/// Represents a token that can be be added to a :class:`~tokenizers.Tokenizer`.\n/// It can have special options that defines the way it should behave.\n///\n/// Args:\n///     content (:obj:`str`): The content of the token\n///\n///     single_word (:obj:`bool`, defaults to :obj:`False`):\n///         Defines whether this token should only match single words. If :obj:`True`, this\n///         token will never match inside of a word. For example the token ``ing`` would match\n///         on ``tokenizing`` if this option is :obj:`False`, but not if it is :obj:`True`.\n///         The notion of \"`inside of a word`\" is defined by the word boundaries pattern in\n///         regular expressions (ie. the token should start and end with word boundaries).\n///\n///     lstrip (:obj:`bool`, defaults to :obj:`False`):\n///         Defines whether this token should strip all potential whitespaces on its left side.\n///         If :obj:`True`, this token will greedily match any whitespace on its left. For\n///         example if we try to match the token ``[MASK]`` with ``lstrip=True``, in the text\n///         ``\"I saw a [MASK]\"``, we would match on ``\" [MASK]\"``. (Note the space on the left).\n///\n///     rstrip (:obj:`bool`, defaults to :obj:`False`):\n///         Defines whether this token should strip all potential whitespaces on its right\n///         side. If :obj:`True`, this token will greedily match any whitespace on its right.\n///         It works just like :obj:`lstrip` but on the right.\n///\n///     normalized (:obj:`bool`, defaults to :obj:`True` with :meth:`~tokenizers.Tokenizer.add_tokens` and :obj:`False` with :meth:`~tokenizers.Tokenizer.add_special_tokens`):\n///         Defines whether this token should match against the normalized version of the input\n///         text. For example, with the added token ``\"yesterday\"``, and a normalizer in charge of\n///         lowercasing the text, the token could be extract from the input ``\"I saw a lion\n///         Yesterday\"``.\n///     special (:obj:`bool`, defaults to :obj:`False` with :meth:`~tokenizers.Tokenizer.add_tokens` and :obj:`False` with :meth:`~tokenizers.Tokenizer.add_special_tokens`):\n///         Defines whether this token should be skipped when decoding.\n///\n#[pyclass(dict, module = \"tokenizers\", name = \"AddedToken\")]\npub struct PyAddedToken {\n    pub content: String,\n    pub special: bool,\n    pub single_word: Option<bool>,\n    pub lstrip: Option<bool>,\n    pub rstrip: Option<bool>,\n    pub normalized: Option<bool>,\n}\nimpl PyAddedToken {\n    pub fn from<S: Into<String>>(content: S, special: Option<bool>) -> Self {\n        Self {\n            content: content.into(),\n            special: special.unwrap_or(false),\n            single_word: None,\n            lstrip: None,\n            rstrip: None,\n            normalized: None,\n        }\n    }\n\n    pub fn get_token(&self) -> tk::tokenizer::AddedToken {\n        let mut token = tk::AddedToken::from(&self.content, self.special);\n\n        if let Some(sw) = self.single_word {\n            token = token.single_word(sw);\n        }\n        if let Some(ls) = self.lstrip {\n            token = token.lstrip(ls);\n        }\n        if let Some(rs) = self.rstrip {\n            token = token.rstrip(rs);\n        }\n        if let Some(n) = self.normalized {\n            token = token.normalized(n);\n        }\n\n        token\n    }\n\n    pub fn as_pydict<'py>(&self, py: Python<'py>) -> PyResult<Bound<'py, PyDict>> {\n        let dict = PyDict::new(py);\n        let token = self.get_token();\n\n        dict.set_item(\"content\", token.content)?;\n        dict.set_item(\"single_word\", token.single_word)?;\n        dict.set_item(\"lstrip\", token.lstrip)?;\n        dict.set_item(\"rstrip\", token.rstrip)?;\n        dict.set_item(\"normalized\", token.normalized)?;\n        dict.set_item(\"special\", token.special)?;\n\n        Ok(dict)\n    }\n}\n\nimpl From<tk::AddedToken> for PyAddedToken {\n    fn from(token: tk::AddedToken) -> Self {\n        Self {\n            content: token.content,\n            single_word: Some(token.single_word),\n            lstrip: Some(token.lstrip),\n            rstrip: Some(token.rstrip),\n            normalized: Some(token.normalized),\n            special: token.special,\n        }\n    }\n}\n\n#[pymethods]\nimpl PyAddedToken {\n    #[new]\n    #[pyo3(\n        signature = (content=None, **kwargs),\n        text_signature = \"(self, content=None, single_word=False, lstrip=False, rstrip=False, normalized=True, special=False)\"\n    )]\n    fn __new__(content: Option<&str>, kwargs: Option<&Bound<'_, PyDict>>) -> PyResult<Self> {\n        let mut token = PyAddedToken::from(content.unwrap_or(\"\"), None);\n\n        if let Some(kwargs) = kwargs {\n            for (key, value) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"single_word\" => token.single_word = Some(value.extract()?),\n                    \"lstrip\" => token.lstrip = Some(value.extract()?),\n                    \"rstrip\" => token.rstrip = Some(value.extract()?),\n                    \"normalized\" => token.normalized = Some(value.extract()?),\n                    \"special\" => token.special = value.extract()?,\n                    _ => println!(\"Ignored unknown kwarg option {key}\"),\n                }\n            }\n        }\n\n        Ok(token)\n    }\n\n    fn __getstate__<'py>(&self, py: Python<'py>) -> PyResult<Bound<'py, PyDict>> {\n        self.as_pydict(py)\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.cast_bound::<PyDict>(py) {\n            Ok(state) => {\n                for (key, value) in state {\n                    let key: String = key.extract()?;\n                    match key.as_ref() {\n                        \"content\" => self.content = value.extract()?,\n                        \"single_word\" => self.single_word = Some(value.extract()?),\n                        \"lstrip\" => self.lstrip = Some(value.extract()?),\n                        \"rstrip\" => self.rstrip = Some(value.extract()?),\n                        \"normalized\" => self.normalized = Some(value.extract()?),\n                        \"special\" => self.special = value.extract()?,\n                        _ => {}\n                    }\n                }\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    /// Get the content of this :obj:`AddedToken`\n    #[getter]\n    fn get_content(&self) -> &str {\n        &self.content\n    }\n\n    /// Set the content of this :obj:`AddedToken`\n    #[setter]\n    fn set_content(&mut self, content: String) {\n        self.content = content;\n    }\n\n    /// Get the value of the :obj:`rstrip` option\n    #[getter]\n    fn get_rstrip(&self) -> bool {\n        self.get_token().rstrip\n    }\n\n    /// Get the value of the :obj:`lstrip` option\n    #[getter]\n    fn get_lstrip(&self) -> bool {\n        self.get_token().lstrip\n    }\n\n    /// Get the value of the :obj:`single_word` option\n    #[getter]\n    fn get_single_word(&self) -> bool {\n        self.get_token().single_word\n    }\n\n    /// Get the value of the :obj:`normalized` option\n    #[getter]\n    fn get_normalized(&self) -> bool {\n        self.get_token().normalized\n    }\n    /// Get the value of the :obj:`special` option\n    #[getter]\n    fn get_special(&self) -> bool {\n        self.get_token().special\n    }\n\n    /// Set the value of the :obj:`special` option\n    #[setter]\n    fn set_special(&mut self, special: bool) {\n        self.special = special;\n    }\n\n    fn __str__(&self) -> PyResult<&str> {\n        Ok(&self.content)\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        let bool_to_python = |p| match p {\n            true => \"True\",\n            false => \"False\",\n        };\n\n        let token = self.get_token();\n        Ok(format!(\n            \"AddedToken(\\\"{}\\\", rstrip={}, lstrip={}, single_word={}, normalized={}, special={})\",\n            self.content,\n            bool_to_python(token.rstrip),\n            bool_to_python(token.lstrip),\n            bool_to_python(token.single_word),\n            bool_to_python(token.normalized),\n            bool_to_python(token.special)\n        ))\n    }\n\n    fn __richcmp__(&self, other: Py<PyAddedToken>, op: CompareOp) -> bool {\n        use CompareOp::*;\n        Python::attach(|py| match op {\n            Lt | Le | Gt | Ge => false,\n            Eq => self.get_token() == other.borrow(py).get_token(),\n            Ne => self.get_token() != other.borrow(py).get_token(),\n        })\n    }\n\n    fn __hash__(&self) -> u64 {\n        let mut hasher = DefaultHasher::new();\n        self.get_token().hash(&mut hasher);\n        hasher.finish()\n    }\n}\n\nstruct TextInputSequence<'s>(tk::InputSequence<'s>);\nimpl<'a, 'py> FromPyObject<'a, 'py> for TextInputSequence<'py> {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        let err = exceptions::PyTypeError::new_err(\"TextInputSequence must be str\");\n        if let Ok(s) = ob.extract::<String>() {\n            Ok(Self(s.into()))\n        } else {\n            Err(err)\n        }\n    }\n}\nimpl<'s> From<TextInputSequence<'s>> for tk::InputSequence<'s> {\n    fn from(s: TextInputSequence<'s>) -> Self {\n        s.0\n    }\n}\n\nstruct PyArrayUnicode(Vec<String>);\nimpl<'a, 'py> FromPyObject<'a, 'py> for PyArrayUnicode {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        // SAFETY Making sure the pointer is a valid numpy array requires calling numpy C code\n        if unsafe { npyffi::PyArray_Check(ob.py(), ob.as_ptr()) } == 0 {\n            return Err(exceptions::PyTypeError::new_err(\"Expected an np.array\"));\n        }\n        let arr = ob.as_ptr() as *mut npyffi::PyArrayObject;\n        // SAFETY Getting all the metadata about the numpy array to check its sanity\n        let (type_num, elsize, _alignment, data, nd, flags) = unsafe {\n            let desc = (*arr).descr;\n            (\n                (*desc).type_num,\n                npyffi::PyDataType_ELSIZE(ob.py(), desc) as usize,\n                npyffi::PyDataType_ALIGNMENT(ob.py(), desc) as usize,\n                (*arr).data,\n                (*arr).nd,\n                (*arr).flags,\n            )\n        };\n\n        if nd != 1 {\n            return Err(exceptions::PyTypeError::new_err(\n                \"Expected a 1 dimensional np.array\",\n            ));\n        }\n        if flags & (npyffi::NPY_ARRAY_C_CONTIGUOUS | npyffi::NPY_ARRAY_F_CONTIGUOUS) == 0 {\n            return Err(exceptions::PyTypeError::new_err(\n                \"Expected a contiguous np.array\",\n            ));\n        }\n        if type_num != npyffi::types::NPY_TYPES::NPY_UNICODE as i32 {\n            return Err(exceptions::PyTypeError::new_err(\n                \"Expected a np.array[dtype='U']\",\n            ));\n        }\n\n        // SAFETY Looking at the raw numpy data to create new owned Rust strings via copies (so it's safe afterwards).\n        unsafe {\n            let n_elem = *(*arr).dimensions as usize;\n            let all_bytes = std::slice::from_raw_parts(data as *const u8, elsize * n_elem);\n\n            let seq = (0..n_elem)\n                .map(|i| {\n                    let bytes = &all_bytes[i * elsize..(i + 1) * elsize];\n                    Ok(std::str::from_utf8(bytes)?.to_owned())\n                    // let unicode = pyo3::ffi::PyUnicode_FromKindAndData(\n                    //     pyo3::ffi::PyUnicode_4BYTE_KIND as _,\n                    //     bytes.as_ptr() as *const _,\n                    //     elsize as isize / alignment as isize,\n                    // );\n                    // let py = ob.py();\n                    // let obj = Py<PyAny>::from_owned_ptr(py, unicode);\n                    // let s = obj.downcast_bound::<PyString>(py)?;\n                    // Ok(s.to_string_lossy().trim_matches(char::from(0)).to_owned())\n                })\n                .collect::<PyResult<Vec<_>>>()?;\n\n            Ok(Self(seq))\n        }\n    }\n}\nimpl From<PyArrayUnicode> for tk::InputSequence<'_> {\n    fn from(s: PyArrayUnicode) -> Self {\n        s.0.into()\n    }\n}\n\nstruct PyArrayStr(Vec<String>);\n\nimpl<'a, 'py> FromPyObject<'a, 'py> for PyArrayStr {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        let array = ob.cast::<PyArray1<Py<PyAny>>>()?;\n        let seq = array\n            .readonly()\n            .as_array()\n            .iter()\n            .map(|obj| {\n                let s = obj.cast_bound::<PyString>(ob.py())?;\n                Ok(s.to_string_lossy().into_owned())\n            })\n            .collect::<PyResult<Vec<_>>>()?;\n\n        Ok(Self(seq))\n    }\n}\nimpl From<PyArrayStr> for tk::InputSequence<'_> {\n    fn from(s: PyArrayStr) -> Self {\n        s.0.into()\n    }\n}\n\nstruct PreTokenizedInputSequence<'s>(tk::InputSequence<'s>);\nimpl<'a, 'py> FromPyObject<'a, 'py> for PreTokenizedInputSequence<'py> {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        if let Ok(seq) = ob.extract::<PyArrayUnicode>() {\n            return Ok(Self(seq.into()));\n        }\n        if let Ok(seq) = ob.extract::<PyArrayStr>() {\n            return Ok(Self(seq.into()));\n        }\n        if let Ok(s) = ob.cast::<PyList>() {\n            if let Ok(seq) = s.extract::<Vec<String>>() {\n                return Ok(Self(seq.into()));\n            }\n        }\n        if let Ok(s) = ob.cast::<PyTuple>() {\n            if let Ok(seq) = s.extract::<Vec<String>>() {\n                return Ok(Self(seq.into()));\n            }\n        }\n        Err(exceptions::PyTypeError::new_err(\n            \"PreTokenizedInputSequence must be Union[List[str], Tuple[str]]\",\n        ))\n    }\n}\nimpl<'s> From<PreTokenizedInputSequence<'s>> for tk::InputSequence<'s> {\n    fn from(s: PreTokenizedInputSequence<'s>) -> Self {\n        s.0\n    }\n}\n\nstruct TextEncodeInput<'s>(tk::EncodeInput<'s>);\nimpl<'a, 'py> FromPyObject<'a, 'py> for TextEncodeInput<'py> {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        if let Ok(i) = ob.extract::<TextInputSequence>() {\n            return Ok(Self(i.into()));\n        }\n        if let Ok((i1, i2)) = ob.extract::<(TextInputSequence, TextInputSequence)>() {\n            return Ok(Self((i1, i2).into()));\n        }\n        if let Ok(arr) = ob.extract::<Vec<Py<PyAny>>>() {\n            if arr.len() == 2 {\n                let py = ob.py();\n                let first = arr[0].bind(py).extract::<TextInputSequence>()?;\n                let second = arr[1].bind(py).extract::<TextInputSequence>()?;\n                return Ok(Self((first, second).into()));\n            }\n        }\n        Err(exceptions::PyTypeError::new_err(\n            \"TextEncodeInput must be Union[TextInputSequence, Tuple[InputSequence, InputSequence]]\",\n        ))\n    }\n}\nimpl<'s> From<TextEncodeInput<'s>> for tk::tokenizer::EncodeInput<'s> {\n    fn from(i: TextEncodeInput<'s>) -> Self {\n        i.0\n    }\n}\nstruct PreTokenizedEncodeInput<'s>(tk::EncodeInput<'s>);\nimpl<'a, 'py> FromPyObject<'a, 'py> for PreTokenizedEncodeInput<'py> {\n    type Error = PyErr;\n\n    fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        if let Ok(i) = ob.extract::<PreTokenizedInputSequence>() {\n            return Ok(Self(i.into()));\n        }\n        if let Ok((i1, i2)) = ob.extract::<(PreTokenizedInputSequence, PreTokenizedInputSequence)>()\n        {\n            return Ok(Self((i1, i2).into()));\n        }\n        if let Ok(arr) = ob.extract::<Vec<Py<PyAny>>>() {\n            if arr.len() == 2 {\n                let py = ob.py();\n                let first = arr[0].bind(py).extract::<PreTokenizedInputSequence>()?;\n                let second = arr[1].bind(py).extract::<PreTokenizedInputSequence>()?;\n                return Ok(Self((first, second).into()));\n            }\n        }\n        Err(exceptions::PyTypeError::new_err(\n            \"PreTokenizedEncodeInput must be Union[PreTokenizedInputSequence, \\\n            Tuple[PreTokenizedInputSequence, PreTokenizedInputSequence]]\",\n        ))\n    }\n}\nimpl<'s> From<PreTokenizedEncodeInput<'s>> for tk::tokenizer::EncodeInput<'s> {\n    fn from(i: PreTokenizedEncodeInput<'s>) -> Self {\n        i.0\n    }\n}\n\ntype Tokenizer = TokenizerImpl<PyModel, PyNormalizer, PyPreTokenizer, PyPostProcessor, PyDecoder>;\n\n/// A :obj:`Tokenizer` works as a pipeline. It processes some raw text as input\n/// and outputs an :class:`~tokenizers.Encoding`.\n///\n/// Args:\n///     model (:class:`~tokenizers.models.Model`):\n///         The core algorithm that this :obj:`Tokenizer` should be using.\n///\n#[pyclass(dict, module = \"tokenizers\", name = \"Tokenizer\", from_py_object)]\n#[derive(Clone, Serialize)]\n#[serde(transparent)]\npub struct PyTokenizer {\n    pub(crate) tokenizer: Tokenizer,\n}\n\nimpl PyTokenizer {\n    fn new(tokenizer: Tokenizer) -> Self {\n        PyTokenizer { tokenizer }\n    }\n\n    fn from_model(model: PyModel) -> Self {\n        PyTokenizer::new(TokenizerImpl::new(model))\n    }\n\n    // Extract a pretokenized sequence into an owned Vec<String>\n    fn extract_pretok_seq(ob: &Bound<'_, PyAny>) -> PyResult<Vec<String>> {\n        if let Ok(seq) = ob.extract::<PyArrayUnicode>() {\n            return Ok(seq.0);\n        }\n        if let Ok(seq) = ob.extract::<PyArrayStr>() {\n            return Ok(seq.0);\n        }\n        if let Ok(list) = ob.cast::<PyList>() {\n            return list.extract::<Vec<String>>();\n        }\n        if let Ok(tup) = ob.cast::<PyTuple>() {\n            return tup.extract::<Vec<String>>();\n        }\n        Err(exceptions::PyTypeError::new_err(\n            \"PreTokenizedInputSequence must be List[str] | Tuple[str] | np.ndarray[U] | np.ndarray[object[str]]\",\n        ))\n    }\n\n    // Convert Python inputs into fully-owned EncodeInput<'static>\n    fn build_owned_encode_inputs(\n        items: &[Bound<'_, PyAny>],\n        is_pretokenized: bool,\n    ) -> PyResult<Vec<tk::EncodeInput<'static>>> {\n        let mut out = Vec::with_capacity(items.len());\n\n        for it in items {\n            if is_pretokenized {\n                // Pair?\n                if let Ok(tup) = it.cast::<PyTuple>() {\n                    if tup.len() == 2 {\n                        let a = Self::extract_pretok_seq(&tup.get_item(0)?)?;\n                        let b = Self::extract_pretok_seq(&tup.get_item(1)?)?;\n                        out.push(tk::EncodeInput::Dual(a.into(), b.into()));\n                        continue;\n                    }\n                }\n                if let Ok(lst) = it.cast::<PyList>() {\n                    if lst.len() == 2 {\n                        let a = Self::extract_pretok_seq(&lst.get_item(0)?)?;\n                        let b = Self::extract_pretok_seq(&lst.get_item(1)?)?;\n                        out.push(tk::EncodeInput::Dual(a.into(), b.into()));\n                        continue;\n                    }\n                }\n                // Single pretokenized\n                let a = Self::extract_pretok_seq(it)?;\n                out.push(tk::EncodeInput::Single(a.into()));\n            } else {\n                // Raw text: pair?\n                if let Ok(tup) = it.cast::<PyTuple>() {\n                    if tup.len() == 2 {\n                        let a: String = tup.get_item(0)?.extract()?;\n                        let b: String = tup.get_item(1)?.extract()?;\n                        out.push(tk::EncodeInput::Dual(a.into(), b.into()));\n                        continue;\n                    }\n                }\n                if let Ok(lst) = it.cast::<PyList>() {\n                    if lst.len() == 2\n                        && lst.get_item(0)?.cast::<PyString>().is_ok()\n                        && lst.get_item(1)?.cast::<PyString>().is_ok()\n                    {\n                        let a: String = lst.get_item(0)?.extract()?;\n                        let b: String = lst.get_item(1)?.extract()?;\n                        out.push(tk::EncodeInput::Dual(a.into(), b.into()));\n                        continue;\n                    }\n                }\n                // Single raw text\n                let s: String = it.extract()?;\n                out.push(tk::EncodeInput::Single(s.into()));\n            }\n        }\n        Ok(out)\n    }\n\n    // Helper method to build a single owned encode input\n    fn build_single_owned_encode_input(\n        sequence: &Bound<'_, PyAny>,\n        pair: Option<&Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n    ) -> PyResult<tk::EncodeInput<'static>> {\n        let owned_sequence: tk::InputSequence<'static> = if is_pretokenized {\n            let seq = Self::extract_pretok_seq(sequence)?;\n            seq.into()\n        } else {\n            let s: String = sequence.extract()?;\n            s.into()\n        };\n\n        if let Some(pair) = pair {\n            let owned_pair: tk::InputSequence<'static> = if is_pretokenized {\n                let seq = Self::extract_pretok_seq(pair)?;\n                seq.into()\n            } else {\n                let s: String = pair.extract()?;\n                s.into()\n            };\n            Ok(tk::EncodeInput::Dual(owned_sequence, owned_pair))\n        } else {\n            Ok(tk::EncodeInput::Single(owned_sequence))\n        }\n    }\n}\n\n#[pymethods]\nimpl PyTokenizer {\n    #[new]\n    #[pyo3(text_signature = \"(self, model)\")]\n    fn __new__(model: PyRef<PyModel>) -> Self {\n        PyTokenizer::from_model(model.clone())\n    }\n\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.tokenizer).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle Tokenizer: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                self.tokenizer = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle Tokenizer: {e}\"\n                    ))\n                })?;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    fn __getnewargs__<'p>(&self, py: Python<'p>) -> PyResult<Bound<'p, PyTuple>> {\n        let model: Py<PyAny> = PyModel::from(BPE::default())\n            .into_pyobject(py)?\n            .into_any()\n            .into();\n        PyTuple::new(py, vec![model])\n    }\n\n    /// Instantiate a new :class:`~tokenizers.Tokenizer` from the given JSON string.\n    ///\n    /// Args:\n    ///     json (:obj:`str`):\n    ///         A valid JSON string representing a previously serialized\n    ///         :class:`~tokenizers.Tokenizer`\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Tokenizer`: The new tokenizer\n    #[staticmethod]\n    #[pyo3(signature = (json) -> \"Tokenizer\")]\n    #[pyo3(text_signature = \"(json)\")]\n    fn from_str(json: &str) -> PyResult<Self> {\n        let tokenizer: PyResult<_> = ToPyResult(json.parse()).into();\n        Ok(Self::new(tokenizer?))\n    }\n\n    /// Instantiate a new :class:`~tokenizers.Tokenizer` from the file at the given path.\n    ///\n    /// Args:\n    ///     path (:obj:`str`):\n    ///         A path to a local JSON file representing a previously serialized\n    ///         :class:`~tokenizers.Tokenizer`\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Tokenizer`: The new tokenizer\n    #[staticmethod]\n    #[pyo3(signature = (path) -> \"Tokenizer\")]\n    #[pyo3(text_signature = \"(path)\")]\n    fn from_file(path: &str) -> PyResult<Self> {\n        let tokenizer: PyResult<_> = ToPyResult(Tokenizer::from_file(path)).into();\n        Ok(Self::new(tokenizer?))\n    }\n\n    /// Instantiate a new :class:`~tokenizers.Tokenizer` from the given buffer.\n    ///\n    /// Args:\n    ///     buffer (:obj:`bytes`):\n    ///         A buffer containing a previously serialized :class:`~tokenizers.Tokenizer`\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Tokenizer`: The new tokenizer\n    #[staticmethod]\n    #[pyo3(signature = (buffer) -> \"Tokenizer\")]\n    #[pyo3(text_signature = \"(buffer)\")]\n    fn from_buffer(buffer: &Bound<'_, PyBytes>) -> PyResult<Self> {\n        let tokenizer = serde_json::from_slice(buffer.as_bytes()).map_err(|e| {\n            exceptions::PyValueError::new_err(format!(\n                \"Cannot instantiate Tokenizer from buffer: {e}\"\n            ))\n        })?;\n        Ok(Self { tokenizer })\n    }\n\n    /// Instantiate a new :class:`~tokenizers.Tokenizer` from an existing file on the\n    /// Hugging Face Hub.\n    ///\n    /// Args:\n    ///     identifier (:obj:`str`):\n    ///         The identifier of a Model on the Hugging Face Hub, that contains\n    ///         a tokenizer.json file\n    ///     revision (:obj:`str`, defaults to `main`):\n    ///         A branch or commit id\n    ///     token (:obj:`str`, `optional`, defaults to `None`):\n    ///         An optional auth token used to access private repositories on the\n    ///         Hugging Face Hub\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Tokenizer`: The new tokenizer\n    #[staticmethod]\n    #[pyo3(signature = (identifier, revision = String::from(\"main\"), token = None) -> \"Tokenizer\")]\n    #[pyo3(text_signature = \"(identifier, revision=\\\"main\\\", token=None)\")]\n    fn from_pretrained(\n        identifier: &str,\n        revision: String,\n        token: Option<String>,\n    ) -> PyResult<Self> {\n        let path = Python::attach(|py| -> PyResult<String> {\n            let huggingface_hub = PyModule::import(py, intern!(py, \"huggingface_hub\"))?;\n            let hf_hub_download = huggingface_hub.getattr(intern!(py, \"hf_hub_download\"))?;\n            let kwargs = [\n                (intern!(py, \"repo_id\"), identifier),\n                (intern!(py, \"filename\"), \"tokenizer.json\"),\n                (intern!(py, \"revision\"), &revision),\n            ]\n            .into_py_dict(py)?;\n            if let Some(token) = token {\n                kwargs.set_item(intern!(py, \"token\"), token)?;\n            }\n            let path: String = hf_hub_download.call((), Some(&kwargs))?.extract()?;\n            Ok(path)\n        })?;\n\n        let tokenizer: PyResult<_> = ToPyResult(Tokenizer::from_file(path)).into();\n        Ok(Self::new(tokenizer?))\n    }\n\n    /// Gets a serialized string representing this :class:`~tokenizers.Tokenizer`.\n    ///\n    /// Args:\n    ///     pretty (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the JSON string should be pretty formatted.\n    ///\n    /// Returns:\n    ///     :obj:`str`: A string representing the serialized Tokenizer\n    #[pyo3(signature = (pretty = false) -> \"str\")]\n    #[pyo3(text_signature = \"(self, pretty=False)\")]\n    fn to_str(&self, pretty: bool) -> PyResult<String> {\n        ToPyResult(self.tokenizer.to_string(pretty)).into()\n    }\n\n    /// Save the :class:`~tokenizers.Tokenizer` to the file at the given path.\n    ///\n    /// Args:\n    ///     path (:obj:`str`):\n    ///         A path to a file in which to save the serialized tokenizer.\n    ///\n    ///     pretty (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether the JSON file should be pretty formatted.\n    #[pyo3(signature = (path, pretty = true) -> \"None\")]\n    #[pyo3(text_signature = \"(self, path, pretty=True)\")]\n    fn save(&self, path: &str, pretty: bool) -> PyResult<()> {\n        ToPyResult(self.tokenizer.save(path, pretty)).into()\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    /// Return the number of special tokens that would be added for single/pair sentences.\n    /// :param is_pair: Boolean indicating if the input would be a single sentence or a pair\n    /// :return:\n    #[pyo3(text_signature = \"(self, is_pair)\")]\n    fn num_special_tokens_to_add(&self, is_pair: bool) -> usize {\n        self.tokenizer\n            .get_post_processor()\n            .map_or(0, |p| p.added_tokens(is_pair))\n    }\n\n    /// Get the underlying vocabulary\n    ///\n    /// Args:\n    ///     with_added_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to include the added tokens\n    ///\n    /// Returns:\n    ///     :obj:`Dict[str, int]`: The vocabulary\n    #[pyo3(signature = (with_added_tokens = true) -> \"dict[str, int]\")]\n    #[pyo3(text_signature = \"(self, with_added_tokens=True)\")]\n    fn get_vocab(&self, with_added_tokens: bool) -> HashMap<String, u32> {\n        self.tokenizer.get_vocab(with_added_tokens)\n    }\n\n    /// Get the underlying vocabulary\n    ///\n    /// Returns:\n    ///     :obj:`Dict[int, AddedToken]`: The vocabulary\n    #[pyo3(signature = () -> \"dict[int, AddedToken]\")]\n    #[pyo3(text_signature = \"(self)\")]\n    fn get_added_tokens_decoder(&self) -> BTreeMap<u32, PyAddedToken> {\n        let mut sorted_map = BTreeMap::new();\n\n        for (key, value) in self.tokenizer.get_added_tokens_decoder() {\n            sorted_map.insert(key, value.into());\n        }\n\n        sorted_map\n    }\n\n    /// Get the size of the underlying vocabulary\n    ///\n    /// Args:\n    ///     with_added_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to include the added tokens\n    ///\n    /// Returns:\n    ///     :obj:`int`: The size of the vocabulary\n    #[pyo3(signature = (with_added_tokens = true) -> \"int\")]\n    #[pyo3(text_signature = \"(self, with_added_tokens=True)\")]\n    fn get_vocab_size(&self, with_added_tokens: bool) -> usize {\n        self.tokenizer.get_vocab_size(with_added_tokens)\n    }\n\n    /// Enable truncation\n    ///\n    /// Args:\n    ///     max_length (:obj:`int`):\n    ///         The max length at which to truncate\n    ///\n    ///     stride (:obj:`int`, `optional`):\n    ///         The length of the previous first sequence to be included in the overflowing\n    ///         sequence\n    ///\n    ///     strategy (:obj:`str`, `optional`, defaults to :obj:`longest_first`):\n    ///         The strategy used to truncation. Can be one of ``longest_first``, ``only_first`` or\n    ///         ``only_second``.\n    ///\n    ///     direction (:obj:`str`, defaults to :obj:`right`):\n    ///         Truncate direction\n    #[pyo3(signature = (max_length, **kwargs) -> \"None\")]\n    #[pyo3(\n        text_signature = \"(self, max_length, stride=0, strategy='longest_first', direction='right')\"\n    )]\n    fn enable_truncation(\n        &mut self,\n        max_length: usize,\n        kwargs: Option<&Bound<'_, PyDict>>,\n    ) -> PyResult<()> {\n        let mut params = TruncationParams {\n            max_length,\n            ..Default::default()\n        };\n\n        if let Some(kwargs) = kwargs {\n            for (key, value) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"stride\" => params.stride = value.extract()?,\n                    \"strategy\" => {\n                        let value: String = value.extract()?;\n                        params.strategy = match value.as_ref() {\n                            \"longest_first\" => Ok(TruncationStrategy::LongestFirst),\n                            \"only_first\" => Ok(TruncationStrategy::OnlyFirst),\n                            \"only_second\" => Ok(TruncationStrategy::OnlySecond),\n                            _ => Err(PyError(format!(\n                                \"Unknown `strategy`: `{value}`. Use \\\n                                 one of `longest_first`, `only_first`, or `only_second`\"\n                            ))\n                            .into_pyerr::<exceptions::PyValueError>()),\n                        }?\n                    }\n                    \"direction\" => {\n                        let value: String = value.extract()?;\n                        params.direction = match value.as_ref() {\n                            \"left\" => Ok(TruncationDirection::Left),\n                            \"right\" => Ok(TruncationDirection::Right),\n                            _ => Err(PyError(format!(\n                                \"Unknown `direction`: `{value}`. Use \\\n                                 one of `left` or `right`.\"\n                            ))\n                            .into_pyerr::<exceptions::PyValueError>()),\n                        }?\n                    }\n                    _ => println!(\"Ignored unknown kwarg option {key}\"),\n                }\n            }\n        }\n\n        if let Err(error_message) = self.tokenizer.with_truncation(Some(params)) {\n            return Err(PyError(error_message.to_string()).into_pyerr::<exceptions::PyValueError>());\n        }\n        Ok(())\n    }\n\n    /// Disable truncation\n    #[pyo3(text_signature = \"(self)\")]\n    fn no_truncation(&mut self) {\n        self.tokenizer\n            .with_truncation(None)\n            .expect(\"Failed to set truncation to `None`! This should never happen\");\n    }\n\n    /// Get the currently set truncation parameters\n    ///\n    /// `Cannot set, use` :meth:`~tokenizers.Tokenizer.enable_truncation` `instead`\n    ///\n    /// Returns:\n    ///     (:obj:`dict`, `optional`):\n    ///         A dict with the current truncation parameters if truncation is enabled\n    #[getter]\n    fn get_truncation<'py>(&self, py: Python<'py>) -> PyResult<Option<Bound<'py, PyDict>>> {\n        self.tokenizer.get_truncation().map_or(Ok(None), |params| {\n            let dict = PyDict::new(py);\n\n            dict.set_item(\"max_length\", params.max_length)?;\n            dict.set_item(\"stride\", params.stride)?;\n            dict.set_item(\"strategy\", params.strategy.as_ref())?;\n            dict.set_item(\"direction\", params.direction.as_ref())?;\n\n            Ok(Some(dict))\n        })\n    }\n\n    /// Enable the padding\n    ///\n    /// Args:\n    ///     direction (:obj:`str`, `optional`, defaults to :obj:`right`):\n    ///         The direction in which to pad. Can be either ``right`` or ``left``\n    ///\n    ///     pad_to_multiple_of (:obj:`int`, `optional`):\n    ///         If specified, the padding length should always snap to the next multiple of the\n    ///         given value. For example if we were going to pad witha length of 250 but\n    ///         ``pad_to_multiple_of=8`` then we will pad to 256.\n    ///\n    ///     pad_id (:obj:`int`, defaults to 0):\n    ///         The id to be used when padding\n    ///\n    ///     pad_type_id (:obj:`int`, defaults to 0):\n    ///         The type id to be used when padding\n    ///\n    ///     pad_token (:obj:`str`, defaults to :obj:`[PAD]`):\n    ///         The pad token to be used when padding\n    ///\n    ///     length (:obj:`int`, `optional`):\n    ///         If specified, the length at which to pad. If not specified we pad using the size of\n    ///         the longest sequence in a batch.\n    #[pyo3(signature = (**kwargs) -> \"None\")]\n    #[pyo3(\n        text_signature = \"(self, direction='right', pad_id=0, pad_type_id=0, pad_token='[PAD]', length=None, pad_to_multiple_of=None)\"\n    )]\n    fn enable_padding(&mut self, kwargs: Option<&Bound<'_, PyDict>>) -> PyResult<()> {\n        let mut params = PaddingParams::default();\n\n        if let Some(kwargs) = kwargs {\n            for (key, value) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"direction\" => {\n                        let value: String = value.extract()?;\n                        params.direction = match value.as_ref() {\n                            \"left\" => Ok(PaddingDirection::Left),\n                            \"right\" => Ok(PaddingDirection::Right),\n                            other => Err(PyError(format!(\n                                \"Unknown `direction`: `{other}`. Use \\\n                                 one of `left` or `right`\"\n                            ))\n                            .into_pyerr::<exceptions::PyValueError>()),\n                        }?;\n                    }\n                    \"pad_to_multiple_of\" => {\n                        if let Some(multiple) = value.extract()? {\n                            params.pad_to_multiple_of = multiple;\n                        }\n                    }\n                    \"pad_id\" => params.pad_id = value.extract()?,\n                    \"pad_type_id\" => params.pad_type_id = value.extract()?,\n                    \"pad_token\" => params.pad_token = value.extract()?,\n                    \"max_length\" => {\n                        println!(\n                            \"enable_padding(max_length=X) is deprecated, \\\n                                 use enable_padding(length=X) instead\"\n                        );\n                        if let Some(l) = value.extract()? {\n                            params.strategy = PaddingStrategy::Fixed(l);\n                        } else {\n                            params.strategy = PaddingStrategy::BatchLongest;\n                        }\n                    }\n                    \"length\" => {\n                        if let Some(l) = value.extract()? {\n                            params.strategy = PaddingStrategy::Fixed(l);\n                        } else {\n                            params.strategy = PaddingStrategy::BatchLongest;\n                        }\n                    }\n                    _ => println!(\"Ignored unknown kwarg option {key}\"),\n                }\n            }\n        }\n\n        self.tokenizer.with_padding(Some(params));\n\n        Ok(())\n    }\n\n    /// Disable padding\n    #[pyo3(text_signature = \"(self)\")]\n    fn no_padding(&mut self) {\n        self.tokenizer.with_padding(None);\n    }\n\n    /// Get the current padding parameters\n    ///\n    /// `Cannot be set, use` :meth:`~tokenizers.Tokenizer.enable_padding` `instead`\n    ///\n    /// Returns:\n    ///     (:obj:`dict`, `optional`):\n    ///         A dict with the current padding parameters if padding is enabled\n    #[getter]\n    fn get_padding<'py>(&self, py: Python<'py>) -> PyResult<Option<Bound<'py, PyDict>>> {\n        self.tokenizer.get_padding().map_or(Ok(None), |params| {\n            let dict = PyDict::new(py);\n\n            dict.set_item(\n                \"length\",\n                match params.strategy {\n                    tk::PaddingStrategy::BatchLongest => None,\n                    tk::PaddingStrategy::Fixed(size) => Some(size),\n                },\n            )?;\n            dict.set_item(\"pad_to_multiple_of\", params.pad_to_multiple_of)?;\n            dict.set_item(\"pad_id\", params.pad_id)?;\n            dict.set_item(\"pad_token\", &params.pad_token)?;\n            dict.set_item(\"pad_type_id\", params.pad_type_id)?;\n            dict.set_item(\"direction\", params.direction.as_ref())?;\n\n            Ok(Some(dict))\n        })\n    }\n\n    /// Encode the given sequence and pair. This method can process raw text sequences\n    /// as well as already pre-tokenized sequences.\n    ///\n    /// Example:\n    ///     Here are some examples of the inputs that are accepted::\n    ///\n    ///         encode(\"A single sequence\")`\n    ///         encode(\"A sequence\", \"And its pair\")`\n    ///         encode([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], is_pretokenized=True)`\n    ///         encode(\n    ///             [ \"A\", \"pre\", \"tokenized\", \"sequence\" ], [ \"And\", \"its\", \"pair\" ],\n    ///             is_pretokenized=True\n    ///         )\n    ///\n    /// Args:\n    ///     sequence (:obj:`~tokenizers.InputSequence`):\n    ///         The main input sequence we want to encode. This sequence can be either raw\n    ///         text or pre-tokenized, according to the ``is_pretokenized`` argument:\n    ///\n    ///         - If ``is_pretokenized=False``: :class:`~tokenizers.TextInputSequence`\n    ///         - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedInputSequence`\n    ///\n    ///     pair (:obj:`~tokenizers.InputSequence`, `optional`):\n    ///         An optional input sequence. The expected format is the same that for ``sequence``.\n    ///\n    ///     is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the input is already pre-tokenized\n    ///\n    ///     add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Encoding`: The encoded result\n    ///\n    #[pyo3(signature = (sequence, pair = None, is_pretokenized = false, add_special_tokens = true) -> \"Encoding\")]\n    #[pyo3(\n        text_signature = \"(self, sequence, pair=None, is_pretokenized=False, add_special_tokens=True)\"\n    )]\n    fn encode(\n        &self,\n        sequence: &Bound<'_, PyAny>,\n        pair: Option<&Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n        add_special_tokens: bool,\n    ) -> PyResult<PyEncoding> {\n        let sequence: tk::InputSequence = if is_pretokenized {\n            sequence.extract::<PreTokenizedInputSequence>()?.into()\n        } else {\n            sequence.extract::<TextInputSequence>()?.into()\n        };\n        let input = match pair {\n            Some(pair) => {\n                let pair: tk::InputSequence = if is_pretokenized {\n                    pair.extract::<PreTokenizedInputSequence>()?.into()\n                } else {\n                    pair.extract::<TextInputSequence>()?.into()\n                };\n                tk::EncodeInput::Dual(sequence, pair)\n            }\n            None => tk::EncodeInput::Single(sequence),\n        };\n\n        ToPyResult(\n            self.tokenizer\n                .encode_char_offsets(input, add_special_tokens)\n                .map(|e| e.into()),\n        )\n        .into()\n    }\n\n    /// Asynchronously encode the given input with character offsets.\n    ///\n    /// This is an async version of encode that can be awaited in async Python code.\n    ///\n    /// Example:\n    ///     Here are some examples of the inputs that are accepted::\n    ///\n    ///         await async_encode(\"A single sequence\")\n    ///\n    /// Args:\n    ///     sequence (:obj:`~tokenizers.InputSequence`):\n    ///         The main input sequence we want to encode. This sequence can be either raw\n    ///         text or pre-tokenized, according to the ``is_pretokenized`` argument:\n    ///\n    ///         - If ``is_pretokenized=False``: :class:`~tokenizers.TextInputSequence`\n    ///         - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedInputSequence`\n    ///\n    ///     pair (:obj:`~tokenizers.InputSequence`, `optional`):\n    ///         An optional input sequence. The expected format is the same that for ``sequence``.\n    ///\n    ///     is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the input is already pre-tokenized\n    ///\n    ///     add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Encoding`: The encoded result\n    ///\n    #[pyo3(signature = (sequence, pair = None, is_pretokenized = false, add_special_tokens = true))]\n    #[pyo3(\n        text_signature = \"(self, sequence, pair=None, is_pretokenized=False, add_special_tokens=True)\"\n    )]\n    fn async_encode<'py>(\n        &self,\n        py: Python<'py>,\n        sequence: &Bound<'_, PyAny>,\n        pair: Option<&Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n        add_special_tokens: bool,\n    ) -> PyResult<Bound<'py, PyAny>> {\n        // Extract and fully own the inputs before leaving the GIL/thread\n        let input = Self::build_single_owned_encode_input(sequence, pair, is_pretokenized)?;\n\n        let tokenizer = self.tokenizer.clone();\n        let rt = crate::TOKIO_RUNTIME.clone();\n\n        let fut = py.detach(|| async move {\n            rt.spawn_blocking(move || {\n                tokenizer\n                    .encode(input, add_special_tokens)\n                    .map(PyEncoding::from)\n            })\n            .await\n            .unwrap()\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n        });\n\n        pyo3_async_runtimes::tokio::future_into_py(py, fut)\n    }\n\n    /// Encode the given batch of inputs. This method accept both raw text sequences\n    /// as well as already pre-tokenized sequences. The reason we use `PySequence` is\n    /// because it allows type checking with zero-cost (according to PyO3) as we don't\n    /// have to convert to check.\n    ///\n    /// Example:\n    ///     Here are some examples of the inputs that are accepted::\n    ///\n    ///         encode_batch([\n    ///             \"A single sequence\",\n    ///             (\"A tuple with a sequence\", \"And its pair\"),\n    ///             [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n    ///             ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n    ///         ])\n    ///\n    /// Args:\n    ///     input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n    ///         A list of single sequences or pair sequences to encode. Each sequence\n    ///         can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n    ///         argument:\n    ///\n    ///         - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n    ///         - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n    ///\n    ///     is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the input is already pre-tokenized\n    ///\n    ///     add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n    ///\n    #[pyo3(signature = (input, is_pretokenized = false, add_special_tokens = true) -> \"list[Encoding]\")]\n    #[pyo3(text_signature = \"(self, input, is_pretokenized=False, add_special_tokens=True)\")]\n    fn encode_batch(\n        &self,\n        py: Python<'_>,\n        input: Vec<Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n        add_special_tokens: bool,\n    ) -> PyResult<Vec<PyEncoding>> {\n        let mut items = Vec::<tk::EncodeInput>::with_capacity(input.len());\n        for item in &input {\n            let item: tk::EncodeInput = if is_pretokenized {\n                item.extract::<PreTokenizedEncodeInput>()?.into()\n            } else {\n                item.extract::<TextEncodeInput>()?.into()\n            };\n            items.push(item);\n        }\n        py.detach(|| {\n            ToPyResult(\n                self.tokenizer\n                    .encode_batch_char_offsets(items, add_special_tokens)\n                    .map(|encodings| encodings.into_iter().map(|e| e.into()).collect()),\n            )\n            .into()\n        })\n    }\n    /// Asynchronously encode the given batch of inputs with character offsets.\n    ///\n    /// This is an async version of encode_batch that can be awaited in async Python code.\n    ///\n    /// Example:\n    ///     Here are some examples of the inputs that are accepted::\n    ///\n    ///         await async_encode_batch([\n    ///             \"A single sequence\",\n    ///             (\"A tuple with a sequence\", \"And its pair\"),\n    ///             [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n    ///             ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n    ///         ])\n    ///\n    /// Args:\n    ///     input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n    ///         A list of single sequences or pair sequences to encode. Each sequence\n    ///         can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n    ///         argument:\n    ///\n    ///         - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n    ///         - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n    ///\n    ///     is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the input is already pre-tokenized\n    ///\n    ///     add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n    ///\n    #[pyo3(name = \"async_encode_batch\", signature = (input, is_pretokenized = false, add_special_tokens = true))]\n    #[pyo3(text_signature = \"(self, input, is_pretokenized=False, add_special_tokens=True)\")]\n    fn async_encode_batch<'py>(\n        &self,\n        py: Python<'py>,\n        input: Vec<Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n        add_special_tokens: bool,\n    ) -> PyResult<Bound<'py, PyAny>> {\n        // Fully own the inputs before leaving the GIL/thread\n        let owned_items = Self::build_owned_encode_inputs(&input, is_pretokenized)?;\n\n        let tokenizer = self.tokenizer.clone();\n        let rt = crate::TOKIO_RUNTIME.clone();\n\n        let fut = py.detach(|| async move {\n            rt.spawn_blocking(move || {\n                tokenizer\n                    .encode_batch_char_offsets(owned_items, add_special_tokens)\n                    .map(|encs| encs.into_iter().map(PyEncoding::from).collect::<Vec<_>>())\n            })\n            .await\n            .unwrap()\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n        });\n\n        pyo3_async_runtimes::tokio::future_into_py(py, fut)\n    }\n\n    /// Encode the given batch of inputs. This method is faster than `encode_batch`\n    /// because it doesn't keep track of offsets, they will be all zeros.\n    ///\n    /// Example:\n    ///     Here are some examples of the inputs that are accepted::\n    ///\n    ///         encode_batch_fast([\n    ///             \"A single sequence\",\n    ///             (\"A tuple with a sequence\", \"And its pair\"),\n    ///             [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n    ///             ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n    ///         ])\n    ///\n    /// Args:\n    ///     input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n    ///         A list of single sequences or pair sequences to encode. Each sequence\n    ///         can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n    ///         argument:\n    ///\n    ///         - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n    ///         - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n    ///\n    ///     is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the input is already pre-tokenized\n    ///\n    ///     add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n    ///\n    #[pyo3(signature = (input, is_pretokenized = false, add_special_tokens = true) -> \"list[Encoding]\")]\n    #[pyo3(text_signature = \"(self, input, is_pretokenized=False, add_special_tokens=True)\")]\n    fn encode_batch_fast(\n        &self,\n        py: Python<'_>,\n        input: Vec<Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n        add_special_tokens: bool,\n    ) -> PyResult<Vec<PyEncoding>> {\n        let mut items = Vec::<tk::EncodeInput>::with_capacity(input.len());\n        for item in &input {\n            let item: tk::EncodeInput = if is_pretokenized {\n                item.extract::<PreTokenizedEncodeInput>()?.into()\n            } else {\n                item.extract::<TextEncodeInput>()?.into()\n            };\n            items.push(item);\n        }\n        py.detach(|| {\n            ToPyResult(\n                self.tokenizer\n                    .encode_batch_fast(items, add_special_tokens)\n                    .map(|encodings| encodings.into_iter().map(|e| e.into()).collect()),\n            )\n            .into()\n        })\n    }\n\n    /// Asynchronously encode the given batch of inputs without tracking character offsets.\n    ///\n    /// This is an async version of encode_batch_fast that can be awaited in async Python code.\n    ///\n    /// Example:\n    ///     Here are some examples of the inputs that are accepted::\n    ///\n    ///         await async_encode_batch_fast([\n    ///             \"A single sequence\",\n    ///             (\"A tuple with a sequence\", \"And its pair\"),\n    ///             [ \"A\", \"pre\", \"tokenized\", \"sequence\" ],\n    ///             ([ \"A\", \"pre\", \"tokenized\", \"sequence\" ], \"And its pair\")\n    ///         ])\n    ///\n    /// Args:\n    ///     input (A :obj:`List`/:obj:`Tuple` of :obj:`~tokenizers.EncodeInput`):\n    ///         A list of single sequences or pair sequences to encode. Each sequence\n    ///         can be either raw text or pre-tokenized, according to the ``is_pretokenized``\n    ///         argument:\n    ///\n    ///         - If ``is_pretokenized=False``: :class:`~tokenizers.TextEncodeInput`\n    ///         - If ``is_pretokenized=True``: :class:`~tokenizers.PreTokenizedEncodeInput`\n    ///\n    ///     is_pretokenized (:obj:`bool`, defaults to :obj:`False`):\n    ///         Whether the input is already pre-tokenized\n    ///\n    ///     add_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     A :obj:`List` of :class:`~tokenizers.Encoding`: The encoded batch\n    ///\n    #[pyo3(name = \"async_encode_batch_fast\", signature = (input, is_pretokenized = false, add_special_tokens = true))]\n    #[pyo3(text_signature = \"(self, input, is_pretokenized=False, add_special_tokens=True)\")]\n    fn async_encode_batch_fast<'py>(\n        &self,\n        py: Python<'py>,\n        input: Vec<Bound<'_, PyAny>>,\n        is_pretokenized: bool,\n        add_special_tokens: bool,\n    ) -> PyResult<Bound<'py, PyAny>> {\n        let owned_items = Self::build_owned_encode_inputs(&input, is_pretokenized)?;\n\n        let tokenizer = self.tokenizer.clone();\n        let rt = crate::TOKIO_RUNTIME.clone();\n        let fut = py.detach(|| async move {\n            let result = rt\n                .spawn_blocking(move || {\n                    tokenizer\n                        .encode_batch_fast(owned_items, add_special_tokens)\n                        .map(|encs| encs.into_iter().map(PyEncoding::from).collect::<Vec<_>>())\n                })\n                .await\n                .unwrap();\n\n            // Convert to a Python object directly rather than going through ToPyResult\n            match result {\n                Ok(encodings) => Python::attach(|py| encodings.into_py_any(py)),\n                Err(e) => Err(exceptions::PyException::new_err(e.to_string())),\n            }\n        });\n\n        pyo3_async_runtimes::tokio::future_into_py(py, fut)\n    }\n\n    /// Decode the given list of ids back to a string\n    ///\n    /// This is used to decode anything coming back from a Language Model\n    ///\n    /// Args:\n    ///     ids (A :obj:`List/Tuple` of :obj:`int`):\n    ///         The list of ids that we want to decode\n    ///\n    ///     skip_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether the special tokens should be removed from the decoded string\n    ///\n    /// Returns:\n    ///     :obj:`str`: The decoded string\n    #[pyo3(signature = (ids, skip_special_tokens = true) -> \"str\")]\n    #[pyo3(text_signature = \"(self, ids, skip_special_tokens=True)\")]\n    fn decode(&self, ids: Vec<u32>, skip_special_tokens: bool) -> PyResult<String> {\n        ToPyResult(self.tokenizer.decode(&ids, skip_special_tokens)).into()\n    }\n\n    /// Decode a batch of ids back to their corresponding string\n    ///\n    /// Args:\n    ///     sequences (:obj:`List` of :obj:`List[int]`):\n    ///         The batch of sequences we want to decode\n    ///\n    ///     skip_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether the special tokens should be removed from the decoded strings\n    ///\n    /// Returns:\n    ///     :obj:`List[str]`: A list of decoded strings\n    #[pyo3(signature = (sequences, skip_special_tokens = true) -> \"list[str]\")]\n    #[pyo3(text_signature = \"(self, sequences, skip_special_tokens=True)\")]\n    fn decode_batch(\n        &self,\n        py: Python<'_>,\n        sequences: Vec<Vec<u32>>,\n        skip_special_tokens: bool,\n    ) -> PyResult<Vec<String>> {\n        py.detach(|| {\n            let slices = sequences.iter().map(|v| &v[..]).collect::<Vec<&[u32]>>();\n            ToPyResult(self.tokenizer.decode_batch(&slices, skip_special_tokens)).into()\n        })\n    }\n\n    /// Decode a batch of ids back to their corresponding string\n    ///\n    /// Args:\n    ///     sequences (:obj:`List` of :obj:`List[int]`):\n    ///         The batch of sequences we want to decode\n    ///\n    ///     skip_special_tokens (:obj:`bool`, defaults to :obj:`True`):\n    ///         Whether the special tokens should be removed from the decoded strings\n    ///\n    /// Returns:\n    ///     :obj:`List[str]`: A list of decoded strings\n    #[pyo3(name = \"async_decode_batch\", signature = (sequences, skip_special_tokens = true))]\n    #[pyo3(text_signature = \"(self, sequences, skip_special_tokens=True)\")]\n    fn async_decode_batch<'py>(\n        &self,\n        py: Python<'py>,\n        sequences: Vec<Vec<u32>>,\n        skip_special_tokens: bool,\n    ) -> PyResult<Bound<'py, PyAny>> {\n        let tokenizer = self.tokenizer.clone();\n        let rt = crate::TOKIO_RUNTIME.clone();\n\n        let fut = py.detach(|| async move {\n            rt.spawn_blocking(move || {\n                let slices = sequences.iter().map(|v| &v[..]).collect::<Vec<&[u32]>>();\n                tokenizer.decode_batch(&slices, skip_special_tokens)\n            })\n            .await\n            .unwrap()\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n        });\n\n        pyo3_async_runtimes::tokio::future_into_py(py, fut)\n    }\n\n    /// Convert the given token to its corresponding id if it exists\n    ///\n    /// Args:\n    ///     token (:obj:`str`):\n    ///         The token to convert\n    ///\n    /// Returns:\n    ///     :obj:`Optional[int]`: An optional id, :obj:`None` if out of vocabulary\n    #[pyo3(signature = (token) -> \"int | None\", text_signature = \"(self, token)\")]\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.tokenizer.token_to_id(token)\n    }\n\n    /// Convert the given id to its corresponding token if it exists\n    ///\n    /// Args:\n    ///     id (:obj:`int`):\n    ///         The id to convert\n    ///\n    /// Returns:\n    ///     :obj:`Optional[str]`: An optional token, :obj:`None` if out of vocabulary\n    #[pyo3(signature = (id) -> \"str | None\", text_signature = \"(self, id)\")]\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.tokenizer.id_to_token(id)\n    }\n\n    /// Modifies the tokenizer in order to use or not the special tokens\n    /// during encoding.\n    ///\n    /// Args:\n    ///     value (:obj:`bool`):\n    ///         Whether to use the special tokens or not\n    ///\n    #[setter]\n    fn set_encode_special_tokens(&mut self, value: bool) {\n        self.tokenizer.set_encode_special_tokens(value);\n    }\n    /// Get the value of the `encode_special_tokens` attribute\n    ///\n    /// Returns:\n    ///     :obj:`bool`: the tokenizer's encode_special_tokens attribute\n    #[getter]\n    fn get_encode_special_tokens(&self) -> bool {\n        self.tokenizer.get_encode_special_tokens()\n    }\n    /// Add the given tokens to the vocabulary\n    ///\n    /// The given tokens are added only if they don't already exist in the vocabulary.\n    /// Each token then gets a new attributed id.\n    ///\n    /// Args:\n    ///     tokens (A :obj:`List` of :class:`~tokenizers.AddedToken` or :obj:`str`):\n    ///         The list of tokens we want to add to the vocabulary. Each token can be either a\n    ///         string or an instance of :class:`~tokenizers.AddedToken` for more customization.\n    ///\n    /// Returns:\n    ///     :obj:`int`: The number of tokens that were created in the vocabulary\n    #[pyo3(text_signature = \"(self, tokens)\")]\n    fn add_tokens(&mut self, tokens: &Bound<'_, PyList>) -> PyResult<usize> {\n        let tokens = tokens\n            .into_iter()\n            .map(|token| {\n                if let Ok(content) = token.extract::<String>() {\n                    Ok(PyAddedToken::from(content, Some(false)).get_token())\n                } else if let Ok(token) = token.extract::<PyRefMut<PyAddedToken>>() {\n                    Ok(token.get_token())\n                } else {\n                    Err(exceptions::PyTypeError::new_err(\n                        \"Input must be a List[Union[str, AddedToken]]\",\n                    ))\n                }\n            })\n            .collect::<PyResult<Vec<_>>>()?;\n\n        Ok(self.tokenizer.add_tokens(&tokens))\n    }\n\n    /// Add the given special tokens to the Tokenizer.\n    ///\n    /// If these tokens are already part of the vocabulary, it just let the Tokenizer know about\n    /// them. If they don't exist, the Tokenizer creates them, giving them a new id.\n    ///\n    /// These special tokens will never be processed by the model (ie won't be split into\n    /// multiple tokens), and they can be removed from the output when decoding.\n    ///\n    /// Args:\n    ///     tokens (A :obj:`List` of :class:`~tokenizers.AddedToken` or :obj:`str`):\n    ///         The list of special tokens we want to add to the vocabulary. Each token can either\n    ///         be a string or an instance of :class:`~tokenizers.AddedToken` for more\n    ///         customization.\n    ///\n    /// Returns:\n    ///     :obj:`int`: The number of tokens that were created in the vocabulary\n    #[pyo3(text_signature = \"(self, tokens)\")]\n    fn add_special_tokens(&mut self, tokens: &Bound<'_, PyList>) -> PyResult<usize> {\n        let tokens = tokens\n            .into_iter()\n            .map(|token| {\n                if let Ok(content) = token.extract::<String>() {\n                    Ok(tk::tokenizer::AddedToken::from(content, true))\n                } else if let Ok(mut token) = token.extract::<PyRefMut<PyAddedToken>>() {\n                    token.special = true;\n                    Ok(token.get_token())\n                } else {\n                    Err(exceptions::PyTypeError::new_err(\n                        \"Input must be a List[Union[str, AddedToken]]\",\n                    ))\n                }\n            })\n            .collect::<PyResult<Vec<_>>>()?;\n\n        Ok(self.tokenizer.add_special_tokens(&tokens))\n    }\n\n    /// Train the Tokenizer using the given files.\n    ///\n    /// Reads the files line by line, while keeping all the whitespace, even new lines.\n    /// If you want to train from data store in-memory, you can check\n    /// :meth:`~tokenizers.Tokenizer.train_from_iterator`\n    ///\n    /// Args:\n    ///     files (:obj:`List[str]`):\n    ///         A list of path to the files that we should use for training\n    ///\n    ///     trainer (:obj:`~tokenizers.trainers.Trainer`, `optional`):\n    ///         An optional trainer that should be used to train our Model\n    #[pyo3(signature = (files, trainer = None))]\n    #[pyo3(text_signature = \"(self, files, trainer = None)\")]\n    fn train(&mut self, files: Vec<String>, trainer: Option<&mut PyTrainer>) -> PyResult<()> {\n        let mut trainer =\n            trainer.map_or_else(|| self.tokenizer.get_model().get_trainer(), |t| t.clone());\n        Python::attach(|py| {\n            py.detach(|| {\n                ToPyResult(\n                    self.tokenizer\n                        .train_from_files(&mut trainer, files)\n                        .map(|_| {}),\n                )\n                .into()\n            })\n        })\n    }\n\n    /// Train the Tokenizer using the provided iterator.\n    ///\n    /// You can provide anything that is a Python Iterator\n    ///\n    ///     * A list of sequences :obj:`List[str]`\n    ///     * A generator that yields :obj:`str` or :obj:`List[str]`\n    ///     * A Numpy array of strings\n    ///     * ...\n    ///\n    /// Args:\n    ///     iterator (:obj:`Iterator`):\n    ///         Any iterator over strings or list of strings\n    ///\n    ///     trainer (:obj:`~tokenizers.trainers.Trainer`, `optional`):\n    ///         An optional trainer that should be used to train our Model\n    ///\n    ///     length (:obj:`int`, `optional`):\n    ///         The total number of sequences in the iterator. This is used to\n    ///         provide meaningful progress tracking\n    #[pyo3(signature = (iterator, trainer = None, length = None))]\n    #[pyo3(text_signature = \"(self, iterator, trainer=None, length=None)\")]\n    fn train_from_iterator(\n        &mut self,\n        py: Python,\n        iterator: &Bound<'_, PyAny>,\n        trainer: Option<&mut PyTrainer>,\n        length: Option<usize>,\n    ) -> PyResult<()> {\n        let mut trainer =\n            trainer.map_or_else(|| self.tokenizer.get_model().get_trainer(), |t| t.clone());\n\n        let buffered_iter = PyBufferedIterator::new(\n            iterator,\n            |element| {\n                // Each element of the iterator can either be:\n                //  - An iterator, to allow batching\n                //  - A string\n                if let Ok(s) = element.cast::<PyString>() {\n                    itertools::Either::Right(std::iter::once(s.to_cow().map(|s| s.into_owned())))\n                } else {\n                    match element.try_iter() {\n                        Ok(iter) => itertools::Either::Left(\n                            iter.map(|i| i?.extract::<String>())\n                                .collect::<Vec<_>>()\n                                .into_iter(),\n                        ),\n                        Err(e) => itertools::Either::Right(std::iter::once(Err(e))),\n                    }\n                }\n            },\n            256,\n        )?;\n\n        py.detach(|| {\n            ResultShunt::process(buffered_iter, |iter| {\n                self.tokenizer\n                    .train(&mut trainer, MaybeSizedIterator::new(iter, length))\n                    .map(|_| {})\n                    .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n            })?\n        })\n    }\n\n    /// Apply all the post-processing steps to the given encodings.\n    ///\n    /// The various steps are:\n    ///\n    ///     1. Truncate according to the set truncation params (provided with\n    ///        :meth:`~tokenizers.Tokenizer.enable_truncation`)\n    ///     2. Apply the :class:`~tokenizers.processors.PostProcessor`\n    ///     3. Pad according to the set padding params (provided with\n    ///        :meth:`~tokenizers.Tokenizer.enable_padding`)\n    ///\n    /// Args:\n    ///     encoding (:class:`~tokenizers.Encoding`):\n    ///         The :class:`~tokenizers.Encoding` corresponding to the main sequence.\n    ///\n    ///     pair (:class:`~tokenizers.Encoding`, `optional`):\n    ///         An optional :class:`~tokenizers.Encoding` corresponding to the pair sequence.\n    ///\n    ///     add_special_tokens (:obj:`bool`):\n    ///         Whether to add the special tokens\n    ///\n    /// Returns:\n    ///     :class:`~tokenizers.Encoding`: The final post-processed encoding\n    #[pyo3(signature = (encoding, pair = None, add_special_tokens = true))]\n    #[pyo3(text_signature = \"(self, encoding, pair=None, add_special_tokens=True)\")]\n    fn post_process(\n        &self,\n        encoding: &PyEncoding,\n        pair: Option<&PyEncoding>,\n        add_special_tokens: bool,\n    ) -> PyResult<PyEncoding> {\n        ToPyResult(\n            self.tokenizer\n                .post_process(\n                    encoding.encoding.clone(),\n                    pair.map(|p| p.encoding.clone()),\n                    add_special_tokens,\n                )\n                .map(|e| e.into()),\n        )\n        .into()\n    }\n\n    /// The :class:`~tokenizers.models.Model` in use by the Tokenizer\n    #[getter]\n    fn get_model(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        self.tokenizer.get_model().get_as_subtype(py)\n    }\n\n    /// Set the :class:`~tokenizers.models.Model`\n    #[setter]\n    fn set_model(&mut self, model: PyRef<PyModel>) {\n        self.tokenizer.with_model(model.clone());\n    }\n\n    /// The `optional` :class:`~tokenizers.normalizers.Normalizer` in use by the Tokenizer\n    #[getter]\n    fn get_normalizer(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        if let Some(n) = self.tokenizer.get_normalizer() {\n            n.get_as_subtype(py)\n        } else {\n            Ok(py.None())\n        }\n    }\n\n    /// Set the :class:`~tokenizers.normalizers.Normalizer`\n    #[setter]\n    fn set_normalizer(&mut self, normalizer: Option<PyRef<PyNormalizer>>) {\n        let normalizer_option = normalizer.map(|norm| norm.clone());\n        self.tokenizer.with_normalizer(normalizer_option);\n    }\n\n    /// The `optional` :class:`~tokenizers.pre_tokenizers.PreTokenizer` in use by the Tokenizer\n    #[getter]\n    fn get_pre_tokenizer(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        if let Some(pt) = self.tokenizer.get_pre_tokenizer() {\n            pt.get_as_subtype(py)\n        } else {\n            Ok(py.None())\n        }\n    }\n\n    /// Set the :class:`~tokenizers.normalizers.Normalizer`\n    #[setter]\n    fn set_pre_tokenizer(&mut self, pretok: Option<PyRef<PyPreTokenizer>>) {\n        self.tokenizer\n            .with_pre_tokenizer(pretok.map(|pre| pre.clone()));\n    }\n\n    /// The `optional` :class:`~tokenizers.processors.PostProcessor` in use by the Tokenizer\n    #[getter]\n    fn get_post_processor(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        if let Some(n) = self.tokenizer.get_post_processor() {\n            n.get_as_subtype(py)\n        } else {\n            Ok(py.None())\n        }\n    }\n\n    /// Set the :class:`~tokenizers.processors.PostProcessor`\n    #[setter]\n    fn set_post_processor(&mut self, processor: Option<PyRef<PyPostProcessor>>) {\n        self.tokenizer\n            .with_post_processor(processor.map(|p| p.clone()));\n    }\n\n    /// The `optional` :class:`~tokenizers.decoders.Decoder` in use by the Tokenizer\n    #[getter]\n    fn get_decoder(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        if let Some(dec) = self.tokenizer.get_decoder() {\n            dec.get_as_subtype(py)\n        } else {\n            Ok(py.None())\n        }\n    }\n\n    /// Set the :class:`~tokenizers.decoders.Decoder`\n    #[setter]\n    fn set_decoder(&mut self, decoder: Option<PyRef<PyDecoder>>) {\n        self.tokenizer.with_decoder(decoder.map(|d| d.clone()));\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::models::PyModel;\n    use crate::normalizers::{PyNormalizer, PyNormalizerTypeWrapper};\n    use std::sync::{Arc, RwLock};\n    use tempfile::NamedTempFile;\n    use tk::normalizers::{Lowercase, NFKC};\n\n    #[test]\n    fn serialize() {\n        let mut tokenizer = Tokenizer::new(PyModel::from(BPE::default()));\n        tokenizer.with_normalizer(Some(PyNormalizer::new(PyNormalizerTypeWrapper::Sequence(\n            vec![\n                Arc::new(RwLock::new(NFKC.into())),\n                Arc::new(RwLock::new(Lowercase.into())),\n            ],\n        ))));\n\n        let tmp = NamedTempFile::new().unwrap().into_temp_path();\n        tokenizer.save(&tmp, false).unwrap();\n\n        Tokenizer::from_file(&tmp).unwrap();\n    }\n\n    #[test]\n    fn serde_pyo3() {\n        let mut tokenizer = Tokenizer::new(PyModel::from(BPE::default()));\n        tokenizer.with_normalizer(Some(PyNormalizer::new(PyNormalizerTypeWrapper::Sequence(\n            vec![\n                Arc::new(RwLock::new(NFKC.into())),\n                Arc::new(RwLock::new(Lowercase.into())),\n            ],\n        ))));\n\n        let output = crate::utils::serde_pyo3::to_string(&tokenizer).unwrap();\n        assert_eq!(output, \"Tokenizer(version=\\\"1.0\\\", truncation=None, padding=None, added_tokens=[], normalizer=Sequence(normalizers=[NFKC(), Lowercase()]), pre_tokenizer=None, post_processor=None, decoder=None, model=BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[]))\");\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/trainers.rs",
    "content": "use std::sync::{Arc, RwLock};\n\nuse crate::models::PyModel;\nuse crate::tokenizer::PyAddedToken;\nuse pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse serde::{Deserialize, Serialize};\nuse tk::models::TrainerWrapper;\nuse tk::Trainer;\nuse tokenizers as tk;\n\n/// Base class for all trainers\n///\n/// This class is not supposed to be instantiated directly. Instead, any implementation of a\n/// Trainer will return an instance of this class when instantiated.\n#[pyclass(\n    module = \"tokenizers.trainers\",\n    name = \"Trainer\",\n    subclass,\n    from_py_object\n)]\n#[derive(Clone, Deserialize, Serialize)]\n#[serde(transparent)]\npub struct PyTrainer {\n    pub trainer: Arc<RwLock<TrainerWrapper>>,\n}\n\nimpl PyTrainer {\n    #[cfg(test)]\n    pub(crate) fn new(trainer: Arc<RwLock<TrainerWrapper>>) -> Self {\n        PyTrainer { trainer }\n    }\n    pub(crate) fn get_as_subtype(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {\n        let base = self.clone();\n        Ok(match *self.trainer.as_ref().read().unwrap() {\n            TrainerWrapper::BpeTrainer(_) => Py::new(py, (PyBpeTrainer {}, base))?.into_any(),\n            TrainerWrapper::WordPieceTrainer(_) => {\n                Py::new(py, (PyWordPieceTrainer {}, base))?.into_any()\n            }\n            TrainerWrapper::WordLevelTrainer(_) => {\n                Py::new(py, (PyWordLevelTrainer {}, base))?.into_any()\n            }\n            TrainerWrapper::UnigramTrainer(_) => {\n                Py::new(py, (PyUnigramTrainer {}, base))?.into_any()\n            }\n        })\n    }\n}\n#[pymethods]\nimpl PyTrainer {\n    fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let data = serde_json::to_string(&self.trainer).map_err(|e| {\n            exceptions::PyException::new_err(format!(\n                \"Error while attempting to pickle PyTrainer: {e}\"\n            ))\n        })?;\n        Ok(PyBytes::new(py, data.as_bytes()).into())\n    }\n\n    fn __setstate__(&mut self, py: Python, state: Py<PyAny>) -> PyResult<()> {\n        match state.extract::<&[u8]>(py) {\n            Ok(s) => {\n                let unpickled = serde_json::from_slice(s).map_err(|e| {\n                    exceptions::PyException::new_err(format!(\n                        \"Error while attempting to unpickle PyTrainer: {e}\"\n                    ))\n                })?;\n                self.trainer = unpickled;\n                Ok(())\n            }\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    fn __repr__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::repr(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n\n    fn __str__(&self) -> PyResult<String> {\n        crate::utils::serde_pyo3::to_string(self)\n            .map_err(|e| exceptions::PyException::new_err(e.to_string()))\n    }\n}\n\nimpl Trainer for PyTrainer {\n    type Model = PyModel;\n\n    fn should_show_progress(&self) -> bool {\n        self.trainer.read().unwrap().should_show_progress()\n    }\n\n    fn train(&self, model: &mut PyModel) -> tk::Result<Vec<tk::AddedToken>> {\n        self.trainer\n            .read()\n            .unwrap()\n            .train(&mut model.model.write().unwrap())\n    }\n\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> tk::Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> tk::Result<Vec<String>> + Sync,\n    {\n        self.trainer.write().unwrap().feed(iterator, process)\n    }\n}\n\nimpl<I> From<I> for PyTrainer\nwhere\n    I: Into<TrainerWrapper>,\n{\n    fn from(trainer: I) -> Self {\n        PyTrainer {\n            trainer: Arc::new(RwLock::new(trainer.into())),\n        }\n    }\n}\n\nmacro_rules! getter {\n    ($self: ident, $variant: ident, $($name: tt)+) => {{\n        let super_ = $self.as_ref();\n        if let TrainerWrapper::$variant(ref trainer) = *super_.trainer.read().unwrap() {\n            trainer.$($name)+\n        } else {\n            unreachable!()\n        }\n    }};\n}\n\nmacro_rules! setter {\n    ($self: ident, $variant: ident, $name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let TrainerWrapper::$variant(ref mut trainer) = *super_.trainer.write().unwrap() {\n            trainer.$name = $value;\n        }\n    }};\n    ($self: ident, $variant: ident, @$name: ident, $value: expr) => {{\n        let super_ = $self.as_ref();\n        if let TrainerWrapper::$variant(ref mut trainer) = *super_.trainer.write().unwrap() {\n            trainer.$name($value);\n        }\n    }};\n}\n\n/// Trainer capable of training a BPE model\n///\n/// Args:\n///     vocab_size (:obj:`int`, `optional`):\n///         The size of the final vocabulary, including all tokens and alphabet.\n///\n///     min_frequency (:obj:`int`, `optional`):\n///         The minimum frequency a pair should have in order to be merged.\n///\n///     show_progress (:obj:`bool`, `optional`):\n///         Whether to show progress bars while training.\n///\n///     special_tokens (:obj:`List[Union[str, AddedToken]]`, `optional`):\n///         A list of special tokens the model should know of.\n///\n///     limit_alphabet (:obj:`int`, `optional`):\n///         The maximum different characters to keep in the alphabet.\n///\n///     initial_alphabet (:obj:`List[str]`, `optional`):\n///         A list of characters to include in the initial alphabet, even\n///         if not seen in the training dataset.\n///         If the strings contain more than one character, only the first one\n///         is kept.\n///\n///     continuing_subword_prefix (:obj:`str`, `optional`):\n///         A prefix to be used for every subword that is not a beginning-of-word.\n///\n///     end_of_word_suffix (:obj:`str`, `optional`):\n///         A suffix to be used for every subword that is a end-of-word.\n///\n///     max_token_length (:obj:`int`, `optional`):\n///         Prevents creating tokens longer than the specified size.\n///         This can help with reducing polluting your vocabulary with\n///         highly repetitive tokens like `======` for wikipedia\n///\n#[pyclass(extends=PyTrainer, module = \"tokenizers.trainers\", name = \"BpeTrainer\")]\npub struct PyBpeTrainer {}\n#[pymethods]\nimpl PyBpeTrainer {\n    #[getter]\n    fn get_vocab_size(self_: PyRef<Self>) -> usize {\n        getter!(self_, BpeTrainer, vocab_size)\n    }\n\n    #[setter]\n    fn set_vocab_size(self_: PyRef<Self>, vocab_size: usize) {\n        setter!(self_, BpeTrainer, vocab_size, vocab_size);\n    }\n\n    #[getter]\n    fn get_min_frequency(self_: PyRef<Self>) -> u64 {\n        getter!(self_, BpeTrainer, min_frequency)\n    }\n\n    #[setter]\n    fn set_min_frequency(self_: PyRef<Self>, freq: u64) {\n        setter!(self_, BpeTrainer, min_frequency, freq);\n    }\n\n    #[getter]\n    fn get_show_progress(self_: PyRef<Self>) -> bool {\n        getter!(self_, BpeTrainer, show_progress)\n    }\n\n    #[setter]\n    fn set_show_progress(self_: PyRef<Self>, show_progress: bool) {\n        setter!(self_, BpeTrainer, show_progress, show_progress);\n    }\n\n    #[getter]\n    fn get_special_tokens(self_: PyRef<Self>) -> Vec<PyAddedToken> {\n        getter!(\n            self_,\n            BpeTrainer,\n            special_tokens\n                .iter()\n                .map(|tok| tok.clone().into())\n                .collect()\n        )\n    }\n\n    #[setter]\n    fn set_special_tokens(self_: PyRef<Self>, special_tokens: &Bound<'_, PyList>) -> PyResult<()> {\n        setter!(\n            self_,\n            BpeTrainer,\n            special_tokens,\n            special_tokens\n                .into_iter()\n                .map(|token| {\n                    if let Ok(content) = token.extract::<String>() {\n                        Ok(tk::tokenizer::AddedToken::from(content, true))\n                    } else if let Ok(mut token) = token.extract::<PyRefMut<PyAddedToken>>() {\n                        token.special = true;\n                        Ok(token.get_token())\n                    } else {\n                        Err(exceptions::PyTypeError::new_err(\n                            \"Special tokens must be a List[Union[str, AddedToken]]\",\n                        ))\n                    }\n                })\n                .collect::<PyResult<Vec<_>>>()?\n        );\n        Ok(())\n    }\n\n    #[getter]\n    fn get_limit_alphabet(self_: PyRef<Self>) -> Option<usize> {\n        getter!(self_, BpeTrainer, limit_alphabet)\n    }\n\n    #[setter]\n    fn set_limit_alphabet(self_: PyRef<Self>, limit: Option<usize>) {\n        setter!(self_, BpeTrainer, limit_alphabet, limit);\n    }\n\n    #[getter]\n    fn get_max_token_length(self_: PyRef<Self>) -> Option<usize> {\n        getter!(self_, BpeTrainer, max_token_length)\n    }\n\n    #[setter]\n    fn set_max_token_length(self_: PyRef<Self>, limit: Option<usize>) {\n        setter!(self_, BpeTrainer, max_token_length, limit);\n    }\n\n    #[getter]\n    fn get_initial_alphabet(self_: PyRef<Self>) -> Vec<String> {\n        getter!(\n            self_,\n            BpeTrainer,\n            initial_alphabet.iter().map(|c| c.to_string()).collect()\n        )\n    }\n\n    #[setter]\n    fn set_initial_alphabet(self_: PyRef<Self>, alphabet: Vec<char>) {\n        setter!(\n            self_,\n            BpeTrainer,\n            initial_alphabet,\n            alphabet.into_iter().collect()\n        );\n    }\n\n    #[getter]\n    fn get_continuing_subword_prefix(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, BpeTrainer, continuing_subword_prefix.clone())\n    }\n\n    #[setter]\n    fn set_continuing_subword_prefix(self_: PyRef<Self>, prefix: Option<String>) {\n        setter!(self_, BpeTrainer, continuing_subword_prefix, prefix);\n    }\n\n    #[getter]\n    fn get_end_of_word_suffix(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, BpeTrainer, end_of_word_suffix.clone())\n    }\n\n    #[setter]\n    fn set_end_of_word_suffix(self_: PyRef<Self>, suffix: Option<String>) {\n        setter!(self_, BpeTrainer, end_of_word_suffix, suffix);\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (**kwargs),\n        text_signature = \"(self, vocab_size=30000, min_frequency=0, show_progress=True, special_tokens=[], limit_alphabet=None, initial_alphabet=[], continuing_subword_prefix=None, end_of_word_suffix=None, max_token_length=None, words={})\"\n    )]\n    pub fn new(kwargs: Option<&Bound<'_, PyDict>>) -> PyResult<(Self, PyTrainer)> {\n        let mut builder = tk::models::bpe::BpeTrainer::builder();\n        if let Some(kwargs) = kwargs {\n            for (key, val) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"vocab_size\" => builder = builder.vocab_size(val.extract()?),\n                    \"min_frequency\" => builder = builder.min_frequency(val.extract()?),\n                    \"show_progress\" => builder = builder.show_progress(val.extract()?),\n                    \"special_tokens\" => {\n                        builder = builder.special_tokens(\n                            val.cast::<PyList>()?\n                                .into_iter()\n                                .map(|token| {\n                                    if let Ok(content) = token.extract::<String>() {\n                                        Ok(PyAddedToken::from(content, Some(true)).get_token())\n                                    } else if let Ok(mut token) =\n                                        token.extract::<PyRefMut<PyAddedToken>>()\n                                    {\n                                        token.special = true;\n                                        Ok(token.get_token())\n                                    } else {\n                                        Err(exceptions::PyTypeError::new_err(\n                                            \"special_tokens must be a List[Union[str, AddedToken]]\",\n                                        ))\n                                    }\n                                })\n                                .collect::<PyResult<Vec<_>>>()?,\n                        );\n                    }\n                    \"limit_alphabet\" => builder = builder.limit_alphabet(val.extract()?),\n                    \"max_token_length\" => builder = builder.max_token_length(val.extract()?),\n                    \"initial_alphabet\" => {\n                        let alphabet: Vec<String> = val.extract()?;\n                        builder = builder.initial_alphabet(\n                            alphabet\n                                .into_iter()\n                                .filter_map(|s| s.chars().next())\n                                .collect(),\n                        );\n                    }\n                    \"continuing_subword_prefix\" => {\n                        builder = builder.continuing_subword_prefix(val.extract()?)\n                    }\n                    \"end_of_word_suffix\" => builder = builder.end_of_word_suffix(val.extract()?),\n                    _ => println!(\"Ignored unknown kwargs option {key}\"),\n                };\n            }\n        }\n        Ok((PyBpeTrainer {}, builder.build().into()))\n    }\n}\n\n/// Trainer capable of training a WordPiece model\n///\n/// Args:\n///     vocab_size (:obj:`int`, `optional`):\n///         The size of the final vocabulary, including all tokens and alphabet.\n///\n///     min_frequency (:obj:`int`, `optional`):\n///         The minimum frequency a pair should have in order to be merged.\n///\n///     show_progress (:obj:`bool`, `optional`):\n///         Whether to show progress bars while training.\n///\n///     special_tokens (:obj:`List[Union[str, AddedToken]]`, `optional`):\n///         A list of special tokens the model should know of.\n///\n///     limit_alphabet (:obj:`int`, `optional`):\n///         The maximum different characters to keep in the alphabet.\n///\n///     initial_alphabet (:obj:`List[str]`, `optional`):\n///         A list of characters to include in the initial alphabet, even\n///         if not seen in the training dataset.\n///         If the strings contain more than one character, only the first one\n///         is kept.\n///\n///     continuing_subword_prefix (:obj:`str`, `optional`):\n///         A prefix to be used for every subword that is not a beginning-of-word.\n///\n///     end_of_word_suffix (:obj:`str`, `optional`):\n///         A suffix to be used for every subword that is a end-of-word.\n#[pyclass(extends=PyTrainer, module = \"tokenizers.trainers\", name = \"WordPieceTrainer\")]\npub struct PyWordPieceTrainer {}\n#[pymethods]\nimpl PyWordPieceTrainer {\n    #[getter]\n    fn get_vocab_size(self_: PyRef<Self>) -> usize {\n        getter!(self_, WordPieceTrainer, vocab_size())\n    }\n\n    #[setter]\n    fn set_vocab_size(self_: PyRef<Self>, vocab_size: usize) {\n        setter!(self_, WordPieceTrainer, @set_vocab_size, vocab_size);\n    }\n\n    #[getter]\n    fn get_min_frequency(self_: PyRef<Self>) -> u64 {\n        getter!(self_, WordPieceTrainer, min_frequency())\n    }\n\n    #[setter]\n    fn set_min_frequency(self_: PyRef<Self>, freq: u64) {\n        setter!(self_, WordPieceTrainer, @set_min_frequency, freq);\n    }\n\n    #[getter]\n    fn get_show_progress(self_: PyRef<Self>) -> bool {\n        getter!(self_, WordPieceTrainer, show_progress())\n    }\n\n    #[setter]\n    fn set_show_progress(self_: PyRef<Self>, show_progress: bool) {\n        setter!(self_, WordPieceTrainer, @set_show_progress, show_progress);\n    }\n\n    #[getter]\n    fn get_special_tokens(self_: PyRef<Self>) -> Vec<PyAddedToken> {\n        getter!(\n            self_,\n            WordPieceTrainer,\n            special_tokens()\n                .iter()\n                .map(|tok| tok.clone().into())\n                .collect()\n        )\n    }\n\n    #[setter]\n    fn set_special_tokens(self_: PyRef<Self>, special_tokens: &Bound<'_, PyList>) -> PyResult<()> {\n        setter!(\n            self_,\n            WordPieceTrainer,\n            @set_special_tokens,\n            special_tokens\n                .into_iter()\n                .map(|token| {\n                    if let Ok(content) = token.extract::<String>() {\n                        Ok(tk::tokenizer::AddedToken::from(content, true))\n                    } else if let Ok(mut token) = token.extract::<PyRefMut<PyAddedToken>>() {\n                        token.special = true;\n                        Ok(token.get_token())\n                    } else {\n                        Err(exceptions::PyTypeError::new_err(\n                            \"Special tokens must be a List[Union[str, AddedToken]]\",\n                        ))\n                    }\n                })\n                .collect::<PyResult<Vec<_>>>()?\n        );\n        Ok(())\n    }\n\n    #[getter]\n    fn get_limit_alphabet(self_: PyRef<Self>) -> Option<usize> {\n        getter!(self_, WordPieceTrainer, limit_alphabet())\n    }\n\n    #[setter]\n    fn set_limit_alphabet(self_: PyRef<Self>, limit: Option<usize>) {\n        setter!(self_, WordPieceTrainer, @set_limit_alphabet, limit);\n    }\n\n    #[getter]\n    fn get_initial_alphabet(self_: PyRef<Self>) -> Vec<String> {\n        getter!(\n            self_,\n            WordPieceTrainer,\n            initial_alphabet().iter().map(|c| c.to_string()).collect()\n        )\n    }\n\n    #[setter]\n    fn set_initial_alphabet(self_: PyRef<Self>, alphabet: Vec<char>) {\n        setter!(\n            self_,\n            WordPieceTrainer,\n            @set_initial_alphabet,\n            alphabet.into_iter().collect()\n        );\n    }\n\n    #[getter]\n    fn get_continuing_subword_prefix(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, WordPieceTrainer, continuing_subword_prefix().clone())\n    }\n\n    #[setter]\n    fn set_continuing_subword_prefix(self_: PyRef<Self>, prefix: Option<String>) {\n        setter!(self_, WordPieceTrainer, @set_continuing_subword_prefix, prefix);\n    }\n\n    #[getter]\n    fn get_end_of_word_suffix(self_: PyRef<Self>) -> Option<String> {\n        getter!(self_, WordPieceTrainer, end_of_word_suffix().clone())\n    }\n\n    #[setter]\n    fn set_end_of_word_suffix(self_: PyRef<Self>, suffix: Option<String>) {\n        setter!(self_, WordPieceTrainer, @set_end_of_word_suffix, suffix);\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (** kwargs),\n        text_signature = \"(self, vocab_size=30000, min_frequency=0, show_progress=True, special_tokens=[], limit_alphabet=None, initial_alphabet=[], continuing_subword_prefix=\\\"##\\\", end_of_word_suffix=None)\"\n    )]\n    pub fn new(kwargs: Option<&Bound<'_, PyDict>>) -> PyResult<(Self, PyTrainer)> {\n        let mut builder = tk::models::wordpiece::WordPieceTrainer::builder();\n        if let Some(kwargs) = kwargs {\n            for (key, val) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"vocab_size\" => builder = builder.vocab_size(val.extract()?),\n                    \"min_frequency\" => builder = builder.min_frequency(val.extract()?),\n                    \"show_progress\" => builder = builder.show_progress(val.extract()?),\n                    \"special_tokens\" => {\n                        builder = builder.special_tokens(\n                            val.cast::<PyList>()?\n                                .into_iter()\n                                .map(|token| {\n                                    if let Ok(content) = token.extract::<String>() {\n                                        Ok(PyAddedToken::from(content, Some(true)).get_token())\n                                    } else if let Ok(mut token) =\n                                        token.extract::<PyRefMut<PyAddedToken>>()\n                                    {\n                                        token.special = true;\n                                        Ok(token.get_token())\n                                    } else {\n                                        Err(exceptions::PyTypeError::new_err(\n                                            \"special_tokens must be a List[Union[str, AddedToken]]\",\n                                        ))\n                                    }\n                                })\n                                .collect::<PyResult<Vec<_>>>()?,\n                        );\n                    }\n                    \"limit_alphabet\" => builder = builder.limit_alphabet(val.extract()?),\n                    \"initial_alphabet\" => {\n                        let alphabet: Vec<String> = val.extract()?;\n                        builder = builder.initial_alphabet(\n                            alphabet\n                                .into_iter()\n                                .filter_map(|s| s.chars().next())\n                                .collect(),\n                        );\n                    }\n                    \"continuing_subword_prefix\" => {\n                        builder = builder.continuing_subword_prefix(val.extract()?)\n                    }\n                    \"end_of_word_suffix\" => builder = builder.end_of_word_suffix(val.extract()?),\n                    _ => println!(\"Ignored unknown kwargs option {key}\"),\n                };\n            }\n        }\n\n        Ok((PyWordPieceTrainer {}, builder.build().into()))\n    }\n}\n\n/// Trainer capable of training a WorldLevel model\n///\n/// Args:\n///     vocab_size (:obj:`int`, `optional`):\n///         The size of the final vocabulary, including all tokens and alphabet.\n///\n///     min_frequency (:obj:`int`, `optional`):\n///         The minimum frequency a pair should have in order to be merged.\n///\n///     show_progress (:obj:`bool`, `optional`):\n///         Whether to show progress bars while training.\n///\n///     special_tokens (:obj:`List[Union[str, AddedToken]]`):\n///         A list of special tokens the model should know of.\n#[pyclass(extends=PyTrainer, module = \"tokenizers.trainers\", name = \"WordLevelTrainer\")]\npub struct PyWordLevelTrainer {}\n#[pymethods]\nimpl PyWordLevelTrainer {\n    #[getter]\n    fn get_vocab_size(self_: PyRef<Self>) -> usize {\n        getter!(self_, WordLevelTrainer, vocab_size)\n    }\n\n    #[setter]\n    fn set_vocab_size(self_: PyRef<Self>, vocab_size: usize) {\n        setter!(self_, WordLevelTrainer, vocab_size, vocab_size);\n    }\n\n    #[getter]\n    fn get_min_frequency(self_: PyRef<Self>) -> u64 {\n        getter!(self_, WordLevelTrainer, min_frequency)\n    }\n\n    #[setter]\n    fn set_min_frequency(self_: PyRef<Self>, freq: u64) {\n        setter!(self_, WordLevelTrainer, min_frequency, freq);\n    }\n\n    #[getter]\n    fn get_show_progress(self_: PyRef<Self>) -> bool {\n        getter!(self_, WordLevelTrainer, show_progress)\n    }\n\n    #[setter]\n    fn set_show_progress(self_: PyRef<Self>, show_progress: bool) {\n        setter!(self_, WordLevelTrainer, show_progress, show_progress);\n    }\n\n    #[getter]\n    fn get_special_tokens(self_: PyRef<Self>) -> Vec<PyAddedToken> {\n        getter!(\n            self_,\n            WordLevelTrainer,\n            special_tokens\n                .iter()\n                .map(|tok| tok.clone().into())\n                .collect()\n        )\n    }\n\n    #[setter]\n    fn set_special_tokens(self_: PyRef<Self>, special_tokens: &Bound<'_, PyList>) -> PyResult<()> {\n        setter!(\n            self_,\n            WordLevelTrainer,\n            special_tokens,\n            special_tokens\n                .into_iter()\n                .map(|token| {\n                    if let Ok(content) = token.extract::<String>() {\n                        Ok(tk::tokenizer::AddedToken::from(content, true))\n                    } else if let Ok(mut token) = token.extract::<PyRefMut<PyAddedToken>>() {\n                        token.special = true;\n                        Ok(token.get_token())\n                    } else {\n                        Err(exceptions::PyTypeError::new_err(\n                            \"Special tokens must be a List[Union[str, AddedToken]]\",\n                        ))\n                    }\n                })\n                .collect::<PyResult<Vec<_>>>()?\n        );\n        Ok(())\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (**kwargs),\n        text_signature = \"(self, vocab_size=30000, min_frequency=0, show_progress=True, special_tokens=[])\"\n    )]\n    pub fn new(kwargs: Option<&Bound<'_, PyDict>>) -> PyResult<(Self, PyTrainer)> {\n        let mut builder = tk::models::wordlevel::WordLevelTrainer::builder();\n\n        if let Some(kwargs) = kwargs {\n            for (key, val) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"vocab_size\" => {\n                        builder.vocab_size(val.extract()?);\n                    }\n                    \"min_frequency\" => {\n                        builder.min_frequency(val.extract()?);\n                    }\n                    \"show_progress\" => {\n                        builder.show_progress(val.extract()?);\n                    }\n                    \"special_tokens\" => {\n                        builder.special_tokens(\n                            val.cast::<PyList>()?\n                                .into_iter()\n                                .map(|token| {\n                                    if let Ok(content) = token.extract::<String>() {\n                                        Ok(PyAddedToken::from(content, Some(true)).get_token())\n                                    } else if let Ok(mut token) =\n                                        token.extract::<PyRefMut<PyAddedToken>>()\n                                    {\n                                        token.special = true;\n                                        Ok(token.get_token())\n                                    } else {\n                                        Err(exceptions::PyTypeError::new_err(\n                                            \"special_tokens must be a List[Union[str, AddedToken]]\",\n                                        ))\n                                    }\n                                })\n                                .collect::<PyResult<Vec<_>>>()?,\n                        );\n                    }\n                    _ => println!(\"Ignored unknown kwargs option {key}\"),\n                }\n            }\n        }\n\n        Ok((\n            PyWordLevelTrainer {},\n            builder\n                .build()\n                .expect(\"WordLevelTrainerBuilder cannot fail\")\n                .into(),\n        ))\n    }\n}\n\n/// Trainer capable of training a Unigram model\n///\n/// Args:\n///     vocab_size (:obj:`int`):\n///         The size of the final vocabulary, including all tokens and alphabet.\n///\n///     show_progress (:obj:`bool`):\n///         Whether to show progress bars while training.\n///\n///     special_tokens (:obj:`List[Union[str, AddedToken]]`):\n///         A list of special tokens the model should know of.\n///\n///     initial_alphabet (:obj:`List[str]`):\n///         A list of characters to include in the initial alphabet, even\n///         if not seen in the training dataset.\n///         If the strings contain more than one character, only the first one\n///         is kept.\n///\n///     shrinking_factor (:obj:`float`):\n///         The shrinking factor used at each step of the training to prune the\n///         vocabulary.\n///\n///     unk_token (:obj:`str`):\n///         The token used for out-of-vocabulary tokens.\n///\n///     max_piece_length (:obj:`int`):\n///         The maximum length of a given token.\n///\n///     n_sub_iterations (:obj:`int`):\n///         The number of iterations of the EM algorithm to perform before\n///         pruning the vocabulary.\n#[pyclass(extends=PyTrainer, module = \"tokenizers.trainers\", name = \"UnigramTrainer\")]\npub struct PyUnigramTrainer {}\n#[pymethods]\nimpl PyUnigramTrainer {\n    #[getter]\n    fn get_vocab_size(self_: PyRef<Self>) -> u32 {\n        getter!(self_, UnigramTrainer, vocab_size)\n    }\n\n    #[setter]\n    fn set_vocab_size(self_: PyRef<Self>, vocab_size: u32) {\n        setter!(self_, UnigramTrainer, vocab_size, vocab_size);\n    }\n\n    #[getter]\n    fn get_show_progress(self_: PyRef<Self>) -> bool {\n        getter!(self_, UnigramTrainer, show_progress)\n    }\n\n    #[setter]\n    fn set_show_progress(self_: PyRef<Self>, show_progress: bool) {\n        setter!(self_, UnigramTrainer, show_progress, show_progress);\n    }\n\n    #[getter]\n    fn get_special_tokens(self_: PyRef<Self>) -> Vec<PyAddedToken> {\n        getter!(\n            self_,\n            UnigramTrainer,\n            special_tokens\n                .iter()\n                .map(|tok| tok.clone().into())\n                .collect()\n        )\n    }\n\n    #[setter]\n    fn set_special_tokens(self_: PyRef<Self>, special_tokens: &Bound<'_, PyList>) -> PyResult<()> {\n        setter!(\n            self_,\n            UnigramTrainer,\n            special_tokens,\n            special_tokens\n                .into_iter()\n                .map(|token| {\n                    if let Ok(content) = token.extract::<String>() {\n                        Ok(tk::tokenizer::AddedToken::from(content, true))\n                    } else if let Ok(mut token) = token.extract::<PyRefMut<PyAddedToken>>() {\n                        token.special = true;\n                        Ok(token.get_token())\n                    } else {\n                        Err(exceptions::PyTypeError::new_err(\n                            \"Special tokens must be a List[Union[str, AddedToken]]\",\n                        ))\n                    }\n                })\n                .collect::<PyResult<Vec<_>>>()?\n        );\n        Ok(())\n    }\n\n    #[getter]\n    fn get_initial_alphabet(self_: PyRef<Self>) -> Vec<String> {\n        getter!(\n            self_,\n            UnigramTrainer,\n            initial_alphabet.iter().map(|c| c.to_string()).collect()\n        )\n    }\n\n    #[setter]\n    fn set_initial_alphabet(self_: PyRef<Self>, alphabet: Vec<char>) {\n        setter!(\n            self_,\n            UnigramTrainer,\n            initial_alphabet,\n            alphabet.into_iter().collect()\n        );\n    }\n\n    #[new]\n    #[pyo3(\n        signature = (**kwargs),\n        text_signature = \"(self, vocab_size=8000, show_progress=True, special_tokens=[], initial_alphabet=[], shrinking_factor=0.75, unk_token=None, max_piece_length=16, n_sub_iterations=2)\"\n    )]\n    pub fn new(kwargs: Option<Bound<'_, PyDict>>) -> PyResult<(Self, PyTrainer)> {\n        let mut builder = tk::models::unigram::UnigramTrainer::builder();\n        if let Some(kwargs) = kwargs {\n            for (key, val) in kwargs {\n                let key: String = key.extract()?;\n                match key.as_ref() {\n                    \"vocab_size\" => builder.vocab_size(val.extract()?),\n                    \"show_progress\" => builder.show_progress(val.extract()?),\n                    \"n_sub_iterations\" => builder.n_sub_iterations(val.extract()?),\n                    \"shrinking_factor\" => builder.shrinking_factor(val.extract()?),\n                    \"unk_token\" => builder.unk_token(val.extract()?),\n                    \"max_piece_length\" => builder.max_piece_length(val.extract()?),\n                    \"seed_size\" => builder.seed_size(val.extract()?),\n                    \"initial_alphabet\" => {\n                        let alphabet: Vec<String> = val.extract()?;\n                        builder.initial_alphabet(\n                            alphabet\n                                .into_iter()\n                                .filter_map(|s| s.chars().next())\n                                .collect(),\n                        )\n                    }\n                    \"special_tokens\" => builder.special_tokens(\n                        val.cast::<PyList>()?\n                            .into_iter()\n                            .map(|token| {\n                                if let Ok(content) = token.extract::<String>() {\n                                    Ok(PyAddedToken::from(content, Some(true)).get_token())\n                                } else if let Ok(mut token) =\n                                    token.extract::<PyRefMut<PyAddedToken>>()\n                                {\n                                    token.special = true;\n                                    Ok(token.get_token())\n                                } else {\n                                    Err(exceptions::PyTypeError::new_err(\n                                        \"special_tokens must be a List[Union[str, AddedToken]]\",\n                                    ))\n                                }\n                            })\n                            .collect::<PyResult<Vec<_>>>()?,\n                    ),\n                    _ => {\n                        println!(\"Ignored unknown kwargs option {key}\");\n                        &mut builder\n                    }\n                };\n            }\n        }\n\n        let trainer: tokenizers::models::unigram::UnigramTrainer =\n            builder.build().map_err(|e| {\n                exceptions::PyException::new_err(format!(\"Cannot build UnigramTrainer: {e}\"))\n            })?;\n        Ok((PyUnigramTrainer {}, trainer.into()))\n    }\n}\n\n/// Trainers Module\n#[pymodule]\npub mod trainers {\n    #[pymodule_export]\n    pub use super::PyBpeTrainer;\n    #[pymodule_export]\n    pub use super::PyTrainer;\n    #[pymodule_export]\n    pub use super::PyUnigramTrainer;\n    #[pymodule_export]\n    pub use super::PyWordLevelTrainer;\n    #[pymodule_export]\n    pub use super::PyWordPieceTrainer;\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use tk::models::bpe::trainer::BpeTrainer;\n\n    #[test]\n    fn get_subtype() {\n        Python::attach(|py| {\n            let py_trainer = PyTrainer::new(Arc::new(RwLock::new(BpeTrainer::default().into())));\n            let py_bpe = py_trainer.get_as_subtype(py).unwrap();\n            assert_eq!(\"BpeTrainer\", py_bpe.bind(py).get_type().qualname().unwrap());\n        })\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/utils/iterators.rs",
    "content": "use pyo3::prelude::*;\nuse std::collections::VecDeque;\n\n/// An simple iterator that can be instantiated with a specified length.\n/// We use this with iterators that don't have a size_hint but we might\n/// know its size. This is useful with progress bars for example.\npub struct MaybeSizedIterator<I> {\n    length: Option<usize>,\n    iter: I,\n}\n\nimpl<I> MaybeSizedIterator<I>\nwhere\n    I: Iterator,\n{\n    pub fn new(iter: I, length: Option<usize>) -> Self {\n        Self { length, iter }\n    }\n}\n\nimpl<I> Iterator for MaybeSizedIterator<I>\nwhere\n    I: Iterator,\n{\n    type Item = I::Item;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.iter.next()\n    }\n\n    fn size_hint(&self) -> (usize, Option<usize>) {\n        (self.length.unwrap_or(0), None)\n    }\n}\n\n/// A buffered iterator that takes care of locking the GIL only when needed.\n/// The `PyIterator` provided by PyO3 keeps a Python GIL token all along\n/// and thus doesn't allow us to release the GIL to allow having other threads.\n///\n/// This iterator serves two purposes:\n///   - First, as opposed to the `pyo3::PyIterator`, it is Send and can easily be parallelized\n///   - Second, this let us release the GIL between two refills of the buffer, allowing other\n///     Python threads to work\npub struct PyBufferedIterator<T, F> {\n    iter: Option<Py<PyAny>>,\n    converter: F,\n    buffer: VecDeque<PyResult<T>>,\n    size: usize,\n}\n\nimpl<T, F, I> PyBufferedIterator<T, F>\nwhere\n    F: Fn(Bound<'_, PyAny>) -> I,\n    I: IntoIterator<Item = PyResult<T>>,\n{\n    /// Create a new PyBufferedIterator using the provided Python object.\n    /// This object must implement the Python Iterator Protocol, and an error will\n    /// be return if the contract is not respected.\n    ///\n    /// The `converter` provides a way to convert each item in the iterator into\n    /// something that doesn't embed a 'py token and thus allows the GIL to be released\n    ///\n    /// The `buffer_size` represents the number of items that we buffer before we\n    /// need to acquire the GIL again.\n    pub fn new(iter: &Bound<'_, PyAny>, converter: F, buffer_size: usize) -> PyResult<Self> {\n        let py = iter.py();\n        let iter: Py<PyAny> = unsafe {\n            Bound::from_borrowed_ptr_or_err(py, pyo3::ffi::PyObject_GetIter(iter.as_ptr()))?.into()\n        };\n\n        Ok(Self {\n            iter: Some(iter),\n            converter,\n            buffer: VecDeque::with_capacity(buffer_size),\n            size: buffer_size,\n        })\n    }\n\n    /// Refill the buffer, and set `self.iter` as `None` if nothing more to get\n    fn refill(&mut self) -> PyResult<()> {\n        if self.iter.is_none() {\n            return Ok(());\n        }\n\n        Python::attach(|py| loop {\n            if self.buffer.len() >= self.size {\n                return Ok(());\n            }\n\n            match unsafe {\n                Bound::from_owned_ptr_or_opt(\n                    py,\n                    pyo3::ffi::PyIter_Next(self.iter.as_ref().unwrap().bind(py).as_ptr()),\n                )\n            } {\n                Some(obj) => self.buffer.extend((self.converter)(obj)),\n                None => {\n                    if PyErr::occurred(py) {\n                        return Err(PyErr::fetch(py));\n                    } else {\n                        self.iter = None;\n                    }\n                }\n            };\n\n            if self.iter.is_none() {\n                return Ok(());\n            }\n        })\n    }\n}\n\nimpl<T, F, I> Iterator for PyBufferedIterator<T, F>\nwhere\n    F: Fn(Bound<'_, PyAny>) -> I,\n    I: IntoIterator<Item = PyResult<T>>,\n{\n    type Item = PyResult<T>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if !self.buffer.is_empty() {\n            self.buffer.pop_front()\n        } else if self.iter.is_some() {\n            if let Err(e) = self.refill() {\n                return Some(Err(e));\n            }\n            self.next()\n        } else {\n            None\n        }\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/utils/mod.rs",
    "content": "use std::marker::PhantomData;\nuse std::sync::{Arc, Mutex};\n\nmod iterators;\nmod normalization;\nmod pretokenization;\nmod regex;\npub mod serde_pyo3;\n\npub use iterators::*;\npub use normalization::*;\npub use pretokenization::*;\npub use regex::*;\n\n// RefMut utils\n\npub trait DestroyPtr {\n    fn destroy(&mut self);\n}\n\npub struct RefMutGuard<'r, T: DestroyPtr> {\n    content: T,\n    r: PhantomData<&'r mut T>,\n}\nimpl<T: DestroyPtr> RefMutGuard<'_, T> {\n    pub fn new(content: T) -> Self {\n        Self {\n            content,\n            r: PhantomData,\n        }\n    }\n\n    pub fn get(&self) -> &T {\n        &self.content\n    }\n}\n\nimpl<T: DestroyPtr> Drop for RefMutGuard<'_, T> {\n    fn drop(&mut self) {\n        self.content.destroy()\n    }\n}\n\n#[derive(Clone)]\npub struct RefMutContainer<T> {\n    inner: Arc<Mutex<Option<*mut T>>>,\n}\nimpl<T> RefMutContainer<T> {\n    pub fn new(content: &mut T) -> Self {\n        Self {\n            inner: Arc::new(Mutex::new(Some(content))),\n        }\n    }\n\n    pub fn map<F: FnOnce(&T) -> U, U>(&self, f: F) -> Option<U> {\n        let lock = self.inner.lock().unwrap();\n        let ptr = lock.as_ref()?;\n        Some(f(unsafe { ptr.as_ref().unwrap() }))\n    }\n\n    pub fn map_mut<F: FnOnce(&mut T) -> U, U>(&mut self, f: F) -> Option<U> {\n        let lock = self.inner.lock().unwrap();\n        let ptr = lock.as_ref()?;\n        Some(f(unsafe { ptr.as_mut().unwrap() }))\n    }\n}\n\nimpl<T> DestroyPtr for RefMutContainer<T> {\n    fn destroy(&mut self) {\n        self.inner.lock().unwrap().take();\n    }\n}\n\nunsafe impl<T: Send> Send for RefMutContainer<T> {}\nunsafe impl<T: Sync> Sync for RefMutContainer<T> {}\n"
  },
  {
    "path": "bindings/python/src/utils/normalization.rs",
    "content": "use super::regex::PyRegex;\nuse super::{DestroyPtr, RefMutContainer, RefMutGuard};\nuse crate::error::ToPyResult;\nuse pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\nuse tk::normalizer::{char_to_bytes, NormalizedString, Range, SplitDelimiterBehavior};\nuse tk::pattern::Pattern;\n\n/// Represents a Pattern as used by `NormalizedString`\n#[derive(FromPyObject)]\npub enum PyPattern {\n    #[pyo3(annotation = \"str\")]\n    Str(String),\n    #[pyo3(annotation = \"tokenizers.Regex\")]\n    Regex(Py<PyRegex>),\n    // TODO: Add the compatibility for Fn(char) -> bool\n}\n\nimpl Pattern for PyPattern {\n    fn find_matches(&self, inside: &str) -> tk::Result<Vec<(tk::Offsets, bool)>> {\n        match self {\n            PyPattern::Str(s) => {\n                let mut chars = s.chars();\n                if let (Some(c), None) = (chars.next(), chars.next()) {\n                    c.find_matches(inside)\n                } else {\n                    s.find_matches(inside)\n                }\n            }\n            PyPattern::Regex(r) => Python::attach(|py| (&r.borrow(py).inner).find_matches(inside)),\n        }\n    }\n}\n\nimpl From<PyPattern> for tk::normalizers::replace::ReplacePattern {\n    fn from(pattern: PyPattern) -> Self {\n        match pattern {\n            PyPattern::Str(s) => Self::String(s.to_owned()),\n            PyPattern::Regex(r) => Python::attach(|py| Self::Regex(r.borrow(py).pattern.clone())),\n        }\n    }\n}\n\nimpl From<PyPattern> for tk::pre_tokenizers::split::SplitPattern {\n    fn from(pattern: PyPattern) -> Self {\n        match pattern {\n            PyPattern::Str(s) => Self::String(s.to_owned()),\n            PyPattern::Regex(r) => Python::attach(|py| Self::Regex(r.borrow(py).pattern.clone())),\n        }\n    }\n}\n\n#[derive(Debug, Clone, FromPyObject)]\npub enum PyRange<'s> {\n    #[pyo3(annotation = \"int\")]\n    Single(isize),\n    #[pyo3(annotation = \"Tuple[uint, uint]\")]\n    Range(usize, usize),\n    #[pyo3(annotation = \"slice\")]\n    Slice(Bound<'s, PySlice>),\n}\nimpl PyRange<'_> {\n    pub fn to_range(&self, max_len: usize) -> PyResult<std::ops::Range<usize>> {\n        match self {\n            PyRange::Single(i) => {\n                if i.is_negative() {\n                    let i = -i as usize;\n                    if i > max_len {\n                        Err(exceptions::PyValueError::new_err(format!(\n                            \"{i} is bigger than max len\"\n                        )))\n                    } else {\n                        Ok(max_len - i..max_len - i + 1)\n                    }\n                } else {\n                    let i = *i as usize;\n                    Ok(i..i + 1)\n                }\n            }\n            PyRange::Range(s, e) => Ok(*s..*e),\n            PyRange::Slice(s) => {\n                let r = s.indices(max_len.try_into()?)?;\n                Ok(r.start as usize..r.stop as usize)\n            }\n        }\n    }\n}\n\n#[derive(Clone)]\npub struct PySplitDelimiterBehavior(pub SplitDelimiterBehavior);\n\nimpl<'a, 'py> FromPyObject<'a, 'py> for PySplitDelimiterBehavior {\n    type Error = PyErr;\n\n    fn extract(obj: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        let s = obj.extract::<String>()?;\n\n        Ok(Self(match s.as_ref() {\n            \"removed\" => Ok(SplitDelimiterBehavior::Removed),\n            \"isolated\" => Ok(SplitDelimiterBehavior::Isolated),\n            \"merged_with_previous\" => Ok(SplitDelimiterBehavior::MergedWithPrevious),\n            \"merged_with_next\" => Ok(SplitDelimiterBehavior::MergedWithNext),\n            \"contiguous\" => Ok(SplitDelimiterBehavior::Contiguous),\n            _ => Err(exceptions::PyValueError::new_err(\n                \"Wrong value for SplitDelimiterBehavior, expected one of: \\\n                `removed, isolated, merged_with_previous, merged_with_next, contiguous`\",\n            )),\n        }?))\n    }\n}\n\nimpl From<PySplitDelimiterBehavior> for SplitDelimiterBehavior {\n    fn from(v: PySplitDelimiterBehavior) -> Self {\n        v.0\n    }\n}\n\nimpl From<SplitDelimiterBehavior> for PySplitDelimiterBehavior {\n    fn from(v: SplitDelimiterBehavior) -> Self {\n        Self(v)\n    }\n}\n\nfn filter(normalized: &mut NormalizedString, func: &Bound<'_, PyAny>) -> PyResult<()> {\n    let err = \"`filter` expect a callable with the signature: `fn(char) -> bool`\";\n\n    if !func.is_callable() {\n        Err(exceptions::PyTypeError::new_err(err))\n    } else {\n        normalized.filter(|c| {\n            func.call1((c.to_string(),))\n                .expect(err)\n                .extract()\n                .expect(err)\n        });\n\n        Ok(())\n    }\n}\n\nfn for_each(normalized: &NormalizedString, func: &Bound<'_, PyAny>) -> PyResult<()> {\n    let err = \"`for_each` expect a callable with the signature: `fn(char)`\";\n\n    if !func.is_callable() {\n        Err(exceptions::PyTypeError::new_err(err))\n    } else {\n        normalized.for_each(|c| {\n            func.call1((c.to_string(),)).expect(err);\n        });\n\n        Ok(())\n    }\n}\n\nfn map(normalized: &mut NormalizedString, func: &Bound<'_, PyAny>) -> PyResult<()> {\n    let err = \"`map` expect a callable with the signature: `fn(char) -> char`\";\n\n    if !func.is_callable() {\n        Err(exceptions::PyTypeError::new_err(err))\n    } else {\n        normalized.map(|c| {\n            let c: String = func\n                .call1((c.to_string(),))\n                .expect(err)\n                .extract()\n                .expect(err);\n            c.chars().next().expect(err)\n        });\n\n        Ok(())\n    }\n}\n\nfn slice(\n    normalized: &NormalizedString,\n    range: &PyRange<'_>,\n) -> PyResult<Option<PyNormalizedString>> {\n    let n_char = normalized.len();\n    let char_range = range.to_range(n_char)?;\n    Ok(\n        char_to_bytes(normalized.get(), char_range).and_then(|bytes_range| {\n            normalized\n                .slice(Range::Normalized(bytes_range))\n                .map(|n| n.into())\n        }),\n    )\n}\n\n/// NormalizedString\n///\n/// A NormalizedString takes care of modifying an \"original\" string, to obtain a \"normalized\" one.\n/// While making all the requested modifications, it keeps track of the alignment information\n/// between the two versions of the string.\n///\n/// Args:\n///     sequence: str:\n///         The string sequence used to initialize this NormalizedString\n#[pyclass(module = \"tokenizers\", name = \"NormalizedString\", from_py_object)]\n#[derive(Clone)]\npub struct PyNormalizedString {\n    pub(crate) normalized: NormalizedString,\n}\n\n#[pymethods]\nimpl PyNormalizedString {\n    #[new]\n    #[pyo3(signature = (sequence), text_signature = \"(self, sequence)\")]\n    fn new(sequence: &str) -> Self {\n        NormalizedString::from(sequence).into()\n    }\n\n    /// The normalized part of the string\n    #[getter]\n    fn get_normalized(&self) -> &str {\n        self.normalized.get()\n    }\n\n    #[getter]\n    fn get_original(&self) -> &str {\n        self.normalized.get_original()\n    }\n\n    /// Runs the NFD normalization\n    #[pyo3(text_signature = \"(self)\")]\n    fn nfd(&mut self) {\n        self.normalized.nfd();\n    }\n\n    /// Runs the NFKD normalization\n    #[pyo3(text_signature = \"(self)\")]\n    fn nfkd(&mut self) {\n        self.normalized.nfkd();\n    }\n\n    /// Runs the NFC normalization\n    #[pyo3(text_signature = \"(self)\")]\n    fn nfc(&mut self) {\n        self.normalized.nfc();\n    }\n\n    /// Runs the NFKC normalization\n    #[pyo3(text_signature = \"(self)\")]\n    fn nfkc(&mut self) {\n        self.normalized.nfkc();\n    }\n\n    /// Lowercase the string\n    #[pyo3(text_signature = \"(self)\")]\n    fn lowercase(&mut self) {\n        self.normalized.lowercase();\n    }\n\n    /// Uppercase the string\n    #[pyo3(text_signature = \"(self)\")]\n    fn uppercase(&mut self) {\n        self.normalized.uppercase();\n    }\n\n    /// Prepend the given sequence to the string\n    #[pyo3(text_signature = \"(self, s)\")]\n    fn prepend(&mut self, s: &str) {\n        self.normalized.prepend(s);\n    }\n\n    /// Append the given sequence to the string\n    #[pyo3(text_signature = \"(self, s)\")]\n    fn append(&mut self, s: &str) {\n        self.normalized.append(s);\n    }\n\n    /// Strip the left of the string\n    #[pyo3(text_signature = \"(self)\")]\n    fn lstrip(&mut self) {\n        self.normalized.lstrip();\n    }\n\n    /// Strip the right of the string\n    #[pyo3(text_signature = \"(self)\")]\n    fn rstrip(&mut self) {\n        self.normalized.rstrip();\n    }\n\n    /// Strip both ends of the string\n    #[pyo3(text_signature = \"(self)\")]\n    fn strip(&mut self) {\n        self.normalized.strip();\n    }\n\n    /// Clears the string\n    #[pyo3(text_signature = \"(self)\")]\n    fn clear(&mut self) {\n        self.normalized.clear();\n    }\n\n    /// Slice the string using the given range\n    #[pyo3(text_signature = \"(self, range)\")]\n    fn slice(&self, range: PyRange) -> PyResult<Option<PyNormalizedString>> {\n        slice(&self.normalized, &range)\n    }\n\n    /// Filter each character of the string using the given func\n    #[pyo3(text_signature = \"(self, func)\")]\n    fn filter(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        filter(&mut self.normalized, func)\n    }\n\n    /// Calls the given function for each character of the string\n    #[pyo3(text_signature = \"(self, func)\")]\n    fn for_each(&self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        for_each(&self.normalized, func)\n    }\n\n    /// Calls the given function for each character of the string\n    ///\n    /// Replaces each character of the string using the returned value. Each\n    /// returned value **must** be a str of length 1 (ie a character).\n    #[pyo3(text_signature = \"(self, func)\")]\n    fn map(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        map(&mut self.normalized, func)\n    }\n\n    /// Split the NormalizedString using the given pattern and the specified behavior\n    ///\n    /// Args:\n    ///     pattern: Pattern:\n    ///         A pattern used to split the string. Usually a string or a regex built with `tokenizers.Regex`\n    ///\n    ///     behavior: SplitDelimiterBehavior:\n    ///         The behavior to use when splitting.\n    ///         Choices: \"removed\", \"isolated\", \"merged_with_previous\", \"merged_with_next\",\n    ///         \"contiguous\"\n    ///\n    /// Returns:\n    ///     A list of NormalizedString, representing each split\n    #[pyo3(text_signature = \"(self, pattern, behavior)\")]\n    fn split(\n        &mut self,\n        pattern: PyPattern,\n        behavior: PySplitDelimiterBehavior,\n    ) -> PyResult<Vec<PyNormalizedString>> {\n        Ok(ToPyResult(self.normalized.split(pattern, behavior.into()))\n            .into_py()?\n            .into_iter()\n            .map(|n| n.into())\n            .collect())\n    }\n\n    /// Replace the content of the given pattern with the provided content\n    ///\n    /// Args:\n    ///     pattern: Pattern:\n    ///         A pattern used to match the string. Usually a string or a Regex\n    ///\n    ///     content: str:\n    ///         The content to be used as replacement\n    #[pyo3(text_signature = \"(self, pattern, content)\")]\n    fn replace(&mut self, pattern: PyPattern, content: &str) -> PyResult<()> {\n        ToPyResult(self.normalized.replace(pattern, content)).into()\n    }\n\n    fn __repr__(&self) -> String {\n        format!(\n            r#\"NormalizedString(original=\"{}\", normalized=\"{}\")\"#,\n            self.normalized.get_original(),\n            self.normalized.get()\n        )\n    }\n\n    fn __str__(&self) -> &str {\n        self.normalized.get()\n    }\n\n    fn __getitem__(&self, range: PyRange<'_>) -> PyResult<Option<PyNormalizedString>> {\n        slice(&self.normalized, &range)\n    }\n}\n\nimpl From<NormalizedString> for PyNormalizedString {\n    fn from(normalized: NormalizedString) -> Self {\n        Self { normalized }\n    }\n}\n\nimpl From<PyNormalizedString> for NormalizedString {\n    fn from(normalized: PyNormalizedString) -> Self {\n        normalized.normalized\n    }\n}\n\n#[pyclass(module = \"tokenizers\", name = \"NormalizedStringRefMut\", from_py_object)]\n#[derive(Clone)]\npub struct PyNormalizedStringRefMut {\n    inner: RefMutContainer<NormalizedString>,\n}\n\nimpl DestroyPtr for PyNormalizedStringRefMut {\n    fn destroy(&mut self) {\n        self.inner.destroy();\n    }\n}\n\nimpl PyNormalizedStringRefMut {\n    pub fn new(normalized: &mut NormalizedString) -> RefMutGuard<'_, Self> {\n        RefMutGuard::new(Self {\n            inner: RefMutContainer::new(normalized),\n        })\n    }\n\n    pub fn destroyed_error() -> PyErr {\n        exceptions::PyException::new_err(\"Cannot use a NormalizedStringRefMut outside `normalize`\")\n    }\n\n    /// Provides a way to access a reference to the underlying NormalizedString\n    pub fn map_as_ref<F: FnOnce(&NormalizedString) -> U, U>(&self, f: F) -> PyResult<U> {\n        self.inner\n            .map(f)\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)\n    }\n\n    /// Provides a way to access a mutable reference to the underlying NormalizedString\n    pub fn map_as_mut<F: FnOnce(&mut NormalizedString) -> U, U>(&mut self, f: F) -> PyResult<U> {\n        self.inner\n            .map_mut(f)\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)\n    }\n}\n\n#[pymethods]\nimpl PyNormalizedStringRefMut {\n    #[getter]\n    fn get_normalized(&self) -> PyResult<String> {\n        self.inner\n            .map(|n| n.get().to_owned())\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)\n    }\n\n    #[getter]\n    fn get_original(&self) -> PyResult<String> {\n        self.inner\n            .map(|n| n.get_original().to_owned())\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)\n    }\n\n    fn nfd(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.nfd();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn nfkd(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.nfkd();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn nfc(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.nfc();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn nfkc(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.nfkc();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn lowercase(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.lowercase();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn uppercase(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.uppercase();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn prepend(&mut self, s: &str) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.prepend(s);\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn append(&mut self, s: &str) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.append(s);\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn lstrip(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.lstrip();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn rstrip(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.rstrip();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn strip(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.strip();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn clear(&mut self) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| {\n                n.clear();\n            })\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?;\n        Ok(())\n    }\n\n    fn slice(&self, range: PyRange) -> PyResult<Option<PyNormalizedString>> {\n        self.inner\n            .map(|n| slice(n, &range))\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?\n    }\n\n    fn filter(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| filter(n, func))\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)??;\n        Ok(())\n    }\n\n    fn for_each(&self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        self.inner\n            .map(|n| for_each(n, func))\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)??;\n        Ok(())\n    }\n\n    fn map(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        self.inner\n            .map_mut(|n| map(n, func))\n            .ok_or_else(PyNormalizedStringRefMut::destroyed_error)??;\n        Ok(())\n    }\n\n    fn split(\n        &mut self,\n        pattern: PyPattern,\n        behavior: PySplitDelimiterBehavior,\n    ) -> PyResult<Vec<PyNormalizedString>> {\n        Ok(ToPyResult(\n            self.inner\n                .map_mut(|n| n.split(pattern, behavior.into()))\n                .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?,\n        )\n        .into_py()?\n        .into_iter()\n        .map(|n| n.into())\n        .collect())\n    }\n\n    fn replace(&mut self, pattern: PyPattern, content: &str) -> PyResult<()> {\n        ToPyResult(\n            self.inner\n                .map_mut(|n| n.replace(pattern, content))\n                .ok_or_else(PyNormalizedStringRefMut::destroyed_error)?,\n        )\n        .into()\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/utils/pretokenization.rs",
    "content": "use tokenizers as tk;\n\nuse pyo3::exceptions;\nuse pyo3::prelude::*;\nuse pyo3::types::*;\n\nuse super::{\n    DestroyPtr, PyNormalizedString, PyNormalizedStringRefMut, RefMutContainer, RefMutGuard,\n};\nuse crate::encoding::PyEncoding;\nuse crate::error::ToPyResult;\nuse crate::token::PyToken;\nuse tk::{OffsetReferential, OffsetType, Offsets, PreTokenizedString, Token};\n\nfn split(pretok: &mut PreTokenizedString, func: &Bound<'_, PyAny>) -> PyResult<()> {\n    if !func.is_callable() {\n        Err(exceptions::PyTypeError::new_err(\n            \"`split` expect a callable with the signature: \\\n           `fn(index: int, normalized: NormalizedString) -> List[NormalizedString]`\",\n        ))\n    } else {\n        ToPyResult(pretok.split(|i, normalized| {\n            let output = func.call((i, PyNormalizedString::from(normalized)), None)?;\n            Ok(output\n                .extract::<Vec<PyNormalizedString>>()?\n                .into_iter()\n                .map(tk::NormalizedString::from))\n        }))\n        .into()\n    }\n}\n\nfn normalize(pretok: &mut PreTokenizedString, func: &Bound<'_, PyAny>) -> PyResult<()> {\n    if !func.is_callable() {\n        Err(exceptions::PyTypeError::new_err(\n            \"`normalize` expect a callable with the signature: \\\n            `fn(normalized: NormalizedString)`\",\n        ))\n    } else {\n        ToPyResult(pretok.normalize(|normalized| {\n            let norm = PyNormalizedStringRefMut::new(normalized);\n            func.call((norm.get().clone(),), None)?;\n            Ok(())\n        }))\n        .into()\n    }\n}\n\nfn tokenize(pretok: &mut PreTokenizedString, func: &Bound<'_, PyAny>) -> PyResult<()> {\n    if !func.is_callable() {\n        Err(exceptions::PyTypeError::new_err(\n            \"`tokenize` expect a callable with the signature: \\\n            `fn(str) -> List[Token]`\",\n        ))\n    } else {\n        ToPyResult(pretok.tokenize(|normalized| {\n            let output = func.call((normalized.get(),), None)?;\n            Ok(output\n                .extract::<Bound<PyList>>()\n                .map_err(PyErr::from)?\n                .into_iter()\n                .map(|obj| Ok(Token::from(obj.extract::<PyToken>()?)))\n                .collect::<PyResult<Vec<_>>>()?)\n        }))\n        .into()\n    }\n}\n\n/// This is an enum\n#[derive(Clone)]\npub struct PyOffsetReferential(OffsetReferential);\nimpl<'a, 'py> FromPyObject<'a, 'py> for PyOffsetReferential {\n    type Error = PyErr;\n\n    fn extract(obj: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        let s = obj.extract::<String>()?;\n\n        Ok(Self(match s.as_ref() {\n            \"original\" => Ok(OffsetReferential::Original),\n            \"normalized\" => Ok(OffsetReferential::Normalized),\n            _ => Err(exceptions::PyValueError::new_err(\n                \"Wrong value for OffsetReferential, expected one of `original, normalized`\",\n            )),\n        }?))\n    }\n}\n\n#[derive(Clone)]\npub struct PyOffsetType(OffsetType);\nimpl<'a, 'py> FromPyObject<'a, 'py> for PyOffsetType {\n    type Error = PyErr;\n\n    fn extract(obj: Borrowed<'a, 'py, PyAny>) -> Result<Self, Self::Error> {\n        let s = obj.extract::<String>()?;\n\n        Ok(Self(match s.as_ref() {\n            \"byte\" => Ok(OffsetType::Byte),\n            \"char\" => Ok(OffsetType::Char),\n            _ => Err(exceptions::PyValueError::new_err(\n                \"Wrong value for OffsetType, expected one of `byte, char`\",\n            )),\n        }?))\n    }\n}\n\ntype PySplit = (String, Offsets, Option<Vec<PyToken>>);\nfn get_splits(\n    pretok: &PreTokenizedString,\n    offset_referential: PyOffsetReferential,\n    offset_type: PyOffsetType,\n) -> Vec<PySplit> {\n    pretok\n        .get_splits(offset_referential.0, offset_type.0)\n        .into_iter()\n        .map(|(s, o, t)| {\n            (\n                s.to_owned(),\n                o,\n                t.as_ref()\n                    .map(|tokens| tokens.iter().map(|t| t.clone().into()).collect()),\n            )\n        })\n        .collect()\n}\n\nfn to_encoding(\n    pretok: &PreTokenizedString,\n    type_id: u32,\n    word_idx: Option<u32>,\n) -> PyResult<PyEncoding> {\n    Ok(ToPyResult(\n        pretok\n            .clone()\n            .into_encoding(word_idx, type_id, tk::OffsetType::Char),\n    )\n    .into_py()?\n    .into())\n}\n\n/// PreTokenizedString\n///\n/// Wrapper over a string, that provides a way to normalize, pre-tokenize, tokenize the\n/// underlying string, while keeping track of the alignment information (offsets).\n///\n/// The PreTokenizedString manages what we call `splits`. Each split represents a substring\n/// which is a subpart of the original string, with the relevant offsets and tokens.\n///\n/// When calling one of the methods used to modify the PreTokenizedString (namely one of\n/// `split`, `normalize` or `tokenize), only the `splits` that don't have any associated\n/// tokens will get modified.\n///\n/// Args:\n///     sequence: str:\n///         The string sequence used to initialize this PreTokenizedString\n#[pyclass(module = \"tokenizers\", name = \"PreTokenizedString\")]\npub struct PyPreTokenizedString {\n    pub(crate) pretok: tk::PreTokenizedString,\n}\n\nimpl From<PreTokenizedString> for PyPreTokenizedString {\n    fn from(pretok: PreTokenizedString) -> Self {\n        Self { pretok }\n    }\n}\n\nimpl From<PyPreTokenizedString> for PreTokenizedString {\n    fn from(pretok: PyPreTokenizedString) -> Self {\n        pretok.pretok\n    }\n}\n\n#[pymethods]\nimpl PyPreTokenizedString {\n    #[new]\n    #[pyo3(text_signature = \"(self, sequence)\")]\n    fn new(s: &str) -> Self {\n        PreTokenizedString::from(s).into()\n    }\n\n    /// Split the PreTokenizedString using the given `func`\n    ///\n    /// Args:\n    ///     func: Callable[[index, NormalizedString], List[NormalizedString]]:\n    ///         The function used to split each underlying split.\n    ///         It is expected to return a list of `NormalizedString`, that represent the new\n    ///         splits. If the given `NormalizedString` does not need any splitting, we can\n    ///         just return it directly.\n    ///         In order for the offsets to be tracked accurately, any returned `NormalizedString`\n    ///         should come from calling either `.split` or `.slice` on the received one.\n    #[pyo3(text_signature = \"(self, func)\")]\n    fn split(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        split(&mut self.pretok, func)\n    }\n\n    /// Normalize each split of the `PreTokenizedString` using the given `func`\n    ///\n    /// Args:\n    ///     func: Callable[[NormalizedString], None]:\n    ///         The function used to normalize each underlying split. This function\n    ///         does not need to return anything, just calling the methods on the provided\n    ///         NormalizedString allow its modification.\n    #[pyo3(text_signature = \"(self, func)\")]\n    fn normalize(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        normalize(&mut self.pretok, func)\n    }\n\n    /// Tokenize each split of the `PreTokenizedString` using the given `func`\n    ///\n    /// Args:\n    ///     func: Callable[[str], List[Token]]:\n    ///         The function used to tokenize each underlying split. This function must return\n    ///         a list of Token generated from the input str.\n    #[pyo3(text_signature = \"(self, func)\")]\n    fn tokenize(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        tokenize(&mut self.pretok, func)\n    }\n\n    /// Return an Encoding generated from this PreTokenizedString\n    ///\n    /// Args:\n    ///     type_id: int = 0:\n    ///         The type_id to be used on the generated Encoding.\n    ///\n    ///     word_idx: Optional[int] = None:\n    ///         An optional word index to be used for each token of this Encoding. If provided,\n    ///         all the word indices in the generated Encoding will use this value, instead\n    ///         of the one automatically tracked during pre-tokenization.\n    ///\n    /// Returns:\n    ///     An Encoding\n    #[pyo3(signature = (type_id = 0, word_idx = None) -> \"Encoding\")]\n    #[pyo3(text_signature = \"(self, type_id=0, word_idx=None)\")]\n    fn to_encoding(&self, type_id: u32, word_idx: Option<u32>) -> PyResult<PyEncoding> {\n        to_encoding(&self.pretok, type_id, word_idx)\n    }\n\n    /// Get the splits currently managed by the PreTokenizedString\n    ///\n    /// Args:\n    ///     offset_referential: :obj:`str`\n    ///         Whether the returned splits should have offsets expressed relative\n    ///         to the original string, or the normalized one. choices: \"original\", \"normalized\".\n    ///\n    ///     offset_type: :obj:`str`\n    ///         Whether the returned splits should have offsets expressed in bytes or chars.\n    ///         When slicing an str, we usually want to use chars, which is the default value.\n    ///         Now in some cases it might be interesting to get these offsets expressed in bytes,\n    ///         so it is possible to change this here.\n    ///         choices: \"char\", \"bytes\"\n    ///\n    /// Returns\n    ///     A list of splits\n    #[pyo3(signature = (\n        offset_referential = PyOffsetReferential(OffsetReferential::Original),\n        offset_type = PyOffsetType(OffsetType::Char)\n    ))]\n    #[pyo3(text_signature = \"(self, offset_referential=\\\"original\\\", offset_type=\\\"char\\\")\")]\n    fn get_splits(\n        &self,\n        offset_referential: PyOffsetReferential,\n        offset_type: PyOffsetType,\n    ) -> Vec<PySplit> {\n        get_splits(&self.pretok, offset_referential, offset_type)\n    }\n}\n\n#[pyclass(module = \"tokenizers\", name = \"PreTokenizedString\", from_py_object)]\n#[derive(Clone)]\npub struct PyPreTokenizedStringRefMut {\n    inner: RefMutContainer<PreTokenizedString>,\n}\n\nimpl DestroyPtr for PyPreTokenizedStringRefMut {\n    fn destroy(&mut self) {\n        self.inner.destroy();\n    }\n}\n\nimpl PyPreTokenizedStringRefMut {\n    pub fn new(pretok: &mut tk::PreTokenizedString) -> RefMutGuard<'_, Self> {\n        // SAFETY: This is safe because we return a RefMutGuard here.\n        // The compiler will make sure the &mut stays valid as necessary.\n        RefMutGuard::new(Self {\n            inner: RefMutContainer::new(pretok),\n        })\n    }\n\n    pub fn destroyed_error() -> PyErr {\n        exceptions::PyException::new_err(\n            \"Cannot use a PreTokenizedStringRefMut outside `pre_tokenize`\",\n        )\n    }\n}\n\n#[pymethods]\nimpl PyPreTokenizedStringRefMut {\n    fn split(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        self.inner\n            .map_mut(|pretok| split(pretok, func))\n            .ok_or_else(PyPreTokenizedStringRefMut::destroyed_error)?\n    }\n\n    fn normalize(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        self.inner\n            .map_mut(|pretok| normalize(pretok, func))\n            .ok_or_else(PyPreTokenizedStringRefMut::destroyed_error)?\n    }\n\n    fn tokenize(&mut self, func: &Bound<'_, PyAny>) -> PyResult<()> {\n        self.inner\n            .map_mut(|pretok| tokenize(pretok, func))\n            .ok_or_else(PyPreTokenizedStringRefMut::destroyed_error)?\n    }\n\n    #[pyo3(signature = (type_id = 0, word_idx = None))]\n    fn to_encoding(&self, type_id: u32, word_idx: Option<u32>) -> PyResult<PyEncoding> {\n        self.inner\n            .map(|pretok| to_encoding(pretok, type_id, word_idx))\n            .ok_or_else(PyPreTokenizedStringRefMut::destroyed_error)?\n    }\n\n    #[pyo3(signature = (\n        offset_referential = PyOffsetReferential(OffsetReferential::Original),\n        offset_type = PyOffsetType(OffsetType::Char)\n    ))]\n    fn get_splits(\n        &self,\n        offset_referential: PyOffsetReferential,\n        offset_type: PyOffsetType,\n    ) -> PyResult<Vec<PySplit>> {\n        self.inner\n            .map(|pretok| get_splits(pretok, offset_referential, offset_type))\n            .ok_or_else(PyPreTokenizedStringRefMut::destroyed_error)\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/utils/regex.rs",
    "content": "use pyo3::exceptions;\nuse pyo3::prelude::*;\nuse tk::utils::SysRegex;\n\n/// Instantiate a new Regex with the given pattern\n#[pyclass(module = \"tokenizers\", name = \"Regex\", frozen)]\npub struct PyRegex {\n    pub inner: SysRegex,\n    pub pattern: String,\n}\n\n#[pymethods]\nimpl PyRegex {\n    #[new]\n    #[pyo3(text_signature = \"(self, pattern)\")]\n    fn new(s: &str) -> PyResult<Self> {\n        Ok(Self {\n            inner: SysRegex::new(s)\n                .map_err(|e| exceptions::PyException::new_err(e.to_string().to_owned()))?,\n            pattern: s.to_owned(),\n        })\n    }\n}\n"
  },
  {
    "path": "bindings/python/src/utils/serde_pyo3.rs",
    "content": "use serde::de::value::Error;\nuse serde::{ser, Serialize};\ntype Result<T> = ::std::result::Result<T, Error>;\n\npub struct Serializer {\n    // This string starts empty and JSON is appended as values are serialized.\n    output: String,\n    /// Each levels remembers its own number of elements\n    num_elements: Vec<usize>,\n    max_elements: usize,\n    level: usize,\n    max_depth: usize,\n    /// Maximum string representation\n    /// Useful to ellipsis precompiled_charmap\n    max_string: usize,\n}\n\n// By convention, the public API of a Serde serializer is one or more `to_abc`\n// functions such as `to_string`, `to_bytes`, or `to_writer` depending on what\n// Rust types the serializer is able to produce as output.\n//\n// This basic serializer supports only `to_string`.\npub fn to_string<T>(value: &T) -> Result<String>\nwhere\n    T: Serialize,\n{\n    let max_depth = 20;\n    let max_elements = 6;\n    let max_string = 100;\n    let mut serializer = Serializer {\n        output: String::new(),\n        level: 0,\n        max_depth,\n        max_elements,\n        num_elements: vec![0; max_depth],\n        max_string,\n    };\n    value.serialize(&mut serializer)?;\n    Ok(serializer.output)\n}\n\npub fn repr<T>(value: &T) -> Result<String>\nwhere\n    T: Serialize,\n{\n    let max_depth = 200;\n    let max_string = usize::MAX;\n    let mut serializer = Serializer {\n        output: String::new(),\n        level: 0,\n        max_depth,\n        max_elements: 100,\n        num_elements: vec![0; max_depth],\n        max_string,\n    };\n    value.serialize(&mut serializer)?;\n    Ok(serializer.output)\n}\n\nimpl ser::Serializer for &mut Serializer {\n    // The output type produced by this `Serializer` during successful\n    // serialization. Most serializers that produce text or binary output should\n    // set `Ok = ()` and serialize into an `io::Write` or buffer contained\n    // within the `Serializer` instance, as happens here. Serializers that build\n    // in-memory data structures may be simplified by using `Ok` to propagate\n    // the data structure around.\n    type Ok = ();\n\n    // The error type when some error occurs during serialization.\n    type Error = Error;\n\n    // Associated types for keeping track of additional state while serializing\n    // compound data structures like sequences and maps. In this case no\n    // additional state is required beyond what is already stored in the\n    // Serializer struct.\n    type SerializeSeq = Self;\n    type SerializeTuple = Self;\n    type SerializeTupleStruct = Self;\n    type SerializeTupleVariant = Self;\n    type SerializeMap = Self;\n    type SerializeStruct = Self;\n    type SerializeStructVariant = Self;\n\n    // Here we go with the simple methods. The following 12 methods receive one\n    // of the primitive types of the data model and map it to JSON by appending\n    // into the output string.\n    fn serialize_bool(self, v: bool) -> Result<()> {\n        self.output += if v { \"True\" } else { \"False\" };\n        Ok(())\n    }\n\n    // JSON does not distinguish between different sizes of integers, so all\n    // signed integers will be serialized the same and all unsigned integers\n    // will be serialized the same. Other formats, especially compact binary\n    // formats, may need independent logic for the different sizes.\n    fn serialize_i8(self, v: i8) -> Result<()> {\n        self.serialize_i64(i64::from(v))\n    }\n\n    fn serialize_i16(self, v: i16) -> Result<()> {\n        self.serialize_i64(i64::from(v))\n    }\n\n    fn serialize_i32(self, v: i32) -> Result<()> {\n        self.serialize_i64(i64::from(v))\n    }\n\n    // Not particularly efficient but this is example code anyway. A more\n    // performant approach would be to use the `itoa` crate.\n    fn serialize_i64(self, v: i64) -> Result<()> {\n        self.output += &v.to_string();\n        Ok(())\n    }\n\n    fn serialize_u8(self, v: u8) -> Result<()> {\n        self.serialize_u64(u64::from(v))\n    }\n\n    fn serialize_u16(self, v: u16) -> Result<()> {\n        self.serialize_u64(u64::from(v))\n    }\n\n    fn serialize_u32(self, v: u32) -> Result<()> {\n        self.serialize_u64(u64::from(v))\n    }\n\n    fn serialize_u64(self, v: u64) -> Result<()> {\n        self.output += &v.to_string();\n        Ok(())\n    }\n\n    fn serialize_f32(self, v: f32) -> Result<()> {\n        self.serialize_f64(f64::from(v))\n    }\n\n    fn serialize_f64(self, v: f64) -> Result<()> {\n        self.output += &v.to_string();\n        Ok(())\n    }\n\n    // Serialize a char as a single-character string. Other formats may\n    // represent this differently.\n    fn serialize_char(self, v: char) -> Result<()> {\n        self.serialize_str(&v.to_string())\n    }\n\n    // This only works for strings that don't require escape sequences but you\n    // get the idea. For example it would emit invalid JSON if the input string\n    // contains a '\"' character.\n    fn serialize_str(self, v: &str) -> Result<()> {\n        self.output += \"\\\"\";\n        if v.len() > self.max_string {\n            self.output += &v[..self.max_string];\n            self.output += \"...\";\n        } else {\n            self.output += v;\n        }\n        self.output += \"\\\"\";\n        Ok(())\n    }\n\n    // Serialize a byte array as an array of bytes. Could also use a base64\n    // string here. Binary formats will typically represent byte arrays more\n    // compactly.\n    fn serialize_bytes(self, v: &[u8]) -> Result<()> {\n        use serde::ser::SerializeSeq;\n        let mut seq = self.serialize_seq(Some(v.len()))?;\n        for byte in v {\n            seq.serialize_element(byte)?;\n        }\n        seq.end()\n    }\n\n    // An absent optional is represented as the JSON `null`.\n    fn serialize_none(self) -> Result<()> {\n        self.serialize_unit()\n    }\n\n    // A present optional is represented as just the contained value. Note that\n    // this is a lossy representation. For example the values `Some(())` and\n    // `None` both serialize as just `null`. Unfortunately this is typically\n    // what people expect when working with JSON. Other formats are encouraged\n    // to behave more intelligently if possible.\n    fn serialize_some<T>(self, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        value.serialize(self)\n    }\n\n    // In Serde, unit means an anonymous value containing no data. Map this to\n    // JSON as `null`.\n    fn serialize_unit(self) -> Result<()> {\n        self.output += \"None\";\n        Ok(())\n    }\n\n    // Unit struct means a named value containing no data. Again, since there is\n    // no data, map this to JSON as `null`. There is no need to serialize the\n    // name in most formats.\n    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {\n        self.serialize_unit()\n    }\n\n    // When serializing a unit variant (or any other kind of variant), formats\n    // can choose whether to keep track of it by index or by name. Binary\n    // formats typically use the index of the variant and human-readable formats\n    // typically use the name.\n    fn serialize_unit_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n    ) -> Result<()> {\n        // self.serialize_str(variant)\n        self.output += variant;\n        Ok(())\n    }\n\n    // As is done here, serializers are encouraged to treat newtype structs as\n    // insignificant wrappers around the data they contain.\n    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        value.serialize(self)\n    }\n\n    // Note that newtype variant (and all of the other variant serialization\n    // methods) refer exclusively to the \"externally tagged\" enum\n    // representation.\n    //\n    // Serialize this to JSON in externally tagged form as `{ NAME: VALUE }`.\n    fn serialize_newtype_variant<T>(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n        value: &T,\n    ) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        // variant.serialize(&mut *self)?;\n        self.output += variant;\n        self.output += \"(\";\n        value.serialize(&mut *self)?;\n        self.output += \")\";\n        Ok(())\n    }\n\n    // Now we get to the serialization of compound types.\n    //\n    // The start of the sequence, each value, and the end are three separate\n    // method calls. This one is responsible only for serializing the start,\n    // which in JSON is `[`.\n    //\n    // The length of the sequence may or may not be known ahead of time. This\n    // doesn't make a difference in JSON because the length is not represented\n    // explicitly in the serialized form. Some serializers may only be able to\n    // support sequences for which the length is known up front.\n    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {\n        self.output += \"[\";\n        self.level = std::cmp::min(self.max_depth - 1, self.level + 1);\n        self.num_elements[self.level] = 0;\n        Ok(self)\n    }\n\n    // Tuples look just like sequences in JSON. Some formats may be able to\n    // represent tuples more efficiently by omitting the length, since tuple\n    // means that the corresponding `Deserialize implementation will know the\n    // length without needing to look at the serialized data.\n    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {\n        self.output += \"(\";\n        self.level = std::cmp::min(self.max_depth - 1, self.level + 1);\n        self.num_elements[self.level] = 0;\n        Ok(self)\n    }\n\n    // Tuple structs look just like sequences in JSON.\n    fn serialize_tuple_struct(\n        self,\n        _name: &'static str,\n        len: usize,\n    ) -> Result<Self::SerializeTupleStruct> {\n        self.serialize_tuple(len)\n    }\n\n    // Tuple variants are represented in JSON as `{ NAME: [DATA...] }`. Again\n    // this method is only responsible for the externally tagged representation.\n    fn serialize_tuple_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeTupleVariant> {\n        // variant.serialize(&mut *self)?;\n        self.output += variant;\n        self.output += \"(\";\n        self.level = std::cmp::min(self.max_depth - 1, self.level + 1);\n        self.num_elements[self.level] = 0;\n        Ok(self)\n    }\n\n    // Maps are represented in JSON as `{ K: V, K: V, ... }`.\n    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {\n        self.output += \"{\";\n        self.level = std::cmp::min(self.max_depth - 1, self.level + 1);\n        self.num_elements[self.level] = 0;\n        Ok(self)\n    }\n\n    // Structs look just like maps in JSON. In particular, JSON requires that we\n    // serialize the field names of the struct. Other formats may be able to\n    // omit the field names when serializing structs because the corresponding\n    // Deserialize implementation is required to know what the keys are without\n    // looking at the serialized data.\n    fn serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {\n        // self.serialize_map(Some(len))\n        // name.serialize(&mut *self)?;\n        if let Some(stripped) = name.strip_suffix(\"Helper\") {\n            self.output += stripped;\n        } else {\n            self.output += name\n        }\n        self.output += \"(\";\n        self.level = std::cmp::min(self.max_depth - 1, self.level + 1);\n        self.num_elements[self.level] = 0;\n        Ok(self)\n    }\n\n    // Struct variants are represented in JSON as `{ NAME: { K: V, ... } }`.\n    // This is the externally tagged representation.\n    fn serialize_struct_variant(\n        self,\n        _name: &'static str,\n        _variant_index: u32,\n        variant: &'static str,\n        _len: usize,\n    ) -> Result<Self::SerializeStructVariant> {\n        // variant.serialize(&mut *self)?;\n        self.output += variant;\n        self.output += \"(\";\n        self.level = std::cmp::min(self.max_depth - 1, self.level + 1);\n        self.num_elements[self.level] = 0;\n        Ok(self)\n    }\n}\n\n// The following 7 impls deal with the serialization of compound types like\n// sequences and maps. Serialization of such types is begun by a Serializer\n// method and followed by zero or more calls to serialize individual elements of\n// the compound type and one call to end the compound type.\n//\n// This impl is SerializeSeq so these methods are called after `serialize_seq`\n// is called on the Serializer.\nimpl ser::SerializeSeq for &mut Serializer {\n    // Must match the `Ok` type of the serializer.\n    type Ok = ();\n    // Must match the `Error` type of the serializer.\n    type Error = Error;\n\n    // Serialize a single element of the sequence.\n    fn serialize_element<T>(&mut self, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.num_elements[self.level] += 1;\n        let num_elements = self.num_elements[self.level];\n        if num_elements < self.max_elements {\n            if !self.output.ends_with('[') {\n                self.output += \", \";\n            }\n            value.serialize(&mut **self)\n        } else {\n            if num_elements == self.max_elements {\n                self.output += \", ...\";\n            }\n            Ok(())\n        }\n    }\n\n    // Close the sequence.\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \"]\";\n        Ok(())\n    }\n}\n\n// Same thing but for tuples.\nimpl ser::SerializeTuple for &mut Serializer {\n    type Ok = ();\n    type Error = Error;\n\n    fn serialize_element<T>(&mut self, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.num_elements[self.level] += 1;\n        let num_elements = self.num_elements[self.level];\n        if num_elements < self.max_elements {\n            if !self.output.ends_with('(') {\n                self.output += \", \";\n            }\n            value.serialize(&mut **self)\n        } else {\n            if num_elements == self.max_elements {\n                self.output += \", ...\";\n            }\n            Ok(())\n        }\n    }\n\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \")\";\n        Ok(())\n    }\n}\n\n// Same thing but for tuple structs.\nimpl ser::SerializeTupleStruct for &mut Serializer {\n    type Ok = ();\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.num_elements[self.level] += 1;\n        let num_elements = self.num_elements[self.level];\n        if num_elements < self.max_elements {\n            if !self.output.ends_with('(') {\n                self.output += \", \";\n            }\n            value.serialize(&mut **self)\n        } else {\n            if num_elements == self.max_elements {\n                self.output += \", ...\";\n            }\n            Ok(())\n        }\n    }\n\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \")\";\n        Ok(())\n    }\n}\n\n// Tuple variants are a little different. Refer back to the\n// `serialize_tuple_variant` method above:\n//\n//    self.output += \"{\";\n//    variant.serialize(&mut *self)?;\n//    self.output += \":[\";\n//\n// So the `end` method in this impl is responsible for closing both the `]` and\n// the `}`.\nimpl ser::SerializeTupleVariant for &mut Serializer {\n    type Ok = ();\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.num_elements[self.level] += 1;\n        let num_elements = self.num_elements[self.level];\n        if num_elements < self.max_elements {\n            if !self.output.ends_with('(') {\n                self.output += \", \";\n            }\n            value.serialize(&mut **self)\n        } else {\n            if num_elements == self.max_elements {\n                self.output += \", ...\";\n            }\n            Ok(())\n        }\n    }\n\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \")\";\n        Ok(())\n    }\n}\n\n// Some `Serialize` types are not able to hold a key and value in memory at the\n// same time so `SerializeMap` implementations are required to support\n// `serialize_key` and `serialize_value` individually.\n//\n// There is a third optional method on the `SerializeMap` trait. The\n// `serialize_entry` method allows serializers to optimize for the case where\n// key and value are both available simultaneously. In JSON it doesn't make a\n// difference so the default behavior for `serialize_entry` is fine.\nimpl ser::SerializeMap for &mut Serializer {\n    type Ok = ();\n    type Error = Error;\n\n    // The Serde data model allows map keys to be any serializable type. JSON\n    // only allows string keys so the implementation below will produce invalid\n    // JSON if the key serializes as something other than a string.\n    //\n    // A real JSON serializer would need to validate that map keys are strings.\n    // This can be done by using a different Serializer to serialize the key\n    // (instead of `&mut **self`) and having that other serializer only\n    // implement `serialize_str` and return an error on any other data type.\n    fn serialize_key<T>(&mut self, key: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        self.num_elements[self.level] += 1;\n        let num_elements = self.num_elements[self.level];\n        if num_elements < self.max_elements {\n            if !self.output.ends_with('{') {\n                self.output += \", \";\n            }\n            key.serialize(&mut **self)\n        } else {\n            if num_elements == self.max_elements {\n                self.output += \", ...\";\n            }\n            Ok(())\n        }\n    }\n\n    // It doesn't make a difference whether the colon is printed at the end of\n    // `serialize_key` or at the beginning of `serialize_value`. In this case\n    // the code is a bit simpler having it here.\n    fn serialize_value<T>(&mut self, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        let num_elements = self.num_elements[self.level];\n        if num_elements < self.max_elements {\n            self.output += \":\";\n            value.serialize(&mut **self)\n        } else {\n            Ok(())\n        }\n    }\n\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \"}\";\n        Ok(())\n    }\n}\n\n// Structs are like maps in which the keys are constrained to be compile-time\n// constant strings.\nimpl ser::SerializeStruct for &mut Serializer {\n    type Ok = ();\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        if !self.output.ends_with('(') {\n            self.output += \", \";\n        }\n        // key.serialize(&mut **self)?;\n        if key != \"type\" {\n            self.output += key;\n            self.output += \"=\";\n            value.serialize(&mut **self)\n        } else {\n            Ok(())\n        }\n    }\n\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \")\";\n        Ok(())\n    }\n}\n\n// Similar to `SerializeTupleVariant`, here the `end` method is responsible for\n// closing both of the curly braces opened by `serialize_struct_variant`.\nimpl ser::SerializeStructVariant for &mut Serializer {\n    type Ok = ();\n    type Error = Error;\n\n    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>\n    where\n        T: ?Sized + Serialize,\n    {\n        if !self.output.ends_with('(') {\n            self.output += \", \";\n        }\n        // key.serialize(&mut **self)?;\n        self.output += key;\n        self.output += \"=\";\n        value.serialize(&mut **self)\n    }\n\n    fn end(self) -> Result<()> {\n        self.num_elements[self.level] = 0;\n        self.level = self.level.saturating_sub(1);\n        self.output += \")\";\n        Ok(())\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n#[test]\nfn test_basic() {\n    assert_eq!(to_string(&true).unwrap(), \"True\");\n    assert_eq!(to_string(&Some(1)).unwrap(), \"1\");\n    assert_eq!(to_string(&None::<usize>).unwrap(), \"None\");\n}\n\n#[test]\nfn test_struct() {\n    #[derive(Serialize)]\n    struct Test {\n        int: u32,\n        seq: Vec<&'static str>,\n    }\n\n    let test = Test {\n        int: 1,\n        seq: vec![\"a\", \"b\"],\n    };\n    let expected = r#\"Test(int=1, seq=[\"a\", \"b\"])\"#;\n    assert_eq!(to_string(&test).unwrap(), expected);\n}\n\n#[test]\nfn test_enum() {\n    #[derive(Serialize)]\n    enum E {\n        Unit,\n        Newtype(u32),\n        Tuple(u32, u32),\n        Struct { a: u32 },\n    }\n\n    let u = E::Unit;\n    let expected = r#\"Unit\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n\n    let n = E::Newtype(1);\n    let expected = r#\"Newtype(1)\"#;\n    assert_eq!(to_string(&n).unwrap(), expected);\n\n    let t = E::Tuple(1, 2);\n    let expected = r#\"Tuple(1, 2)\"#;\n    assert_eq!(to_string(&t).unwrap(), expected);\n\n    let s = E::Struct { a: 1 };\n    let expected = r#\"Struct(a=1)\"#;\n    assert_eq!(to_string(&s).unwrap(), expected);\n}\n\n#[test]\nfn test_enum_untagged() {\n    #[derive(Serialize)]\n    #[serde(untagged)]\n    enum E {\n        Unit,\n        Newtype(u32),\n        Tuple(u32, u32),\n        Struct { a: u32 },\n    }\n\n    let u = E::Unit;\n    let expected = r#\"None\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n\n    let n = E::Newtype(1);\n    let expected = r#\"1\"#;\n    assert_eq!(to_string(&n).unwrap(), expected);\n\n    let t = E::Tuple(1, 2);\n    let expected = r#\"(1, 2)\"#;\n    assert_eq!(to_string(&t).unwrap(), expected);\n\n    let s = E::Struct { a: 1 };\n    let expected = r#\"E(a=1)\"#;\n    assert_eq!(to_string(&s).unwrap(), expected);\n}\n\n#[test]\nfn test_struct_tagged() {\n    #[derive(Serialize)]\n    #[serde(untagged)]\n    enum E {\n        A(A),\n    }\n\n    #[derive(Serialize)]\n    #[serde(tag = \"type\")]\n    struct A {\n        a: bool,\n        b: usize,\n    }\n\n    let u = A { a: true, b: 1 };\n    // let expected = r#\"A(type=\"A\", a=True, b=1)\"#;\n    // No we skip all `type` manually inserted variants.\n    let expected = r#\"A(a=True, b=1)\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n\n    let u = E::A(A { a: true, b: 1 });\n    let expected = r#\"A(a=True, b=1)\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n}\n\n#[test]\nfn test_flatten() {\n    #[derive(Serialize)]\n    struct A {\n        a: bool,\n        b: usize,\n    }\n\n    #[derive(Serialize)]\n    struct B {\n        c: A,\n        d: usize,\n    }\n\n    #[derive(Serialize)]\n    struct C {\n        #[serde(flatten)]\n        c: A,\n        d: usize,\n    }\n\n    #[derive(Serialize)]\n    #[serde(transparent)]\n    struct D {\n        e: A,\n    }\n\n    let u = B {\n        c: A { a: true, b: 1 },\n        d: 2,\n    };\n    let expected = r#\"B(c=A(a=True, b=1), d=2)\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n\n    let u = C {\n        c: A { a: true, b: 1 },\n        d: 2,\n    };\n    // XXX This is unfortunate but true, flatten forces the serialization\n    // to use the serialize_map  without any means for the Serializer to know about this\n    // flattening attempt\n    let expected = r#\"{\"a\":True, \"b\":1, \"d\":2}\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n\n    let u = D {\n        e: A { a: true, b: 1 },\n    };\n    let expected = r#\"A(a=True, b=1)\"#;\n    assert_eq!(to_string(&u).unwrap(), expected);\n}\n"
  },
  {
    "path": "bindings/python/stub.py",
    "content": "import argparse\nimport ast\nimport inspect\nimport os\nimport subprocess\nimport sys\nfrom pathlib import Path\n\n\nGENERATED_COMMENT = \"# Generated content DO NOT EDIT\\n\"\n\n\ndef public_members(module):\n    return [\n        member\n        for name, member in inspect.getmembers(module)\n        if not name.startswith(\"_\") and not inspect.ismodule(member)\n    ]\n\n\ndef forwarder(module, origin):\n    members = public_members(module)\n    lines = [GENERATED_COMMENT, f\"from .. import {origin}\", \"\"]\n    for member in members:\n        if getattr(member, \"__module__\", \"\") == \"typing\":\n            continue\n        member_name = getattr(member, \"__name__\", None)\n        if member_name:\n            lines.append(f\"{member_name} = {origin}.{member_name}\")\n    lines.append(\"\")\n    return \"\\n\".join(lines)\n\n\ndef do_ruff(code):\n    command = [\"ruff\", \"format\", \"--config\", \"pyproject.toml\", \"--stdin-filename\", \"__init__.py\", \"-\"]\n    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)\n    stdout, stderr = process.communicate(input=code.encode(\"utf-8\"))\n    if stderr:\n        print(code)\n        print(f\"Ruff error: {stderr.decode('utf-8')}\")\n        return code\n    return stdout.decode(\"utf-8\")\n\n\ndef format_docstring(docstring: str, indent: int = 4) -> str:\n    \"\"\"Format a docstring for insertion into a .pyi file.\"\"\"\n    if not docstring:\n        return \"\"\n\n    indent_str = \" \" * indent\n    lines = docstring.strip().split(\"\\n\")\n\n    if len(lines) == 1:\n        # Single line docstring\n        return f'{indent_str}\"\"\"{lines[0]}\"\"\"\\n'\n\n    # Multi-line docstring\n    result = [f'{indent_str}\"\"\"']\n    result.extend(indent_str + line.rstrip() for line in lines)\n    result.append(f'{indent_str}\"\"\"')\n    return \"\\n\".join(result) + \"\\n\"\n\n\ndef get_module(module_name: str):\n    \"\"\"Get module by name, handling tokenizers submodules.\"\"\"\n    import tokenizers\n    if module_name == \"tokenizers\":\n        return tokenizers\n    return getattr(tokenizers, module_name.split(\".\")[-1], None)\n\n\ndef add_docstring_to_stub(line: str, docstring: str, indent: int) -> str:\n    \"\"\"Convert 'def foo(): ...' or multi-line ending with '...' to include docstring.\"\"\"\n    if line.rstrip().endswith('...'):\n        base = line.rstrip()[:-3]  # Remove ...\n        if not base.rstrip().endswith(':'):\n            base = base.rstrip() + ':'\n        inner = ' ' * (indent + 4)\n        return f\"{base}\\n{inner}\\\"\\\"\\\"{docstring}\\\"\\\"\\\"\\n{inner}...\"\n    return line\n\n\ndef add_docstrings_to_pyi(pyi_file: Path, module_name: str):\n    \"\"\"Add docstrings from the actual module to a .pyi file.\"\"\"\n    module = get_module(module_name)\n    if module is None:\n        print(f\"Could not find module {module_name}\")\n        return\n\n    content = pyi_file.read_text()\n    try:\n        tree = ast.parse(content)\n    except SyntaxError as e:\n        print(f\"Could not parse {pyi_file}: {e}\")\n        return\n\n    lines = content.splitlines(keepends=True)\n\n    # Collect insertions: (start_line, end_line, docstring, indent)\n    # start_line and end_line are 0-indexed\n    insertions = []\n\n    for node in ast.walk(tree):\n        if isinstance(node, ast.ClassDef):\n            obj = getattr(module, node.name, None)\n            if obj and getattr(obj, \"__doc__\", None):\n                indent = len(lines[node.lineno - 1]) - len(lines[node.lineno - 1].lstrip())\n                insertions.append((node.lineno - 1, node.lineno - 1, obj.__doc__.strip(), indent))\n\n            # Process methods and properties within the class\n            for item in node.body:\n                if isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)):\n                    class_obj = getattr(module, node.name, None)\n                    if not class_obj:\n                        continue\n                    # For properties, get descriptor; for methods, get method\n                    method_obj = getattr(class_obj, item.name, None)\n                    if method_obj and getattr(method_obj, \"__doc__\", None):\n                        start = item.lineno - 1\n                        end = (item.end_lineno - 1) if item.end_lineno else start\n                        indent = len(lines[start]) - len(lines[start].lstrip())\n                        insertions.append((start, end, method_obj.__doc__.strip(), indent))\n\n        elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):\n            # Only process top-level functions (not nested in classes)\n            # Check if this is a top-level node\n            if node in tree.body:\n                obj = getattr(module, node.name, None)\n                if obj and getattr(obj, \"__doc__\", None):\n                    start = node.lineno - 1\n                    end = (node.end_lineno - 1) if node.end_lineno else start\n                    indent = len(lines[start]) - len(lines[start].lstrip())\n                    insertions.append((start, end, obj.__doc__.strip(), indent))\n\n    # Sort by start line descending to apply from bottom to top\n    insertions.sort(key=lambda x: x[0], reverse=True)\n\n    # Apply insertions\n    for start, end, docstring, indent in insertions:\n        # Get all lines for this definition\n        def_lines = [lines[i].rstrip('\\n') for i in range(start, end + 1)]\n        combined = '\\n'.join(def_lines)\n\n        # Check if it ends with ... (stub pattern)\n        if combined.rstrip().endswith('...'):\n            inner_indent = ' ' * (indent + 4)\n            formatted_doc = format_docstring(docstring, indent=indent + 4).rstrip('\\n')\n\n            if len(def_lines) == 1:\n                # Single line: def foo(): ...\n                base = def_lines[0].rstrip()[:-3].rstrip()\n                if not base.endswith(':'):\n                    base += ':'\n                new_content = f\"{base}\\n{formatted_doc}\\n{inner_indent}...\\n\"\n            else:\n                # Multi-line signature\n                last_line = def_lines[-1].rstrip()[:-3].rstrip()  # Remove ...\n                new_lines = def_lines[:-1] + [last_line]\n                new_content = '\\n'.join(new_lines) + '\\n' + formatted_doc + '\\n' + inner_indent + '...\\n'\n\n            # Replace lines[start:end+1] with new_content\n            lines[start:end + 1] = [new_content]\n\n    # Write back\n    pyi_file.write_text(''.join(lines))\n    print(f\"Added docstrings to {pyi_file}\")\n\n\ndef write(module, directory, origin, check=False):\n    submodules = [\n        (name, member)\n        for name, member in inspect.getmembers(module)\n        if inspect.ismodule(member)\n    ]\n    os.makedirs(directory, exist_ok=True)\n\n    filename = os.path.join(directory, \"__init__.py\")\n    py_content = forwarder(module, origin)\n    try:\n        py_content = do_ruff(py_content)\n    except Exception as e:\n        print(f\"Ruff error: {e}\")\n\n    is_auto = False\n    if not os.path.exists(filename):\n        is_auto = True\n    else:\n        with open(filename, \"r\") as f:\n            line = f.readline()\n            if line == GENERATED_COMMENT:\n                is_auto = True\n\n    if is_auto:\n        if check:\n            with open(filename, \"r\") as f:\n                data = f.read()\n                assert data == py_content, f\"The content of {filename} seems outdated, please run `python stub.py`\"\n        else:\n            with open(filename, \"w\") as f:\n                f.write(py_content)\n\n    print(f\"Wrote stub for module: {origin}, submodules: {[name for name, _ in submodules]}\")\n    for name, submodule in submodules:\n        try:\n            write(submodule, os.path.join(directory, name), f\"{name}\", check=check)\n        except Exception as e:\n            print(f\"Something went wrong with {name}, {submodule}: {e}\")\n\ndef process_all_pyi_files(base_dir: str):\n    \"\"\"Process all .pyi files in the directory tree to add docstrings.\"\"\"\n    base_path = Path(base_dir)\n\n    # Map relative paths to module names\n    for pyi_file in base_path.rglob(\"*.pyi\"):\n        # Skip __init__.pyi as it typically just has imports\n        if pyi_file.name == \"__init__.pyi\" and pyi_file.parent.name == \"tokenizers\":\n            # Process the main tokenizers module\n            add_docstrings_to_pyi(pyi_file, \"tokenizers\")\n        elif pyi_file.name == \"__init__.pyi\":\n            # Skip other __init__.pyi files\n            continue\n        elif pyi_file.name == \"tokenizers.pyi\":\n            # Skip the tokenizers.pyi file as it's just imports\n            continue\n        else:\n            # Convert file path to module name\n            # e.g., py_src/tokenizers/decoders.pyi -> tokenizers.decoders\n            rel_path = pyi_file.relative_to(base_path)\n            # rel_path will be something like \"decoders.pyi\" or \"subdir/file.pyi\"\n            # We want to convert to \"tokenizers.decoders\" or \"tokenizers.subdir.file\"\n            parts = list(rel_path.parts[:-1]) + [rel_path.stem]\n            if parts:\n                module_name = \"tokenizers.\" + \".\".join(parts)\n            else:\n                module_name = \"tokenizers\"\n\n            add_docstrings_to_pyi(pyi_file, module_name)\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--check\", action=\"store_true\")\n\n    args = parser.parse_args()\n    import tokenizers\n\n    write(tokenizers, \"py_src/tokenizers/\", \"tokenizers\", check=args.check)  # type: ignore[attr-defined]\n\n    # Process all .pyi files to add docstrings\n    if not args.check:\n        print(\"\\nAdding docstrings to .pyi files...\")\n        process_all_pyi_files(\"py_src/tokenizers\")\n"
  },
  {
    "path": "bindings/python/test.txt",
    "content": "<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n<DOCUMENT> \\test{bla} thisisatest </DOCUMENT>\n"
  },
  {
    "path": "bindings/python/tests/__init__.py",
    "content": ""
  },
  {
    "path": "bindings/python/tests/bindings/__init__.py",
    "content": ""
  },
  {
    "path": "bindings/python/tests/bindings/test_decoders.py",
    "content": "import json\nimport pickle\n\nimport pytest\n\nfrom tokenizers.decoders import (\n    CTC,\n    BPEDecoder,\n    ByteLevel,\n    Decoder,\n    Metaspace,\n    Sequence,\n    WordPiece,\n    ByteFallback,\n    Replace,\n    Strip,\n    Fuse,\n)\n\n\nclass TestByteLevel:\n    def test_instantiate(self):\n        assert ByteLevel() is not None\n        assert isinstance(ByteLevel(), Decoder)\n        assert isinstance(ByteLevel(), ByteLevel)\n        assert isinstance(pickle.loads(pickle.dumps(ByteLevel())), ByteLevel)\n\n    def test_decoding(self):\n        decoder = ByteLevel()\n        assert decoder.decode([\"My\", \"Ġname\", \"Ġis\", \"ĠJohn\"]) == \"My name is John\"\n\n    def test_manual_reload(self):\n        byte_level = ByteLevel()\n        state = json.loads(byte_level.__getstate__())\n        reloaded = ByteLevel(**state)\n        assert isinstance(reloaded, ByteLevel)\n\n\nclass TestReplace:\n    def test_instantiate(self):\n        assert Replace(\"_\", \" \") is not None\n        assert isinstance(Replace(\"_\", \" \"), Decoder)\n        assert isinstance(Replace(\"_\", \" \"), Replace)\n        # assert isinstance(pickle.loads(pickle.dumps(Replace(\"_\", \" \"))), Replace)\n\n    def test_decoding(self):\n        decoder = Replace(\"_\", \" \")\n        assert decoder.decode([\"My\", \"_name\", \"_is\", \"_John\"]) == \"My name is John\"\n\n\nclass TestWordPiece:\n    def test_instantiate(self):\n        assert WordPiece() is not None\n        assert WordPiece(prefix=\"__\") is not None\n        assert WordPiece(cleanup=True) is not None\n        assert isinstance(WordPiece(), Decoder)\n        assert isinstance(WordPiece(), WordPiece)\n        assert isinstance(pickle.loads(pickle.dumps(WordPiece())), WordPiece)\n\n    def test_decoding(self):\n        decoder = WordPiece()\n        assert decoder.decode([\"My\", \"na\", \"##me\", \"is\", \"Jo\", \"##hn\"]) == \"My name is John\"\n        assert decoder.decode([\"I\", \"'m\", \"Jo\", \"##hn\"]) == \"I'm John\"\n        decoder = WordPiece(prefix=\"__\", cleanup=False)\n        assert decoder.decode([\"My\", \"na\", \"__me\", \"is\", \"Jo\", \"__hn\"]) == \"My name is John\"\n        assert decoder.decode([\"I\", \"'m\", \"Jo\", \"__hn\"]) == \"I 'm John\"\n\n    def test_can_modify(self):\n        decoder = WordPiece(prefix=\"$$\", cleanup=False)\n\n        assert decoder.prefix == \"$$\"\n        assert decoder.cleanup == False\n\n        # Modify these\n        decoder.prefix = \"__\"\n        assert decoder.prefix == \"__\"\n        decoder.cleanup = True\n        assert decoder.cleanup == True\n\n\nclass TestByteFallback:\n    def test_instantiate(self):\n        assert ByteFallback() is not None\n        assert isinstance(ByteFallback(), Decoder)\n        assert isinstance(ByteFallback(), ByteFallback)\n        assert isinstance(pickle.loads(pickle.dumps(ByteFallback())), ByteFallback)\n\n    def test_decoding(self):\n        decoder = ByteFallback()\n        assert decoder.decode([\"My\", \" na\", \"me\"]) == \"My name\"\n        assert decoder.decode([\"<0x61>\"]) == \"a\"\n        assert decoder.decode([\"<0xE5>\"]) == \"�\"\n        assert decoder.decode([\"<0xE5>\", \"<0x8f>\"]) == \"��\"\n        assert decoder.decode([\"<0xE5>\", \"<0x8f>\", \"<0xab>\"]) == \"叫\"\n        assert decoder.decode([\"<0xE5>\", \"<0x8f>\", \"a\"]) == \"��a\"\n        assert decoder.decode([\"<0xE5>\", \"<0x8f>\", \"<0xab>\", \"a\"]) == \"叫a\"\n\n\nclass TestFuse:\n    def test_instantiate(self):\n        assert Fuse() is not None\n        assert isinstance(Fuse(), Decoder)\n        assert isinstance(Fuse(), Fuse)\n        assert isinstance(pickle.loads(pickle.dumps(Fuse())), Fuse)\n\n    def test_decoding(self):\n        decoder = Fuse()\n        assert decoder.decode([\"My\", \" na\", \"me\"]) == \"My name\"\n\n\nclass TestStrip:\n    def test_instantiate(self):\n        assert Strip(left=0, right=0) is not None\n        assert isinstance(Strip(content=\"_\", left=0, right=0), Decoder)\n        assert isinstance(Strip(content=\"_\", left=0, right=0), Strip)\n        assert isinstance(pickle.loads(pickle.dumps(Strip(content=\"_\", left=0, right=0))), Strip)\n\n    def test_decoding(self):\n        decoder = Strip(content=\"_\", left=1, right=0)\n        assert decoder.decode([\"_My\", \" na\", \"me\", \" _-\", \"__-\"]) == \"My name _-_-\"\n\n\nclass TestMetaspace:\n    def test_instantiate(self):\n        assert Metaspace() is not None\n        assert Metaspace(replacement=\"-\") is not None\n        with pytest.raises(ValueError, match=\"expected a string of length 1\"):\n            Metaspace(replacement=\"\")\n        assert Metaspace(prepend_scheme=\"always\") is not None\n        assert isinstance(Metaspace(), Decoder)\n        assert isinstance(Metaspace(), Metaspace)\n        assert isinstance(pickle.loads(pickle.dumps(Metaspace())), Metaspace)\n\n    def test_decoding(self):\n        decoder = Metaspace()\n        assert decoder.decode([\"▁My\", \"▁name\", \"▁is\", \"▁John\"]) == \"My name is John\"\n        decoder = Metaspace(replacement=\"-\", prepend_scheme=\"never\")\n        assert decoder.decode([\"-My\", \"-name\", \"-is\", \"-John\"]) == \" My name is John\"\n\n    def test_can_modify(self):\n        decoder = Metaspace(replacement=\"*\", prepend_scheme=\"never\")\n\n        assert decoder.replacement == \"*\"\n        assert decoder.prepend_scheme == \"never\"\n\n        # Modify these\n        decoder.replacement = \"&\"\n        assert decoder.replacement == \"&\"\n        decoder.prepend_scheme = \"first\"\n        assert decoder.prepend_scheme == \"first\"\n\n\nclass TestBPEDecoder:\n    def test_instantiate(self):\n        assert BPEDecoder() is not None\n        assert BPEDecoder(suffix=\"_\") is not None\n        assert isinstance(BPEDecoder(), Decoder)\n        assert isinstance(BPEDecoder(), BPEDecoder)\n        assert isinstance(pickle.loads(pickle.dumps(BPEDecoder())), BPEDecoder)\n\n    def test_decoding(self):\n        decoder = BPEDecoder()\n        assert decoder.decode([\"My</w>\", \"na\", \"me</w>\", \"is</w>\", \"Jo\", \"hn</w>\"]) == \"My name is John\"\n        decoder = BPEDecoder(suffix=\"_\")\n        assert decoder.decode([\"My_\", \"na\", \"me_\", \"is_\", \"Jo\", \"hn_\"]) == \"My name is John\"\n\n    def test_can_modify(self):\n        decoder = BPEDecoder(suffix=\"123\")\n\n        assert decoder.suffix == \"123\"\n\n        # Modify these\n        decoder.suffix = \"</w>\"\n        assert decoder.suffix == \"</w>\"\n\n\nclass TestCTCDecoder:\n    def test_instantiate(self):\n        assert CTC() is not None\n        assert CTC(pad_token=\"[PAD]\") is not None\n        assert isinstance(CTC(), Decoder)\n        assert isinstance(CTC(), CTC)\n        assert isinstance(pickle.loads(pickle.dumps(CTC())), CTC)\n\n    def test_decoding(self):\n        decoder = CTC()\n        assert (\n            decoder.decode([\"<pad>\", \"<pad>\", \"h\", \"e\", \"e\", \"l\", \"l\", \"<pad>\", \"l\", \"o\", \"o\", \"o\", \"<pad>\"])\n            == \"hello\"\n        )\n        decoder = CTC(pad_token=\"[PAD]\")\n        assert (\n            decoder.decode([\"[PAD]\", \"[PAD]\", \"h\", \"e\", \"e\", \"l\", \"l\", \"[PAD]\", \"l\", \"o\", \"o\", \"o\", \"[PAD]\"])\n            == \"hello\"\n        )\n\n    def test_can_modify(self):\n        decoder = CTC(pad_token=\"[PAD]\")\n\n        assert decoder.pad_token == \"[PAD]\"\n        assert decoder.word_delimiter_token == \"|\"\n        assert decoder.cleanup == True\n\n        # Modify these\n        decoder.pad_token = \"{pad}\"\n        assert decoder.pad_token == \"{pad}\"\n\n        decoder.word_delimiter_token = \"_\"\n        assert decoder.word_delimiter_token == \"_\"\n\n        decoder.cleanup = False\n        assert decoder.cleanup == False\n\n\nclass TestSequenceDecoder:\n    def test_instantiate(self):\n        assert Sequence([]) is not None\n        assert Sequence([CTC()]) is not None\n        assert isinstance(Sequence([]), Decoder)\n        assert isinstance(Sequence([]), Sequence)\n        serialized = pickle.dumps(Sequence([]))\n        assert isinstance(pickle.loads(serialized), Sequence)\n\n    def test_decoding(self):\n        decoder = Sequence([CTC(), Metaspace()])\n        initial = [\"▁\", \"▁\", \"H\", \"H\", \"i\", \"i\", \"▁\", \"y\", \"o\", \"u\"]\n        expected = \"Hi you\"\n        assert decoder.decode(initial) == expected\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_encoding.py",
    "content": "import pytest\n\nfrom tokenizers import BertWordPieceTokenizer\n\nfrom ..utils import bert_files, data_dir\n\n\nclass TestEncoding:\n    @pytest.fixture(scope=\"class\")\n    def encodings(self, bert_files):\n        tokenizer = BertWordPieceTokenizer.from_file(bert_files[\"vocab\"])\n        single_encoding = tokenizer.encode(\"I love HuggingFace\")\n        pair_encoding = tokenizer.encode(\"I love HuggingFace\", \"Do you?\")\n        return single_encoding, pair_encoding\n\n    def test_sequence_ids(self, encodings):\n        single, pair = encodings\n\n        assert single.sequence_ids == [None, 0, 0, 0, 0, None]\n        assert pair.sequence_ids == [None, 0, 0, 0, 0, None, 1, 1, 1, None]\n\n    def test_n_sequences(self, encodings):\n        single, pair = encodings\n        assert single.n_sequences == 1\n        assert pair.n_sequences == 2\n\n    def test_word_to_tokens(self, encodings):\n        single, pair = encodings\n\n        assert single.tokens == [\"[CLS]\", \"i\", \"love\", \"hugging\", \"##face\", \"[SEP]\"]\n        assert single.word_to_tokens(0) == (1, 2)\n\n        assert pair.tokens == [\n            \"[CLS]\",\n            \"i\",\n            \"love\",\n            \"hugging\",\n            \"##face\",\n            \"[SEP]\",\n            \"do\",\n            \"you\",\n            \"?\",\n            \"[SEP]\",\n        ]\n        assert pair.word_to_tokens(0) == (1, 2)\n        assert pair.word_to_tokens(0, 0) == (1, 2)\n        assert pair.word_to_tokens(6, 0) == None\n        assert pair.word_to_tokens(0, 1) == (6, 7)\n\n    def test_word_to_chars(self, encodings):\n        single, pair = encodings\n\n        assert single.word_to_chars(2) == (7, 18)\n        assert pair.word_to_chars(2) == (7, 18)\n        assert pair.word_to_chars(2, 0) == (7, 18)\n        assert pair.word_to_chars(2, 1) == (6, 7)\n\n    def test_token_to_sequence(self, encodings):\n        single, pair = encodings\n\n        assert single.token_to_sequence(2) == 0\n        assert pair.token_to_sequence(2) == 0\n        assert pair.token_to_sequence(0) == None\n        assert pair.token_to_sequence(5) == None\n        assert pair.token_to_sequence(6) == 1\n        assert pair.token_to_sequence(8) == 1\n        assert pair.token_to_sequence(9) == None\n        assert pair.token_to_sequence(1200) == None\n\n    def test_token_to_chars(self, encodings):\n        single, pair = encodings\n\n        assert single.token_to_chars(0) == None\n        assert single.token_to_chars(2) == (2, 6)\n        assert pair.token_to_chars(2) == (2, 6)\n        assert pair.token_to_chars(5) == None\n        assert pair.token_to_chars(6) == (0, 2)\n\n    def test_token_to_word(self, encodings):\n        single, pair = encodings\n\n        assert single.token_to_word(0) == None\n        assert single.token_to_word(1) == 0\n        assert single.token_to_word(4) == 2\n        assert pair.token_to_word(1) == 0\n        assert pair.token_to_word(4) == 2\n        assert pair.token_to_word(5) == None\n        assert pair.token_to_word(6) == 0\n        assert pair.token_to_word(7) == 1\n\n    def test_char_to_token(self, encodings):\n        single, pair = encodings\n\n        assert single.char_to_token(0) == 1\n        assert pair.char_to_token(0) == 1\n        assert pair.char_to_token(0, 0) == 1\n        assert pair.char_to_token(1, 0) == None\n        assert pair.char_to_token(0, 1) == 6\n        assert pair.char_to_token(2, 1) == None\n\n    def test_char_to_word(self, encodings):\n        single, pair = encodings\n\n        assert single.char_to_word(0) == 0\n        assert single.char_to_word(1) == None\n        assert pair.char_to_word(2) == 1\n        assert pair.char_to_word(2, 0) == 1\n        assert pair.char_to_word(2, 1) == None\n        assert pair.char_to_word(3, 1) == 1\n\n    def test_truncation(self, encodings):\n        single, _ = encodings\n        single.truncate(2, 1, \"right\")\n        assert single.tokens == [\"[CLS]\", \"i\"]\n        assert single.overflowing[0].tokens == [\"i\", \"love\"]\n\n    def test_invalid_truncate_direction(self, encodings):\n        single, _ = encodings\n        with pytest.raises(ValueError) as excinfo:\n            single.truncate(2, 1, \"not_a_direction\")\n        assert \"Invalid truncation direction value : not_a_direction\" == str(excinfo.value)\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_models.py",
    "content": "import pickle\n\nimport pytest\n\nfrom tokenizers.models import BPE, Model, WordLevel, WordPiece\nfrom ..utils import bert_files, data_dir, roberta_files\n\n\nclass TestBPE:\n    def test_can_modify(self):\n        model = BPE(\n            dropout=0.5,\n            unk_token=\"[UNK]\",\n            continuing_subword_prefix=\"__prefix__\",\n            end_of_word_suffix=\"__suffix__\",\n            fuse_unk=False,\n        )\n\n        assert model.dropout == 0.5\n        assert model.unk_token == \"[UNK]\"\n        assert model.continuing_subword_prefix == \"__prefix__\"\n        assert model.end_of_word_suffix == \"__suffix__\"\n        assert model.fuse_unk == False\n        assert model.byte_fallback == False\n\n        # Modify these\n        model.dropout = 0.1\n        assert pytest.approx(model.dropout) == 0.1\n        model.unk_token = \"<unk>\"\n        assert model.unk_token == \"<unk>\"\n        model.continuing_subword_prefix = None\n        assert model.continuing_subword_prefix == None\n        model.end_of_word_suffix = \"suff\"\n        assert model.end_of_word_suffix == \"suff\"\n        model.fuse_unk = True\n        assert model.fuse_unk == True\n        model.byte_fallback = True\n        assert model.byte_fallback == True\n\n    def test_dropout_zero(self):\n        model = BPE(dropout=0.0)\n        assert model.dropout == 0.0\n\n\nclass TestWordPiece:\n    def test_instantiate(self, bert_files):\n        assert isinstance(WordPiece(), Model)\n        assert isinstance(WordPiece(), WordPiece)\n\n        vocab = {\"a\": 0, \"b\": 1, \"ab\": 2}\n        assert isinstance(WordPiece(vocab), Model)\n        assert isinstance(WordPiece(vocab), WordPiece)\n        assert isinstance(WordPiece.from_file(bert_files[\"vocab\"]), WordPiece)\n        assert isinstance(pickle.loads(pickle.dumps(WordPiece(vocab))), WordPiece)\n\n        assert isinstance(WordPiece(bert_files[\"vocab\"]), Model)\n        assert isinstance(pickle.loads(pickle.dumps(WordPiece(bert_files[\"vocab\"]))), WordPiece)\n\n    def test_can_modify(self):\n        model = WordPiece(\n            unk_token=\"<oov>\",\n            continuing_subword_prefix=\"__prefix__\",\n            max_input_chars_per_word=200,\n        )\n\n        assert model.unk_token == \"<oov>\"\n        assert model.continuing_subword_prefix == \"__prefix__\"\n        assert model.max_input_chars_per_word == 200\n\n        # Modify these\n        model.unk_token = \"<unk>\"\n        assert model.unk_token == \"<unk>\"\n        model.continuing_subword_prefix = \"$$$\"\n        assert model.continuing_subword_prefix == \"$$$\"\n        model.max_input_chars_per_word = 10\n        assert model.max_input_chars_per_word == 10\n\n\nclass TestWordLevel:\n    def test_instantiate(self, roberta_files):\n        assert isinstance(WordLevel(), Model)\n        assert isinstance(WordLevel(), WordLevel)\n\n        vocab = {\"a\": 0, \"b\": 1, \"ab\": 2}\n        assert isinstance(WordLevel(vocab), Model)\n        assert isinstance(WordLevel(vocab), WordLevel)\n        assert isinstance(WordLevel.from_file(roberta_files[\"vocab\"]), WordLevel)\n\n        # The WordLevel model expects a vocab.json using the same format as roberta\n        # so we can just try to load with this file\n        assert isinstance(WordLevel(roberta_files[\"vocab\"]), Model)\n        assert isinstance(WordLevel(roberta_files[\"vocab\"]), WordLevel)\n\n    def test_can_modify(self):\n        model = WordLevel(unk_token=\"<oov>\")\n\n        assert model.unk_token == \"<oov>\"\n\n        # Modify these\n        model.unk_token = \"<unk>\"\n        assert model.unk_token == \"<unk>\"\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_normalizers.py",
    "content": "import pickle\n\nimport pytest\n\nfrom tokenizers import NormalizedString\nfrom tokenizers.normalizers import (\n    BertNormalizer,\n    Lowercase,\n    Normalizer,\n    Precompiled,\n    Sequence,\n    Strip,\n    Prepend,\n    Replace,\n)\n\n\nclass TestBertNormalizer:\n    def test_instantiate(self):\n        assert isinstance(BertNormalizer(), Normalizer)\n        assert isinstance(BertNormalizer(), BertNormalizer)\n        assert isinstance(pickle.loads(pickle.dumps(BertNormalizer())), BertNormalizer)\n\n    def test_strip_accents(self):\n        normalizer = BertNormalizer(strip_accents=True, lowercase=False, handle_chinese_chars=False, clean_text=False)\n\n        output = normalizer.normalize_str(\"Héllò\")\n        assert output == \"Hello\"\n\n    def test_handle_chinese_chars(self):\n        normalizer = BertNormalizer(strip_accents=False, lowercase=False, handle_chinese_chars=True, clean_text=False)\n\n        output = normalizer.normalize_str(\"你好\")\n        assert output == \" 你  好 \"\n\n    def test_clean_text(self):\n        normalizer = BertNormalizer(strip_accents=False, lowercase=False, handle_chinese_chars=False, clean_text=True)\n\n        output = normalizer.normalize_str(\"\\ufeffHello\")\n        assert output == \"Hello\"\n\n    def test_lowercase(self):\n        normalizer = BertNormalizer(strip_accents=False, lowercase=True, handle_chinese_chars=False, clean_text=False)\n\n        output = normalizer.normalize_str(\"Héllò\")\n        assert output == \"héllò\"\n\n    def test_can_modify(self):\n        normalizer = BertNormalizer(clean_text=True, handle_chinese_chars=True, strip_accents=True, lowercase=True)\n\n        assert normalizer.clean_text == True\n        assert normalizer.handle_chinese_chars == True\n        assert normalizer.strip_accents == True\n        assert normalizer.lowercase == True\n\n        # Modify these\n        normalizer.clean_text = False\n        assert normalizer.clean_text == False\n        normalizer.handle_chinese_chars = False\n        assert normalizer.handle_chinese_chars == False\n        normalizer.strip_accents = None\n        assert normalizer.strip_accents == None\n        normalizer.lowercase = False\n        assert normalizer.lowercase == False\n\n\nclass TestSequence:\n    def test_instantiate(self):\n        assert isinstance(Sequence([]), Normalizer)\n        assert isinstance(Sequence([]), Sequence)\n        assert isinstance(pickle.loads(pickle.dumps(Sequence([]))), Sequence)\n\n    def test_can_make_sequences(self):\n        normalizer = Sequence([Lowercase(), Strip()])\n\n        output = normalizer.normalize_str(\"  HELLO  \")\n        assert output == \"hello\"\n\n    def test_set_item(self):\n        normalizers = Sequence(\n            [\n                BertNormalizer(True, True),\n                Prepend(prepend=\"test\"),\n            ]\n        )\n        assert normalizers[0].__class__ == BertNormalizer\n        assert normalizers[1].__class__ == Prepend\n        normalizers[1] = Strip()\n        assert normalizers[1].__class__ == Strip\n        with pytest.raises(IndexError):\n            print(normalizers[2])\n\n    def test_item_getters_and_setters(self):\n        normalizers = Sequence(\n            [\n                BertNormalizer(clean_text=True, handle_chinese_chars=True, strip_accents=True, lowercase=True),\n                Strip(left=True, right=True),\n                Prepend(prepend=\"_\"),\n                Replace(pattern=\"something\", content=\"else\"),\n            ]\n        )\n\n        assert normalizers[0].__class__ == BertNormalizer\n        normalizers[0].clean_text = False\n        normalizers[0].handle_chinese_chars = False\n        normalizers[0].strip_accents = False\n        normalizers[0].lowercase = False\n        assert not normalizers[0].clean_text\n        assert not normalizers[0].handle_chinese_chars\n        assert not normalizers[0].strip_accents\n        assert not normalizers[0].lowercase\n\n        assert normalizers[1].__class__ == Strip\n        normalizers[1].left = False\n        normalizers[1].right = False\n        assert not normalizers[1].left\n        assert not normalizers[1].right\n\n        assert normalizers[2].__class__ == Prepend\n        normalizers[2].prepend = \" \"\n        assert normalizers[2].prepend == \" \"\n\n        assert normalizers[3].__class__ == Replace\n        with pytest.raises(Exception):\n            normalizers[3].pattern = \"test\"\n        with pytest.raises(Exception):\n            print(normalizers[3].pattern)\n        normalizers[3].content = \"test\"\n        assert normalizers[3].content == \"test\"\n\n\nclass TestLowercase:\n    def test_instantiate(self):\n        assert isinstance(Lowercase(), Normalizer)\n        assert isinstance(Lowercase(), Lowercase)\n        assert isinstance(pickle.loads(pickle.dumps(Lowercase())), Lowercase)\n\n    def test_lowercase(self):\n        normalizer = Lowercase()\n\n        output = normalizer.normalize_str(\"HELLO\")\n        assert output == \"hello\"\n\n\nclass TestStrip:\n    def test_instantiate(self):\n        assert isinstance(Strip(), Normalizer)\n        assert isinstance(Strip(), Strip)\n        assert isinstance(pickle.loads(pickle.dumps(Strip())), Strip)\n\n    def test_left_strip(self):\n        normalizer = Strip(left=True, right=False)\n\n        output = normalizer.normalize_str(\"  hello  \")\n        assert output == \"hello  \"\n\n    def test_right_strip(self):\n        normalizer = Strip(left=False, right=True)\n\n        output = normalizer.normalize_str(\"  hello  \")\n        assert output == \"  hello\"\n\n    def test_full_strip(self):\n        normalizer = Strip(left=True, right=True)\n\n        output = normalizer.normalize_str(\"  hello  \")\n        assert output == \"hello\"\n\n    def test_can_modify(self):\n        normalizer = Strip(left=True, right=True)\n\n        assert normalizer.left == True\n        assert normalizer.right == True\n\n        # Modify these\n        normalizer.left = False\n        assert normalizer.left == False\n        normalizer.right = False\n        assert normalizer.right == False\n\n\nclass TestPrepend:\n    def test_instantiate(self):\n        assert isinstance(Prepend(\"▁\"), Normalizer)\n        assert isinstance(Prepend(\"▁\"), Prepend)\n        assert isinstance(pickle.loads(pickle.dumps(Prepend(\"▁\"))), Prepend)\n\n    def test_prepend(self):\n        normalizer = Prepend(prepend=\"▁\")\n\n        output = normalizer.normalize_str(\"hello\")\n        assert output == \"▁hello\"\n\n    def test_can_modify(self):\n        normalizer = Prepend(\"▁\")\n\n        assert normalizer.prepend == \"▁\"\n\n        # Modify these\n        normalizer.prepend = \"-\"\n        assert normalizer.prepend == \"-\"\n\n\nclass TestCustomNormalizer:\n    class BadCustomNormalizer:\n        def normalize(self, normalized, wrong):\n            pass\n\n    class GoodCustomNormalizer:\n        def normalize(self, normalized):\n            self.kept_normalized = normalized\n            normalized.replace(\"there\", \"you\")\n\n        def use_after_normalize(self):\n            self.kept_normalized.replace(\"something\", \"else\")\n\n    def test_instantiate(self):\n        bad = Normalizer.custom(TestCustomNormalizer.BadCustomNormalizer())\n        good_custom = TestCustomNormalizer.GoodCustomNormalizer()\n        good = Normalizer.custom(good_custom)\n\n        assert isinstance(bad, Normalizer)\n        assert isinstance(good, Normalizer)\n        with pytest.raises(Exception, match=\"TypeError:.*normalize()\"):\n            bad.normalize_str(\"Hey there!\")\n        assert good.normalize_str(\"Hey there!\") == \"Hey you!\"\n        with pytest.raises(Exception, match=\"Cannot use a NormalizedStringRefMut outside `normalize`\"):\n            good_custom.use_after_normalize()\n\n    def test_normalizer_interface(self):\n        normalizer = Normalizer.custom(TestCustomNormalizer.GoodCustomNormalizer())\n\n        normalized = NormalizedString(\"Hey there!\")\n        normalizer.normalize(normalized)\n\n        assert repr(normalized) == 'NormalizedString(original=\"Hey there!\", normalized=\"Hey you!\")'\n        assert str(normalized) == \"Hey you!\"\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_pre_tokenizers.py",
    "content": "import json\nimport pickle\n\nimport pytest\n\nfrom tokenizers.pre_tokenizers import (\n    BertPreTokenizer,\n    ByteLevel,\n    CharDelimiterSplit,\n    Digits,\n    FixedLength,\n    Metaspace,\n    PreTokenizer,\n    Punctuation,\n    Sequence,\n    Split,\n    UnicodeScripts,\n    Whitespace,\n    WhitespaceSplit,\n)\n\n\nclass TestByteLevel:\n    def test_instantiate(self):\n        assert ByteLevel() is not None\n        assert ByteLevel(add_prefix_space=True) is not None\n        assert ByteLevel(add_prefix_space=False) is not None\n        assert isinstance(ByteLevel(), PreTokenizer)\n        assert isinstance(ByteLevel(), ByteLevel)\n        assert isinstance(pickle.loads(pickle.dumps(ByteLevel())), ByteLevel)\n\n    def test_has_alphabet(self):\n        assert isinstance(ByteLevel.alphabet(), list)\n        assert len(ByteLevel.alphabet()) == 256\n\n    def test_can_modify(self):\n        pretok = ByteLevel(add_prefix_space=False)\n\n        assert pretok.add_prefix_space == False\n\n        # Modify these\n        pretok.add_prefix_space = True\n        assert pretok.add_prefix_space == True\n\n    def test_manual_reload(self):\n        byte_level = ByteLevel()\n        state = json.loads(byte_level.__getstate__())\n        reloaded = ByteLevel(**state)\n        assert isinstance(reloaded, ByteLevel)\n\n\nclass TestSplit:\n    def test_instantiate(self):\n        pre_tokenizer = Split(pattern=\" \", behavior=\"removed\")\n        assert pre_tokenizer is not None\n        assert isinstance(pre_tokenizer, PreTokenizer)\n        assert isinstance(pre_tokenizer, Split)\n        assert isinstance(pickle.loads(pickle.dumps(Split(\" \", \"removed\"))), Split)\n\n        # test with invert=True\n        pre_tokenizer_with_invert = Split(pattern=\" \", behavior=\"isolated\", invert=True)\n        assert pre_tokenizer_with_invert is not None\n        assert isinstance(pre_tokenizer_with_invert, PreTokenizer)\n        assert isinstance(pre_tokenizer_with_invert, Split)\n        assert isinstance(pickle.loads(pickle.dumps(Split(\" \", \"removed\", True))), Split)\n\n\nclass TestWhitespace:\n    def test_instantiate(self):\n        assert Whitespace() is not None\n        assert isinstance(Whitespace(), PreTokenizer)\n        assert isinstance(Whitespace(), Whitespace)\n        assert isinstance(pickle.loads(pickle.dumps(Whitespace())), Whitespace)\n\n\nclass TestWhitespaceSplit:\n    def test_instantiate(self):\n        assert WhitespaceSplit() is not None\n        assert isinstance(WhitespaceSplit(), PreTokenizer)\n        assert isinstance(WhitespaceSplit(), WhitespaceSplit)\n        assert isinstance(pickle.loads(pickle.dumps(WhitespaceSplit())), WhitespaceSplit)\n\n\nclass TestBertPreTokenizer:\n    def test_instantiate(self):\n        assert BertPreTokenizer() is not None\n        assert isinstance(BertPreTokenizer(), PreTokenizer)\n        assert isinstance(BertPreTokenizer(), BertPreTokenizer)\n        assert isinstance(pickle.loads(pickle.dumps(BertPreTokenizer())), BertPreTokenizer)\n\n\nclass TestMetaspace:\n    def test_instantiate(self):\n        assert Metaspace() is not None\n        assert Metaspace(replacement=\"-\") is not None\n        with pytest.raises(ValueError, match=\"expected a string of length 1\"):\n            Metaspace(replacement=\"\")\n        assert Metaspace(prepend_scheme=\"always\") is not None\n        assert isinstance(Metaspace(), PreTokenizer)\n        assert isinstance(Metaspace(), Metaspace)\n        assert isinstance(pickle.loads(pickle.dumps(Metaspace())), Metaspace)\n\n    def test_can_modify(self):\n        pretok = Metaspace(replacement=\"$\", prepend_scheme=\"never\")\n\n        assert pretok.replacement == \"$\"\n        assert pretok.prepend_scheme == \"never\"\n        assert pretok.split == True\n\n        # Modify these\n        pretok.replacement = \"%\"\n        assert pretok.replacement == \"%\"\n        pretok.prepend_scheme = \"first\"\n        assert pretok.prepend_scheme == \"first\"\n        pretok.split = True\n        assert pretok.split == True\n\n\nclass TestCharDelimiterSplit:\n    def test_instantiate(self):\n        assert CharDelimiterSplit(\"-\") is not None\n        with pytest.raises(ValueError, match=\"expected a string of length 1\"):\n            CharDelimiterSplit(\"\")\n        assert isinstance(CharDelimiterSplit(\" \"), PreTokenizer)\n        assert isinstance(CharDelimiterSplit(\" \"), CharDelimiterSplit)\n        assert isinstance(pickle.loads(pickle.dumps(CharDelimiterSplit(\"-\"))), CharDelimiterSplit)\n\n    def test_can_modify(self):\n        pretok = CharDelimiterSplit(\"@\")\n        assert pretok.delimiter == \"@\"\n\n        # Modify these\n        pretok.delimiter = \"!\"\n        assert pretok.delimiter == \"!\"\n\n\nclass TestPunctuation:\n    def test_instantiate(self):\n        assert Punctuation() is not None\n        assert Punctuation(\"removed\") is not None\n        assert isinstance(Punctuation(), PreTokenizer)\n        assert isinstance(Punctuation(), Punctuation)\n        assert isinstance(pickle.loads(pickle.dumps(Punctuation())), Punctuation)\n\n\nclass TestSequence:\n    def test_instantiate(self):\n        assert Sequence([]) is not None\n        assert isinstance(Sequence([]), PreTokenizer)\n        assert isinstance(Sequence([]), Sequence)\n        dumped = pickle.dumps(Sequence([]))\n        assert isinstance(pickle.loads(dumped), Sequence)\n\n    def test_bert_like(self):\n        pre_tokenizer = Sequence([WhitespaceSplit(), Punctuation()])\n        assert isinstance(Sequence([]), PreTokenizer)\n        assert isinstance(Sequence([]), Sequence)\n        assert isinstance(pickle.loads(pickle.dumps(pre_tokenizer)), Sequence)\n\n        result = pre_tokenizer.pre_tokenize_str(\"Hey friend!     How are you?!?\")\n        assert result == [\n            (\"Hey\", (0, 3)),\n            (\"friend\", (4, 10)),\n            (\"!\", (10, 11)),\n            (\"How\", (16, 19)),\n            (\"are\", (20, 23)),\n            (\"you\", (24, 27)),\n            (\"?\", (27, 28)),\n            (\"!\", (28, 29)),\n            (\"?\", (29, 30)),\n        ]\n\n    def test_set_item(self):\n        pre_tokenizers = Sequence(\n            [\n                ByteLevel(),\n                Split(pattern=\"/test/\", behavior=\"removed\"),\n            ]\n        )\n        assert pre_tokenizers[0].__class__ == ByteLevel\n        assert pre_tokenizers[1].__class__ == Split\n        pre_tokenizers[1] = Metaspace()\n        assert pre_tokenizers[1].__class__ == Metaspace\n        with pytest.raises(IndexError):\n            print(pre_tokenizers[2])\n\n    def test_item_getters_and_setters(self):\n        pre_tokenizers = Sequence(\n            [\n                ByteLevel(add_prefix_space=True, trim_offsets=True, use_regex=True),\n                Split(pattern=\"/test/\", behavior=\"removed\", invert=False),\n                Metaspace(\"a\", \"never\", split=False),\n                CharDelimiterSplit(delimiter=\" \"),\n                Punctuation(behavior=\"removed\"),\n                Digits(individual_digits=True),\n            ]\n        )\n\n        assert pre_tokenizers[0].__class__ == ByteLevel\n        pre_tokenizers[0].add_prefix_space = False\n        pre_tokenizers[0].trim_offsets = False\n        pre_tokenizers[0].use_regex = False\n        assert not pre_tokenizers[0].add_prefix_space\n        assert not pre_tokenizers[0].trim_offsets\n        assert not pre_tokenizers[0].use_regex\n\n        assert pre_tokenizers[1].__class__ == Split\n        with pytest.raises(Exception):\n            pre_tokenizers[1].pattern = \"/pattern/\"\n        pre_tokenizers[1].behavior = \"isolated\"\n        pre_tokenizers[1].invert = True\n        with pytest.raises(Exception):\n            pre_tokenizers[1].pattern\n        assert pre_tokenizers[1].behavior == \"isolated\"\n        assert pre_tokenizers[1].invert\n\n        assert pre_tokenizers[2].__class__ == Metaspace\n        pre_tokenizers[2].replacement = \" \"\n        pre_tokenizers[2].prepend_scheme = \"always\"\n        pre_tokenizers[2].split = True\n        assert pre_tokenizers[2].replacement == \" \"\n        assert pre_tokenizers[2].prepend_scheme == \"always\"\n        assert pre_tokenizers[2].split\n\n        assert pre_tokenizers[3].__class__ == CharDelimiterSplit\n        pre_tokenizers[3].delimiter = \"_\"\n        assert pre_tokenizers[3].delimiter == \"_\"\n\n        assert pre_tokenizers[4].__class__ == Punctuation\n        pre_tokenizers[4].behavior = \"isolated\"\n        assert pre_tokenizers[4].behavior == \"isolated\"\n\n        assert pre_tokenizers[5].__class__ == Digits\n        pre_tokenizers[5].individual_digits = False\n        assert not pre_tokenizers[5].individual_digits\n\n\nclass TestDigits:\n    def test_instantiate(self):\n        assert Digits() is not None\n        assert isinstance(Digits(), PreTokenizer)\n        assert isinstance(Digits(), Digits)\n        assert isinstance(Digits(True), Digits)\n        assert isinstance(Digits(False), Digits)\n        assert isinstance(pickle.loads(pickle.dumps(Digits())), Digits)\n\n    def test_can_modify(self):\n        pretok = Digits(individual_digits=False)\n        assert pretok.individual_digits == False\n\n        # Modify these\n        pretok.individual_digits = True\n        assert pretok.individual_digits == True\n\n\nclass TestFixedLength:\n    def test_instantiate(self):\n        assert FixedLength() is not None\n        assert isinstance(FixedLength(), PreTokenizer)\n        assert isinstance(FixedLength(), FixedLength)\n        assert isinstance(pickle.loads(pickle.dumps(FixedLength())), FixedLength)\n\n    def test_pre_tokenize_str(self):\n        pretok = FixedLength(length=5)\n        assert pretok.length == 5\n        assert pretok.pre_tokenize_str(\"ATCCTGGTACTG\") == [\n            (\"ATCCT\", (0, 5)),\n            (\"GGTAC\", (5, 10)),\n            (\"TG\", (10, 12)),\n        ]\n\n        pretok.length = 10\n        assert pretok.length == 10\n        assert pretok.pre_tokenize_str(\"ATCCTGGTACTG\") == [\n            (\"ATCCTGGTAC\", (0, 10)),\n            (\"TG\", (10, 12)),\n        ]\n\n\nclass TestUnicodeScripts:\n    def test_instantiate(self):\n        assert UnicodeScripts() is not None\n        assert isinstance(UnicodeScripts(), PreTokenizer)\n        assert isinstance(UnicodeScripts(), UnicodeScripts)\n        assert isinstance(pickle.loads(pickle.dumps(UnicodeScripts())), UnicodeScripts)\n\n\nclass TestCustomPreTokenizer:\n    class BadCustomPretok:\n        def pre_tokenize(self, pretok, wrong):\n            # This method does not have the right signature: it takes one too many arg\n            pass\n\n    class GoodCustomPretok:\n        def split(self, n, normalized):\n            #  Here we just test that we can return a List[NormalizedString], it\n            # does not really make sense to return twice the same otherwise\n            return [normalized, normalized]\n\n        def pre_tokenize(self, pretok):\n            pretok.split(self.split)\n\n    def test_instantiate(self):\n        bad = PreTokenizer.custom(TestCustomPreTokenizer.BadCustomPretok())\n        good = PreTokenizer.custom(TestCustomPreTokenizer.GoodCustomPretok())\n\n        assert isinstance(bad, PreTokenizer)\n        assert isinstance(good, PreTokenizer)\n        with pytest.raises(Exception, match=\"TypeError:.*pre_tokenize()\"):\n            bad.pre_tokenize_str(\"Hey there!\")\n        assert good.pre_tokenize_str(\"Hey there!\") == [\n            (\"Hey there!\", (0, 10)),\n            (\"Hey there!\", (0, 10)),\n        ]\n\n    def test_camel_case(self):\n        class CamelCasePretok:\n            def get_state(self, c):\n                if c.islower():\n                    return \"lower\"\n                elif c.isupper():\n                    return \"upper\"\n                elif c.isdigit():\n                    return \"digit\"\n                else:\n                    return \"rest\"\n\n            def split(self, n, normalized):\n                i = 0\n                # states = {\"any\", \"lower\", \"upper\", \"digit\", \"rest\"}\n                state = \"any\"\n                pieces = []\n                for j, c in enumerate(normalized.normalized):\n                    c_state = self.get_state(c)\n                    if state == \"any\":\n                        state = c_state\n                    if state != \"rest\" and state == c_state:\n                        pass\n                    elif state == \"upper\" and c_state == \"lower\":\n                        pass\n                    else:\n                        pieces.append(normalized[i:j])\n                        i = j\n                    state = c_state\n                pieces.append(normalized[i:])\n                return pieces\n\n            def pre_tokenize(self, pretok):\n                pretok.split(self.split)\n\n        camel = PreTokenizer.custom(CamelCasePretok())\n\n        assert camel.pre_tokenize_str(\"HeyThere!?-ThisIsLife\") == [\n            (\"Hey\", (0, 3)),\n            (\"There\", (3, 8)),\n            (\"!\", (8, 9)),\n            (\"?\", (9, 10)),\n            (\"-\", (10, 11)),\n            (\"This\", (11, 15)),\n            (\"Is\", (15, 17)),\n            (\"Life\", (17, 21)),\n        ]\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_processors.py",
    "content": "import json\nimport pickle\n\nimport pytest\n\nfrom tokenizers import Tokenizer\nfrom tokenizers.models import BPE\nfrom tokenizers.pre_tokenizers import ByteLevel as ByteLevelPreTokenizer\nfrom tokenizers.processors import (\n    BertProcessing,\n    ByteLevel,\n    PostProcessor,\n    RobertaProcessing,\n    Sequence,\n    TemplateProcessing,\n)\n\nfrom ..utils import data_dir, roberta_files\n\n\nclass TestBertProcessing:\n    def test_instantiate(self):\n        processor = BertProcessing((\"[SEP]\", 0), (\"[CLS]\", 1))\n        assert processor is not None\n        assert isinstance(processor, PostProcessor)\n        assert isinstance(processor, BertProcessing)\n        assert isinstance(\n            pickle.loads(pickle.dumps(BertProcessing((\"[SEP]\", 0), (\"[CLS]\", 1)))),\n            BertProcessing,\n        )\n\n    def test_processing(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_special_tokens([\"[SEP]\", \"[CLS]\"])\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n        tokenizer.post_processor = BertProcessing((\"[SEP]\", 0), (\"[CLS]\", 1))\n\n        output = tokenizer.encode(\"my name\", \"pair\")\n        assert output.tokens == [\"[CLS]\", \"my\", \"name\", \"[SEP]\", \"pair\", \"[SEP]\"]\n        assert output.ids == [1, 2, 3, 0, 6, 0]\n\n\nclass TestRobertaProcessing:\n    def test_instantiate(self):\n        processor = RobertaProcessing((\"</s>\", 1), (\"<s>\", 0))\n        assert processor is not None\n        assert isinstance(processor, PostProcessor)\n        assert isinstance(processor, RobertaProcessing)\n        assert isinstance(\n            pickle.loads(pickle.dumps(RobertaProcessing((\"</s>\", 1), (\"<s>\", 0)))),\n            RobertaProcessing,\n        )\n\n    def test_processing(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_special_tokens([\"<s>\", \"</s>\"])\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n        tokenizer.post_processor = RobertaProcessing((\"</s>\", 1), (\"<s>\", 0))\n\n        output = tokenizer.encode(\"my name\", \"pair\")\n        assert output.tokens == [\"<s>\", \"my\", \"name\", \"</s>\", \"</s>\", \"pair\", \"</s>\"]\n        assert output.ids == [0, 2, 3, 1, 1, 6, 1]\n\n\nclass TestByteLevelProcessing:\n    def test_instantiate(self):\n        assert ByteLevel() is not None\n        assert ByteLevel(trim_offsets=True) is not None\n        assert ByteLevel(add_prefix_space=True) is not None\n        assert isinstance(ByteLevel(), PostProcessor)\n        assert isinstance(ByteLevel(), ByteLevel)\n        assert isinstance(pickle.loads(pickle.dumps(ByteLevel())), ByteLevel)\n\n    def test_processing(self, roberta_files):\n        tokenizer = Tokenizer(BPE(roberta_files[\"vocab\"], roberta_files[\"merges\"]))\n        tokenizer.pre_tokenizer = ByteLevelPreTokenizer(add_prefix_space=True)\n\n        # Keeps original offsets\n        output = tokenizer.encode(\"My name is John\")\n        assert output.tokens == [\"ĠMy\", \"Ġname\", \"Ġis\", \"ĠJohn\"]\n        assert output.offsets == [(0, 2), (2, 7), (7, 10), (10, 15)]\n\n        # Trims offsets when activated\n        tokenizer.post_processor = ByteLevel(trim_offsets=True, add_prefix_space=True)\n        output = tokenizer.encode(\"My name is John\")\n        assert output.tokens == [\"ĠMy\", \"Ġname\", \"Ġis\", \"ĠJohn\"]\n        assert output.offsets == [(0, 2), (3, 7), (8, 10), (11, 15)]\n\n        # Trims offsets without adding prefix space at first token\n        tokenizer.post_processor = ByteLevel(trim_offsets=True, add_prefix_space=False)\n        output = tokenizer.encode(\"My name is John\")\n        assert output.tokens == [\"ĠMy\", \"Ġname\", \"Ġis\", \"ĠJohn\"]\n        assert output.offsets == [(1, 2), (3, 7), (8, 10), (11, 15)]\n\n        # add_prefix_space without trimming offsets has no effect\n        tokenizer.post_processor = ByteLevel(trim_offsets=False, add_prefix_space=True)\n        output = tokenizer.encode(\"My name is John\")\n        assert output.tokens == [\"ĠMy\", \"Ġname\", \"Ġis\", \"ĠJohn\"]\n        assert output.offsets == [(0, 2), (2, 7), (7, 10), (10, 15)]\n\n    def test_manual_reload(self):\n        byte_level = ByteLevel()\n        state = json.loads(byte_level.__getstate__())\n        reloaded = ByteLevel(**state)\n        assert isinstance(reloaded, ByteLevel)\n\n\nclass TestTemplateProcessing:\n    def get_bert(self):\n        return TemplateProcessing(\n            single=[\"[CLS]\", \"$0\", \"[SEP]\"],\n            pair=[\"[CLS]\", \"$A\", \"[SEP]\", \"$B:1\", \"[SEP]:1\"],\n            special_tokens=[(\"[CLS]\", 1), (\"[SEP]\", 0)],\n        )\n\n    def get_roberta(self):\n        return TemplateProcessing(\n            single=\"<s> $0 </s>\",\n            pair=\"<s> $A </s> </s> $B </s>\",\n            special_tokens=[(\"<s>\", 0), (\"</s>\", 1)],\n        )\n\n    def get_t5_squad(self):\n        # >>> from transformers import AutoTokenizer\n        # >>> tok = AutoTokenizer.from_pretrained(\"t5-small\")\n        # >>> tok.tokenize(\"question: \")\n        # ['▁question', ':']\n        # >>> tok.tokenize(\"context: \")\n        # ['▁context', ':']\n        # >>> tok.encode(\"context: \")\n        # [2625, 10]\n        # >>> tok.encode(\"question: \")\n        # [822, 10]\n\n        return TemplateProcessing(\n            single=[\"$0\"],\n            pair=[\"Q\", \"$A\", \"C\", \"$B\"],\n            special_tokens=[\n                {\n                    \"id\": \"Q\",\n                    \"ids\": [2625, 10],\n                    \"tokens\": [\"_question\", \":\"],\n                },\n                {\n                    \"id\": \"C\",\n                    \"ids\": [822, 10],\n                    \"tokens\": [\"_context\", \":\"],\n                },\n            ],\n        )\n\n    def test_instantiate(self):\n        bert = self.get_bert()\n        assert bert is not None\n        assert isinstance(bert, PostProcessor)\n        assert isinstance(bert, TemplateProcessing)\n        assert isinstance(pickle.loads(pickle.dumps(bert)), TemplateProcessing)\n\n        # It is absolutely legal to have tokens with spaces in the name:\n        TemplateProcessing(\n            single=[\"[ C L S ]\", \"Token with space\"],\n            special_tokens=[(\"[ C L S ]\", 0), (\"Token with space\", 1)],\n        )\n        # Sequence identifiers must be well formed:\n        with pytest.raises(Exception, match=\"Cannot build Piece\"):\n            TemplateProcessing(single=\"[CLS] $$ [SEP]\")\n        with pytest.raises(Exception, match=\"Cannot build Piece\"):\n            TemplateProcessing(single=\"[CLS] $A: [SEP]\")\n        # Special tokens must be provided when used in template:\n        with pytest.raises(Exception, match=\"Missing SpecialToken\\\\(s\\\\) with id\\\\(s\\\\)\"):\n            TemplateProcessing(single=[\"[CLS]\"])\n\n    def test_bert_parity(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_special_tokens([\"[SEP]\", \"[CLS]\"])\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n        tokenizer.post_processor = BertProcessing((\"[SEP]\", 0), (\"[CLS]\", 1))\n\n        original = tokenizer.encode(\"my name\", \"pair\")\n\n        tokenizer.post_processor = self.get_bert()\n        template = tokenizer.encode(\"my name\", \"pair\")\n        assert original.ids == template.ids\n\n    def test_roberta_parity(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_special_tokens([\"<s>\", \"</s>\"])\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n        tokenizer.post_processor = RobertaProcessing((\"</s>\", 1), (\"<s>\", 0))\n\n        original = tokenizer.encode(\"my name is john\", \"pair\")\n        tokenizer.post_processor = self.get_roberta()\n        template = tokenizer.encode(\"my name is john\", \"pair\")\n        assert original.ids == template.ids\n\n\nclass TestSequenceProcessing:\n    def test_sequence_processing(self):\n        assert Sequence([]) is not None\n        assert Sequence([ByteLevel()]) is not None\n        assert isinstance(Sequence([]), PostProcessor)\n        assert isinstance(Sequence([]), Sequence)\n        serialized = pickle.dumps(Sequence([]))\n        assert isinstance(pickle.loads(serialized), Sequence)\n\n    def test_post_process(self):\n        byte_level = ByteLevel(trim_offsets=True)\n        template = TemplateProcessing(\n            single=[\"[CLS]\", \"$0\", \"[SEP]\"],\n            pair=[\"[CLS]:0\", \"$A\", \"[SEP]:0\", \"$B:1\", \"[SEP]:1\"],\n            special_tokens=[(\"[CLS]\", 1), (\"[SEP]\", 0)],\n        )\n\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_special_tokens([\"[SEP]\", \"[CLS]\"])\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"Ġjohn\", \"pair\"])\n        tokenizer.post_processor = template\n\n        # Before the sequence\n        original = tokenizer.encode(\"my name is Ġjohn\")\n        assert original.ids == [1, 2, 3, 4, 5, 0]\n        assert original.type_ids == [0, 0, 0, 0, 0, 0]\n        assert original.offsets == [(0, 0), (0, 2), (3, 7), (8, 10), (11, 16), (0, 0)]\n        pair = tokenizer.encode(\"my name is Ġjohn\", \"pair\")\n        # assert pair.ids == [1, 2, 3, 4, 5, 0, 6, 0]\n        assert pair.type_ids == [0, 0, 0, 0, 0, 0, 1, 1]\n        assert pair.offsets == [(0, 0), (0, 2), (3, 7), (8, 10), (11, 16), (0, 0), (0, 4), (0, 0)]\n\n        processor = Sequence([byte_level, template])\n        tokenizer.post_processor = processor\n\n        original = tokenizer.encode(\"my name is Ġjohn\")\n        assert original.ids == [1, 2, 3, 4, 5, 0]\n        assert original.type_ids == [0, 0, 0, 0, 0, 0]\n        # Offsets ARE trimmed\n        assert original.offsets == [(0, 0), (0, 2), (3, 7), (8, 10), (12, 16), (0, 0)]\n        pair = tokenizer.encode(\"my name is Ġjohn\", \"pair\")\n        # assert pair.ids == [1, 2, 3, 4, 5, 0, 6, 0]\n        assert pair.type_ids == [0, 0, 0, 0, 0, 0, 1, 1]\n        assert pair.offsets == [(0, 0), (0, 2), (3, 7), (8, 10), (12, 16), (0, 0), (0, 4), (0, 0)]\n\n    def test_items(self):\n        processors = Sequence([RobertaProcessing((\"</s>\", 1), (\"<s>\", 0)), ByteLevel()])\n        assert processors[0].__class__ == RobertaProcessing\n        assert processors[1].__class__ == ByteLevel\n        processors[0] = ByteLevel(add_prefix_space=False, trim_offsets=False, use_regex=False)\n        print(processors[0])\n        processors[0].add_prefix_space = True\n        processors[0].trim_offsets = True\n        processors[0].use_regex = True\n        print(processors[0])\n        assert processors[0].__class__ == ByteLevel\n        assert processors[0].add_prefix_space\n        assert processors[0].trim_offsets\n        assert processors[0].use_regex\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_tokenizer.py",
    "content": "import pickle\nimport copy\nimport concurrent.futures\nimport pytest\nimport numpy as np\nimport asyncio\nfrom tokenizers import AddedToken, Encoding, Tokenizer\nfrom tokenizers.implementations import BertWordPieceTokenizer\nfrom tokenizers.models import BPE, Model, Unigram\nfrom tokenizers.pre_tokenizers import ByteLevel, Metaspace\nfrom tokenizers.processors import RobertaProcessing, TemplateProcessing\nfrom tokenizers.normalizers import Strip, Lowercase, Sequence\nfrom tokenizers.decoders import ByteFallback, DecodeStream, Metaspace as DecoderMetaspace\nimport time\n\nfrom ..utils import bert_files, data_dir, multiprocessing_with_parallelism, roberta_files\n\n\nclass TestAddedToken:\n    def test_instantiate_with_content_only(self):\n        added_token = AddedToken(\"<mask>\")\n        added_token.content = \"<MASK>\"\n        assert added_token.content == \"<MASK>\"\n        assert type(added_token) == AddedToken\n        added_token.content = added_token.content.lower()\n\n        assert added_token.special == False\n        added_token.special = True\n        assert added_token.special == True\n        added_token.special = False\n        assert str(added_token) == \"<mask>\"\n        assert (\n            repr(added_token)\n            == 'AddedToken(\"<mask>\", rstrip=False, lstrip=False, single_word=False, normalized=True, special=False)'\n        )\n        assert added_token.rstrip == False\n        assert added_token.lstrip == False\n        assert added_token.single_word == False\n        assert added_token.normalized == True\n        assert isinstance(pickle.loads(pickle.dumps(added_token)), AddedToken)\n\n    def test_can_set_rstrip(self):\n        added_token = AddedToken(\"<mask>\", rstrip=True)\n        assert added_token.rstrip == True\n        assert added_token.lstrip == False\n        assert added_token.single_word == False\n        assert added_token.normalized == True\n\n    def test_can_set_lstrip(self):\n        added_token = AddedToken(\"<mask>\", lstrip=True)\n        assert added_token.rstrip == False\n        assert added_token.lstrip == True\n        assert added_token.single_word == False\n        assert added_token.normalized == True\n\n    def test_can_set_single_world(self):\n        added_token = AddedToken(\"<mask>\", single_word=True)\n        assert added_token.rstrip == False\n        assert added_token.lstrip == False\n        assert added_token.single_word == True\n        assert added_token.normalized == True\n\n    def test_can_set_normalized(self):\n        added_token = AddedToken(\"<mask>\", normalized=False)\n        assert added_token.rstrip == False\n        assert added_token.lstrip == False\n        assert added_token.single_word == False\n        assert added_token.normalized == False\n\n\nclass TestTokenizer:\n    def test_has_expected_type_and_methods(self):\n        tokenizer = Tokenizer(BPE())\n        assert type(tokenizer) == Tokenizer\n        assert callable(tokenizer.num_special_tokens_to_add)\n        assert callable(tokenizer.get_vocab)\n        assert callable(tokenizer.get_vocab_size)\n        assert callable(tokenizer.enable_truncation)\n        assert callable(tokenizer.no_truncation)\n        assert callable(tokenizer.enable_padding)\n        assert callable(tokenizer.no_padding)\n        assert callable(tokenizer.encode)\n        assert callable(tokenizer.encode_batch)\n        assert callable(tokenizer.async_encode_batch)\n        assert callable(tokenizer.decode)\n        assert callable(tokenizer.decode_batch)\n        assert callable(tokenizer.async_decode_batch)\n        assert callable(tokenizer.token_to_id)\n        assert callable(tokenizer.id_to_token)\n        assert callable(tokenizer.add_tokens)\n        assert callable(tokenizer.add_special_tokens)\n        assert callable(tokenizer.train)\n        assert callable(tokenizer.post_process)\n        assert isinstance(tokenizer.model, Model)\n        assert tokenizer.normalizer is None\n        assert tokenizer.pre_tokenizer is None\n        assert tokenizer.post_processor is None\n        assert tokenizer.decoder is None\n        assert isinstance(pickle.loads(pickle.dumps(Tokenizer(BPE()))), Tokenizer)\n\n    def test_add_tokens(self):\n        tokenizer = Tokenizer(BPE())\n        added = tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\"])\n        assert added == 4\n\n        tokens = [AddedToken(\"the\"), AddedToken(\"quick\", normalized=False), AddedToken()]\n        assert tokens[0].normalized == True\n        added = tokenizer.add_tokens(tokens)\n        assert added == 2\n        assert tokens[0].normalized == True\n        assert tokens[1].normalized == False\n\n    def test_add_special_tokens(self):\n        tokenizer = Tokenizer(BPE())\n\n        # Can add special tokens as `str`\n        added = tokenizer.add_special_tokens([\"my\", \"name\", \"is\", \"john\"])\n        assert added == 4\n\n        # Can add special tokens as `AddedToken`\n        tokens = [AddedToken(\"the\"), AddedToken(\"quick\", normalized=True), AddedToken()]\n        assert tokens[0].normalized == True\n        added = tokenizer.add_special_tokens(tokens)\n        assert added == 2\n        assert tokens[0].normalized == False\n        assert tokens[1].normalized == True\n\n    def test_encode(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n\n        # Can encode single sequence\n        output = tokenizer.encode(\"my name is john\")\n        assert output.tokens == [\"my\", \"name\", \"is\", \"john\"]\n        assert type(output.ids) == list\n        assert type(output.type_ids) == list\n        assert type(output.offsets) == list\n        with pytest.warns(DeprecationWarning):\n            assert type(output.words) == list\n        assert type(output.word_ids) == list\n        assert type(output.special_tokens_mask) == list\n        assert type(output.attention_mask) == list\n        assert type(output.overflowing) == list\n\n        # Can encode a pair of sequences\n        output = tokenizer.encode(\"my name is john\", \"pair\")\n        assert output.tokens == [\"my\", \"name\", \"is\", \"john\", \"pair\"]\n        assert isinstance(pickle.loads(pickle.dumps(output)), Encoding)\n\n        # Can encode a single pre-tokenized sequence\n        output = tokenizer.encode([\"my\", \"name\", \"is\", \"john\"], is_pretokenized=True)\n        assert output.tokens == [\"my\", \"name\", \"is\", \"john\"]\n\n        # Can encode a batch with both a single sequence and a pair of sequences\n        output = tokenizer.encode_batch([\"my name is john\", (\"my name is john\", \"pair\")])\n        assert len(output) == 2\n\n    def test_encode_formats(self, bert_files):\n        tokenizer = BertWordPieceTokenizer(bert_files[\"vocab\"])\n\n        # Encode\n        output = tokenizer.encode(\"my name is john\")\n        assert output.tokens == [\"[CLS]\", \"my\", \"name\", \"is\", \"john\", \"[SEP]\"]\n        output = tokenizer.encode(\"my name is john\", \"pair\")\n        assert output.tokens == [\"[CLS]\", \"my\", \"name\", \"is\", \"john\", \"[SEP]\", \"pair\", \"[SEP]\"]\n        output = tokenizer.encode([\"my\", \"name\", \"is\", \"john\"], is_pretokenized=True)\n        assert output.tokens == [\"[CLS]\", \"my\", \"name\", \"is\", \"john\", \"[SEP]\"]\n        output = tokenizer.encode([\"my\", \"name\", \"is\", \"john\"], [\"pair\"], is_pretokenized=True)\n        assert output.tokens == [\"[CLS]\", \"my\", \"name\", \"is\", \"john\", \"[SEP]\", \"pair\", \"[SEP]\"]\n\n        # Encode batch\n        result_single = [\n            [\"[CLS]\", \"my\", \"name\", \"is\", \"john\", \"[SEP]\"],\n            [\"[CLS]\", \"my\", \"name\", \"is\", \"georges\", \"[SEP]\"],\n        ]\n        result_pair = [\n            [\"[CLS]\", \"my\", \"name\", \"is\", \"john\", \"[SEP]\", \"pair\", \"[SEP]\"],\n            [\"[CLS]\", \"my\", \"name\", \"is\", \"georges\", \"[SEP]\", \"pair\", \"[SEP]\"],\n        ]\n\n        def format(encodings):\n            return [e.tokens for e in encodings]\n\n        def test_single(input, is_pretokenized=False):\n            output = tokenizer.encode_batch(input, is_pretokenized=is_pretokenized)\n            assert format(output) == result_single\n\n        def test_pair(input, is_pretokenized=False):\n            output = tokenizer.encode_batch(input, is_pretokenized=is_pretokenized)\n            assert format(output) == result_pair\n\n        # Classic inputs\n\n        # Lists\n        test_single([\"My name is John\", \"My name is Georges\"])\n        test_pair([(\"my name is john\", \"pair\"), (\"my name is georges\", \"pair\")])\n        test_pair([[\"my name is john\", \"pair\"], [\"my name is georges\", \"pair\"]])\n\n        # Tuples\n        test_single((\"My name is John\", \"My name is Georges\"))\n        test_pair(((\"My name is John\", \"pair\"), (\"My name is Georges\", \"pair\")))\n\n        # Numpy\n        test_single(np.array([\"My name is John\", \"My name is Georges\"]))\n        test_pair(np.array([(\"My name is John\", \"pair\"), (\"My name is Georges\", \"pair\")]))\n        test_pair(np.array([[\"My name is John\", \"pair\"], [\"My name is Georges\", \"pair\"]]))\n\n        # PreTokenized inputs\n\n        # Lists\n        test_single([[\"My\", \"name\", \"is\", \"John\"], [\"My\", \"name\", \"is\", \"Georges\"]], True)\n        test_pair(\n            [\n                ([\"My\", \"name\", \"is\", \"John\"], [\"pair\"]),\n                ([\"My\", \"name\", \"is\", \"Georges\"], [\"pair\"]),\n            ],\n            True,\n        )\n        test_pair(\n            [\n                [[\"My\", \"name\", \"is\", \"John\"], [\"pair\"]],\n                [[\"My\", \"name\", \"is\", \"Georges\"], [\"pair\"]],\n            ],\n            True,\n        )\n\n        # Tuples\n        test_single(((\"My\", \"name\", \"is\", \"John\"), (\"My\", \"name\", \"is\", \"Georges\")), True)\n        test_pair(\n            (\n                ((\"My\", \"name\", \"is\", \"John\"), (\"pair\",)),\n                ((\"My\", \"name\", \"is\", \"Georges\"), (\"pair\",)),\n            ),\n            True,\n        )\n        test_pair(\n            (\n                ([\"My\", \"name\", \"is\", \"John\"], [\"pair\"]),\n                ([\"My\", \"name\", \"is\", \"Georges\"], [\"pair\"]),\n            ),\n            True,\n        )\n\n        # Numpy\n        test_single(\n            np.array([[\"My\", \"name\", \"is\", \"John\"], [\"My\", \"name\", \"is\", \"Georges\"]]),\n            True,\n        )\n        test_single(\n            np.array(((\"My\", \"name\", \"is\", \"John\"), (\"My\", \"name\", \"is\", \"Georges\"))),\n            True,\n        )\n        test_pair(\n            np.array(\n                [\n                    [[\"My\", \"name\", \"is\", \"John\"], [\"pair\"]],\n                    [[\"My\", \"name\", \"is\", \"Georges\"], [\"pair\"]],\n                ],\n                dtype=object,\n            ),\n            True,\n        )\n        test_pair(\n            np.array(\n                (\n                    ((\"My\", \"name\", \"is\", \"John\"), (\"pair\",)),\n                    ((\"My\", \"name\", \"is\", \"Georges\"), (\"pair\",)),\n                ),\n                dtype=object,\n            ),\n            True,\n        )\n\n        # Mal formed\n        with pytest.raises(TypeError, match=\"TextInputSequence must be str\"):\n            tokenizer.encode([[\"my\", \"name\"]])  # type: ignore[arg-type]\n        with pytest.raises(TypeError, match=\"TextInputSequence must be str\"):\n            tokenizer.encode(\"My name is john\", [[\"pair\"]])  # type: ignore[arg-type]\n        with pytest.raises(TypeError, match=\"TextInputSequence must be str\"):\n            tokenizer.encode(\"my name is john\", [\"pair\"])\n\n        with pytest.raises(TypeError, match=\"InputSequence must be Union[List[str]\"):\n            tokenizer.encode(\"My name is john\", is_pretokenized=True)\n        with pytest.raises(TypeError, match=\"InputSequence must be Union[List[str]\"):\n            tokenizer.encode(\"My name is john\", [\"pair\"], is_pretokenized=True)\n        with pytest.raises(TypeError, match=\"InputSequence must be Union[List[str]\"):\n            tokenizer.encode([\"My\", \"name\", \"is\", \"John\"], \"pair\", is_pretokenized=True)\n\n    def test_encode_add_special_tokens(self, roberta_files):\n        tokenizer = Tokenizer(BPE(roberta_files[\"vocab\"], roberta_files[\"merges\"]))\n        tokenizer.add_special_tokens([\"<s>\", \"</s>\"])\n\n        tokenizer.pre_tokenizer = ByteLevel(add_prefix_space=True)\n        tokenizer.post_processor = RobertaProcessing(\n            (\"</s>\", tokenizer.token_to_id(\"</s>\")),\n            (\"<s>\", tokenizer.token_to_id(\"<s>\")),\n        )\n\n        # Can encode with special tokens\n        output_with_specials = tokenizer.encode(\"My name is John\", add_special_tokens=True)\n        assert output_with_specials.tokens == [\"<s>\", \"ĠMy\", \"Ġname\", \"Ġis\", \"ĠJohn\", \"</s>\"]\n\n        # Can encode without special tokens\n        output_without_specials = tokenizer.encode(\"My name is John\", add_special_tokens=False)\n        assert output_without_specials.tokens == [\"ĠMy\", \"Ġname\", \"Ġis\", \"ĠJohn\"]\n\n    def test_truncation(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n        tokenizer.enable_truncation(2)\n\n        # Can truncate single sequences\n        output = tokenizer.encode(\"my name is john\")\n        assert output.tokens == [\"my\", \"name\"]\n\n        # Can truncate pair sequences as well\n        output = tokenizer.encode(\"my name is john\", \"pair\")\n        assert output.tokens == [\"my\", \"pair\"]\n\n        # Can get the params and give them to enable_truncation\n        trunc = tokenizer.truncation\n        tokenizer.enable_truncation(**trunc)\n\n        # Left truncation direction\n        tokenizer.enable_truncation(2, direction=\"left\")\n        output = tokenizer.encode(\"my name is john\")\n        assert output.tokens == [\"is\", \"john\"]\n\n        output = tokenizer.encode(\"my name is john\", \"pair\")\n        assert output.tokens == [\"john\", \"pair\"]\n\n    def test_padding(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n\n        # By default it does nothing when encoding single sequence\n        tokenizer.enable_padding()\n        output = tokenizer.encode(\"my name\")\n        assert output.tokens == [\"my\", \"name\"]\n\n        # Can pad to the longest in a batch\n        output = tokenizer.encode_batch([\"my name\", \"my name is john\"])\n        assert all([len(encoding) == 4 for encoding in output])\n\n        # Can pad to the specified length otherwise\n        tokenizer.enable_padding(length=4)\n        output = tokenizer.encode(\"my name\")\n        assert output.tokens == [\"my\", \"name\", \"[PAD]\", \"[PAD]\"]\n        output = tokenizer.encode(\"my name\", \"pair\")\n        assert output.tokens == [\"my\", \"name\", \"pair\", \"[PAD]\"]\n\n        # Can get the params and give them to enable_padding\n        padding = tokenizer.padding\n        tokenizer.enable_padding(**padding)\n\n    def test_decode(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n\n        # Can decode single sequences\n        output = tokenizer.decode([0, 1, 2, 3])\n        assert output == \"my name is john\"\n\n        # Can decode batch\n        output = tokenizer.decode_batch([[0, 1, 2, 3], [4]])\n        assert output == [\"my name is john\", \"pair\"]\n\n        # Can decode stream\n        stream = DecodeStream(skip_special_tokens=False)\n        assert stream.step(tokenizer, 0) == \"my\"\n        assert stream.step(tokenizer, 1) == \" name\"\n        assert stream.step(tokenizer, 2) == \" is\"\n        assert stream.step(tokenizer, 3) == \" john\"\n\n        stream = DecodeStream(ids=[0, 1, 2])\n        assert stream.step(tokenizer, 3) == \" john\"\n\n    def test_decode_stream_copy_and_prefix_ids(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\"])\n        token_ids = [0, 1, 2, 3]\n\n        stream = DecodeStream(skip_special_tokens=False)\n        assert stream.step(tokenizer, token_ids[0]) == \"my\"\n        assert stream.step(tokenizer, token_ids[1]) == \" name\"\n        stream_copy = copy.copy(stream)\n        assert stream.step(tokenizer, token_ids[2]) == \" is\"\n        assert stream_copy.step(tokenizer, token_ids[2]) == \" is\"\n        assert stream.step(tokenizer, token_ids[3]) == \" john\"\n        assert stream_copy.step(tokenizer, token_ids[3]) == \" john\"\n\n        stream_steps = DecodeStream([])\n        last_chunk = None\n        for tid in token_ids:\n            last_chunk = stream_steps.step(tokenizer, tid)\n        stream_prefill = DecodeStream(token_ids[:-1])\n        assert stream_prefill.step(tokenizer, token_ids[-1]) == last_chunk\n\n    def test_decode_stream_fallback(self):\n        tokenizer = Tokenizer.from_pretrained(\"gpt2\")\n        # tokenizer.decode([255]) fails because its a fallback\n        # tokenizer.encode(\"อั\").ids = [19567, 255, 19567, 109]\n        stream = DecodeStream()\n        stream.step(tokenizer, [19567])\n        stream.step(tokenizer, [255])\n        stream.step(tokenizer, [19567])\n        out = stream.step(tokenizer, [109])\n        assert out == \"ั\"\n\n        stream = DecodeStream()\n        out = stream.step(tokenizer, [19567, 255, 19567, 109])\n        assert out == \"อั\"\n        stream = DecodeStream()\n        stream.step(tokenizer, [19567])\n        out = stream.step(tokenizer, [255, 19567, 109])\n        assert out == \"อั\"\n\n        stream = DecodeStream()\n        stream.step(tokenizer, [19567])\n        first_out = stream.step(tokenizer, [255])\n        assert first_out == \"อ\"\n        # since we emitted the 'อ', we can't produce 'อั'\n        out = stream.step(tokenizer, [19567, 109])\n        assert out == \"ั\"\n\n        stream = DecodeStream([19567, 255, 19567])\n        # the stream's prefix is 'อ�' which is invalid, thus all ids are kept for the next step\n        out = stream.step(tokenizer, [109])\n        assert out == \"อั\"\n\n    def test_decode_skip_special_tokens(self):\n        tokenizer = Tokenizer.from_pretrained(\"hf-internal-testing/Llama-3.1-8B-Instruct\")\n\n        stream = DecodeStream([40])\n        out = stream.step(tokenizer, [2846, 40, 40, 40])\n        assert out == \"'mIII\"\n\n        stream = DecodeStream(\n            [\n                128000,\n                128006,\n                9125,\n                128007,\n                271,\n                38766,\n                1303,\n                33025,\n                2696,\n                25,\n                6790,\n                220,\n                2366,\n                18,\n                198,\n                15724,\n                2696,\n                25,\n                220,\n                1627,\n                10263,\n                220,\n                2366,\n                19,\n                271,\n                9514,\n                527,\n                264,\n                11190,\n                18328,\n                13,\n                128009,\n                128006,\n                882,\n                128007,\n                271,\n                15339,\n                11,\n                1268,\n                527,\n                499,\n                30,\n                128009,\n                128006,\n                78191,\n                128007,\n                271,\n            ]\n        )\n        out = stream.step(tokenizer, 40)\n        assert out == \"I\"\n\n        stream = DecodeStream([40])\n        out = stream.step(tokenizer, 2846)\n        assert out == \"'m\"\n\n        stream = DecodeStream([40])\n        out = stream.step(tokenizer, [2846, 40, 40, 40])\n        assert out == \"'mIII\"\n\n    def test_decode_stream(self):\n        vocab = [\n            (\"<unk>\", 0.0),\n            (\"<0x20>\", -0.1),\n            (\"<0xC3>\", -0.2),\n            (\"<0xA9>\", -0.3),\n        ]\n        tokenizer = Tokenizer(Unigram(vocab, 0, byte_fallback=True))\n        tokenizer.decoder = ByteFallback()\n        stream = DecodeStream(skip_special_tokens=False)\n        assert stream.step(tokenizer, 1) == \" \"\n        assert stream.step(tokenizer, 2) == None\n        assert stream.step(tokenizer, 3) == \"é\"\n\n        vocab = [\n            (\"<unk>\", 0.0),\n            (\"▁This\", -0.1),\n        ]\n        tokenizer = Tokenizer(Unigram(vocab, 0, byte_fallback=False))\n        tokenizer.decoder = DecoderMetaspace()\n        stream = DecodeStream(skip_special_tokens=False)\n        assert stream.step(tokenizer, 1) == \"This\"\n        assert stream.step(tokenizer, 1) == \" This\"\n\n    def test_get_vocab(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n\n        # Can retrieve vocab with added tokens\n        vocab = tokenizer.get_vocab(with_added_tokens=True)\n        assert vocab == {\"is\": 2, \"john\": 3, \"my\": 0, \"name\": 1, \"pair\": 4}\n\n        # Can retrieve vocab without added tokens\n        vocab = tokenizer.get_vocab(with_added_tokens=False)\n        assert vocab == {}\n\n        # Can retrieve added token decoder\n        vocab = tokenizer.get_added_tokens_decoder()\n        assert vocab == {\n            0: AddedToken(\"my\", rstrip=False, lstrip=False, single_word=False, normalized=True, special=False),\n            1: AddedToken(\"name\", rstrip=False, lstrip=False, single_word=False, normalized=True, special=False),\n            2: AddedToken(\"is\", rstrip=False, lstrip=False, single_word=False, normalized=True, special=False),\n            3: AddedToken(\"john\", rstrip=False, lstrip=False, single_word=False, normalized=True, special=False),\n            4: AddedToken(\"pair\", rstrip=False, lstrip=False, single_word=False, normalized=True, special=False),\n        }\n\n    def test_get_vocab_size(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n\n        # Can retrieve vocab's size with added tokens\n        size = tokenizer.get_vocab_size(with_added_tokens=True)\n        assert size == 5\n\n        # Can retrieve vocab's size without added tokens\n        size = tokenizer.get_vocab_size(with_added_tokens=False)\n        assert size == 0\n\n    def test_post_process(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n        tokenizer.enable_truncation(2)\n        tokenizer.enable_padding(length=4)\n\n        encoding = tokenizer.encode(\"my name is john\")\n        pair_encoding = tokenizer.encode(\"pair\")\n\n        # Can post process a single encoding\n        output = tokenizer.post_process(encoding)\n        assert output.tokens == [\"my\", \"name\", \"[PAD]\", \"[PAD]\"]\n\n        # Can post process a pair of encodings\n        output = tokenizer.post_process(encoding, pair_encoding)\n        assert output.tokens == [\"my\", \"pair\", \"[PAD]\", \"[PAD]\"]\n\n    def test_multiprocessing_with_parallelism(self):\n        tokenizer = Tokenizer(BPE())\n        multiprocessing_with_parallelism(tokenizer, False)\n        multiprocessing_with_parallelism(tokenizer, True)\n\n    def test_multithreaded_concurrency(self):\n        # Create a single shared tokenizer instance (thread-safe)\n        shared_tokenizer = Tokenizer(BPE())\n\n        # Thread worker functions that use the SAME tokenizer instance\n        def encode_batch(batch):\n            return shared_tokenizer.encode_batch(batch)\n\n        def encode_batch_fast(batch):\n            return shared_tokenizer.encode_batch_fast(batch)\n\n        # Create some significant workload\n        batches = [\n            [\"my name is john \" * 50] * 20,\n            [\"my name is paul \" * 50] * 20,\n            [\"my name is ringo \" * 50] * 20,\n        ]\n\n        # Many encoding operations to run concurrently using the same tokenizer\n        tasks = [\n            (encode_batch, batches[0]),\n            (encode_batch_fast, batches[1]),\n            (encode_batch, batches[2]),\n        ] * 10\n\n        executor = concurrent.futures.ThreadPoolExecutor(max_workers=4)\n\n        futures = []\n        for function, argument in tasks:\n            futures.append(executor.submit(function, argument))\n\n        # All tasks should complete successfully\n        results = [f.result() for f in futures]\n\n        # Verify results\n        assert len(results) == 30\n        assert all(len(result) == 20 for result in results)\n\n    def test_from_pretrained(self):\n        tokenizer = Tokenizer.from_pretrained(\"bert-base-cased\")\n        output = tokenizer.encode(\"Hey there dear friend!\", add_special_tokens=False)\n        assert output.tokens == [\"Hey\", \"there\", \"dear\", \"friend\", \"!\"]\n\n    def test_from_pretrained_revision(self):\n        tokenizer = Tokenizer.from_pretrained(\"anthony/tokenizers-test\")\n        output = tokenizer.encode(\"Hey there dear friend!\", add_special_tokens=False)\n        assert output.tokens == [\"hey\", \"there\", \"dear\", \"friend\", \"!\"]\n\n        tokenizer = Tokenizer.from_pretrained(\"anthony/tokenizers-test\", revision=\"gpt-2\")\n        output = tokenizer.encode(\"Hey there dear friend!\", add_special_tokens=False)\n        assert output.tokens == [\"Hey\", \"Ġthere\", \"Ġdear\", \"Ġfriend\", \"!\"]\n\n    def test_unigram_byte_fallback(self):\n        vocab = [\n            (\"<unk>\", 0.0),\n            (\"A\", -0.03),\n            (\"sen\", -0.02),\n            (\"te\", -0.03),\n            (\"n\", -0.04),\n            (\"ce\", -0.05),\n            (\"<0xF0>\", -0.06),\n            (\"<0x9F>\", -0.06),\n            (\"<0xA4>\", -0.06),\n            (\"<0x97>\", -0.06),\n            (\" \", -0.4),\n        ]\n        tokenizer = tokenizer = Tokenizer(Unigram(vocab, 0, byte_fallback=False))\n\n        output = tokenizer.encode(\"A sentence 🤗\")\n        assert output.ids == [1, 10, 2, 3, 4, 5, 10, 0]\n        assert output.tokens == [\"A\", \" \", \"sen\", \"te\", \"n\", \"ce\", \" \", \"🤗\"]\n\n        tokenizer = Tokenizer(Unigram(vocab, 0, byte_fallback=True))\n\n        output = tokenizer.encode(\"A sentence 🤗\")\n        assert output.ids == [1, 10, 2, 3, 4, 5, 10, 6, 7, 8, 9]\n        assert output.tokens == [\"A\", \" \", \"sen\", \"te\", \"n\", \"ce\", \" \", \"<0xF0>\", \"<0x9F>\", \"<0xA4>\", \"<0x97>\"]\n\n    def test_encode_special_tokens(self):\n        tokenizer = Tokenizer.from_pretrained(\"t5-base\")\n        tokenizer.add_tokens([\"<eot>\"])\n        tokenizer.add_special_tokens([\"<end_of_text>\"])\n        output = tokenizer.encode(\"Hey there<end_of_text> dear<eot>friend!\", add_special_tokens=False)\n        assert output.tokens == [\"▁Hey\", \"▁there\", \"<end_of_text>\", \"▁dear\", \"<eot>\", \"▁friend\", \"!\"]\n\n        tokenizer.encode_special_tokens = True\n        assert tokenizer.encode_special_tokens == True\n\n        output = tokenizer.encode(\"Hey there<end_of_text> dear<eot>friend!\", add_special_tokens=False)\n        assert output.tokens == [\n            \"▁Hey\",\n            \"▁there\",\n            \"<\",\n            \"end\",\n            \"_\",\n            \"of\",\n            \"_\",\n            \"text\",\n            \">\",\n            \"▁dear\",\n            \"<eot>\",\n            \"▁friend\",\n            \"!\",\n        ]\n\n        tokenizer.add_tokens([\"of_text>\"])\n        output = tokenizer.encode(\"Hey there<end_of_text> dear<eot>friend!\", add_special_tokens=False)\n        assert output.tokens == [\"▁Hey\", \"▁there\", \"<\", \"end\", \"_\", \"of_text>\", \"▁dear\", \"<eot>\", \"▁friend\", \"!\"]\n\n    def test_splitting(self):\n        tokenizer = Tokenizer.from_pretrained(\"hf-internal-testing/llama-new-metaspace\")\n        tokenizer.pre_tokenizer.split = False\n        tokenizer.add_tokens([AddedToken(\"<REPR_END>\", rstrip=True, lstrip=True)])\n        assert tokenizer.encode(\"<REPR_END>inform<s>. Hey.       .\", add_special_tokens=False).tokens == [\n            \"<REPR_END>\",\n            \"in\",\n            \"form\",\n            \"<s>\",\n            \".\",\n            \"▁Hey\",\n            \".\",\n            \"▁▁▁▁▁▁\",\n            \"▁.\",\n        ]\n\n        assert tokenizer.encode(\"<REPR_END>inform<s>. Hey.       .\", add_special_tokens=False).ids == [\n            32000,\n            262,\n            689,\n            1,\n            29889,\n            18637,\n            29889,\n            539,\n            869,\n        ]\n\n        assert tokenizer.encode(\"inform<s>. Hey.       .\").tokens == [\n            \"<s>\",\n            \"▁inform\",\n            \"<s>\",\n            \".\",\n            \"▁Hey\",\n            \".\",\n            \"▁▁▁▁▁▁\",\n            \"▁.\",\n        ]\n        assert tokenizer.encode(\"inform<s>. Hey.       .\", add_special_tokens=False).tokens == [\n            \"▁inform\",\n            \"<s>\",\n            \".\",\n            \"▁Hey\",\n            \".\",\n            \"▁▁▁▁▁▁\",\n            \"▁.\",\n        ]\n\n    def test_decode_special(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([AddedToken(\"my\", special=True), AddedToken(\"name\", special=False), \"is\", \"john\", \"pair\"])\n\n        # Can decode single sequences\n        output = tokenizer.decode([0, 1, 2, 3], skip_special_tokens=False)\n        assert output == \"my name is john\"\n\n        output = tokenizer.decode([0, 1, 2, 3], skip_special_tokens=True)\n        assert output == \"name is john\"\n        assert tokenizer.get_added_tokens_decoder()[0] == AddedToken(\"my\", special=True)\n\n    def test_setting_to_none(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.normalizer = Strip()\n        tokenizer.normalizer = None\n        assert tokenizer.normalizer == None\n\n        tokenizer.pre_tokenizer = Metaspace()\n        tokenizer.pre_tokenizer = None\n        assert tokenizer.pre_tokenizer == None\n\n\nclass TestTokenizerRepr:\n    def test_repr(self):\n        tokenizer = Tokenizer(BPE())\n        out = repr(tokenizer)\n        assert (\n            out\n            == 'Tokenizer(version=\"1.0\", truncation=None, padding=None, added_tokens=[], normalizer=None, pre_tokenizer=None, post_processor=None, decoder=None, model=BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[]))'\n        )\n\n    def test_repr_complete(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.pre_tokenizer = ByteLevel(add_prefix_space=True)\n        tokenizer.post_processor = TemplateProcessing(\n            single=[\"[CLS]\", \"$0\", \"[SEP]\"],\n            pair=[\"[CLS]:0\", \"$A\", \"[SEP]:0\", \"$B:1\", \"[SEP]:1\"],\n            special_tokens=[(\"[CLS]\", 1), (\"[SEP]\", 0)],\n        )\n        tokenizer.normalizer = Sequence([Lowercase(), Strip()])\n        out = repr(tokenizer)\n        assert (\n            out\n            == 'Tokenizer(version=\"1.0\", truncation=None, padding=None, added_tokens=[], normalizer=Sequence(normalizers=[Lowercase(), Strip(strip_left=True, strip_right=True)]), pre_tokenizer=ByteLevel(add_prefix_space=True, trim_offsets=True, use_regex=True), post_processor=TemplateProcessing(single=[SpecialToken(id=\"[CLS]\", type_id=0), Sequence(id=A, type_id=0), SpecialToken(id=\"[SEP]\", type_id=0)], pair=[SpecialToken(id=\"[CLS]\", type_id=0), Sequence(id=A, type_id=0), SpecialToken(id=\"[SEP]\", type_id=0), Sequence(id=B, type_id=1), SpecialToken(id=\"[SEP]\", type_id=1)], special_tokens={\"[CLS]\":SpecialToken(id=\"[CLS]\", ids=[1], tokens=[\"[CLS]\"]), \"[SEP]\":SpecialToken(id=\"[SEP]\", ids=[0], tokens=[\"[SEP]\"])}), decoder=None, model=BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[]))'\n        )\n\n\nclass TestAsyncTokenizer:\n    \"\"\"Tests for async methods of the Tokenizer class.\"\"\"\n\n    def setup_method(self):\n        \"\"\"Setup a basic tokenizer before each test.\"\"\"\n        self.tokenizer = Tokenizer.from_pretrained(\"hf-internal-testing/gpt-oss-20b\")\n\n    async def _compare_sync_async(self, input_data, is_pretokenized=False, add_special_tokens=True):\n        \"\"\"Helper to compare sync and async results for both normal and fast encoding.\"\"\"\n        # Normal encoding\n        sync_result = self.tokenizer.encode_batch(input_data, is_pretokenized, add_special_tokens)\n        async_result = await self.tokenizer.async_encode_batch(input_data, is_pretokenized, add_special_tokens)\n\n        assert len(sync_result) == len(async_result)\n        for s, a in zip(sync_result, async_result):\n            assert s.tokens == a.tokens\n            assert s.ids == a.ids\n            assert s.offsets == a.offsets\n            assert s.attention_mask == a.attention_mask\n            assert s.special_tokens_mask == a.special_tokens_mask\n            assert s.type_ids == a.type_ids\n\n        # Fast encoding\n        sync_fast_result = self.tokenizer.encode_batch_fast(input_data, is_pretokenized, add_special_tokens)\n        async_fast_result = await self.tokenizer.async_encode_batch_fast(\n            input_data, is_pretokenized, add_special_tokens\n        )\n\n        assert len(sync_fast_result) == len(async_fast_result)\n        for s, a in zip(sync_fast_result, async_fast_result):\n            assert s.tokens == a.tokens\n            assert s.ids == a.ids\n            assert s.attention_mask == a.attention_mask\n            assert s.special_tokens_mask == a.special_tokens_mask\n            assert s.type_ids == a.type_ids\n\n    @pytest.mark.asyncio\n    async def test_basic_encoding(self):\n        \"\"\"Test basic encoding functionality.\"\"\"\n        # Single sequences\n        await self._compare_sync_async([\"my name is john\", \"my pair\"])\n\n        # Pair sequences\n        await self._compare_sync_async([(\"my name\", \"is john\"), (\"my\", \"pair\")])\n\n        # Empty batch\n        await self._compare_sync_async([])\n\n    @pytest.mark.asyncio\n    async def test_encode(self):\n        out = await self.tokenizer.async_encode(\"my name is john\", \"my pair\")\n        no_async_out = self.tokenizer.encode(\"my name is john\", \"my pair\")\n        assert out.ids == no_async_out.ids\n\n        out = await self.tokenizer.async_encode(\"my name is john\")\n        no_async_out = self.tokenizer.encode(\"my name is john\")\n        assert out.ids == no_async_out.ids\n\n    @pytest.mark.asyncio\n    async def test_with_special_tokens(self):\n        \"\"\"Test with special tokens handling.\"\"\"\n        self.tokenizer.add_special_tokens([\"[CLS]\", \"[SEP]\"])\n        self.tokenizer.post_processor = TemplateProcessing(\n            single=[\"[CLS]\", \"$0\", \"[SEP]\"],\n            pair=[\"[CLS]\", \"$A\", \"[SEP]\", \"$B\", \"[SEP]\"],\n            special_tokens=[\n                (\"[CLS]\", self.tokenizer.token_to_id(\"[CLS]\")),\n                (\"[SEP]\", self.tokenizer.token_to_id(\"[SEP]\")),\n            ],\n        )\n\n        # With special tokens\n        await self._compare_sync_async([\"my name is john\", \"my pair\"], add_special_tokens=True)\n\n        # Without special tokens\n        await self._compare_sync_async([\"my name is john\", \"my pair\"], add_special_tokens=False)\n\n    @pytest.mark.asyncio\n    async def test_with_truncation_padding(self):\n        \"\"\"Test with truncation and padding enabled.\"\"\"\n        self.tokenizer.enable_truncation(2)\n        self.tokenizer.enable_padding(length=4)\n\n        # Single sequences\n        await self._compare_sync_async([\"my name is john\", \"pair longer\"])\n\n        # Pair sequences\n        await self._compare_sync_async([(\"my name\", \"is john\"), (\"pair\", \"longer\")])\n\n    @pytest.mark.asyncio\n    async def test_various_input_formats(self):\n        \"\"\"Test with various input formats.\"\"\"\n        # Lists\n        await self._compare_sync_async([\"my name\", \"is john\"])\n\n        # Tuples\n        await self._compare_sync_async((\"my name\", \"is john\"))\n\n        # Numpy arrays\n        # await self._compare_sync_async(np.array([\"my name\", \"is john\"]))\n\n        # Mixed pairs\n        await self._compare_sync_async([(\"my name\", \"is john\"), [\"my\", \"pair\"]])\n\n    @pytest.mark.asyncio\n    async def test_error_handling(self):\n        \"\"\"Test that errors are handled consistently.\"\"\"\n        # Invalid input type for single item\n        with pytest.raises(TypeError):\n            await self.tokenizer.async_encode_batch(123)\n\n        with pytest.raises(TypeError):\n            self.tokenizer.encode_batch(123)\n\n        # Invalid pre-tokenized input\n        with pytest.raises(TypeError):\n            await self.tokenizer.async_encode_batch(\"my name\", is_pretokenized=True)\n\n        with pytest.raises(TypeError):\n            self.tokenizer.encode_batch(\"my name\", is_pretokenized=True)\n\n    @pytest.mark.asyncio\n    async def test_concurrency(self):\n        \"\"\"Test concurrent encoding operations.\"\"\"\n        # Create some significant workload\n        large_batch = [\"my name is john \" * 50] * 20\n\n        # Run multiple encoding operations concurrently\n        tasks = [\n            self.tokenizer.async_encode_batch(large_batch),\n            self.tokenizer.async_encode_batch_fast(large_batch),\n            self.tokenizer.async_encode_batch(large_batch),\n        ]\n\n        # They should all complete successfully\n        results = await asyncio.gather(*tasks)\n\n        # Verify results\n        assert len(results) == 3\n        assert all(len(result) == 20 for result in results)\n\n    @pytest.mark.asyncio\n    async def test_decode(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\", \"name\", \"is\", \"john\", \"pair\"])\n\n        # Can decode single sequences\n        output = tokenizer.decode([0, 1, 2, 3])\n        assert output == \"my name is john\"\n\n        output = tokenizer.decode_batch([[0, 1, 2, 3], [4]])\n        assert output == [\"my name is john\", \"pair\"]\n\n        output = await tokenizer.async_decode_batch([[0, 1, 2, 3], [4]])\n        assert output == [\"my name is john\", \"pair\"]\n\n    @pytest.mark.asyncio\n    async def test_large_batch(self):\n        \"\"\"Test encoding a large batch of sequences.\"\"\"\n        large_batch = [\"my name is john\"] * 1000\n\n        # Encode large batch both ways\n        async_result = await self.tokenizer.async_encode_batch_fast(large_batch)\n        sync_result = self.tokenizer.encode_batch_fast(large_batch)\n\n        # Results should be identical\n        assert len(async_result) == len(sync_result)\n        assert all(a.tokens == s.tokens for a, s in zip(async_result[:10], sync_result[:10]))\n\n    @pytest.mark.asyncio\n    async def test_numpy_inputs(self):\n        \"\"\"Test with numpy array inputs.\"\"\"\n        # Single numpy array\n        input_array = np.array([\"my name\", \"is john\", \"pair longer\"])\n        await self._compare_sync_async(input_array)\n\n        # Pre-tokenized numpy array\n        pretok_array = np.array([[\"my\", \"name\"], [\"is\", \"john\"]], dtype=object)\n        await self._compare_sync_async(pretok_array, is_pretokenized=True)\n\n    def test_async_methods_existence(self):\n        \"\"\"Test that the async methods exist on the Tokenizer class.\"\"\"\n        assert hasattr(self.tokenizer, \"async_encode_batch\")\n        assert hasattr(self.tokenizer, \"async_encode_batch_fast\")\n        assert callable(self.tokenizer.async_encode_batch)\n        assert callable(self.tokenizer.async_encode_batch_fast)\n\n    @pytest.mark.asyncio\n    async def test_performance_comparison(self):\n        \"\"\"Compare performance between sync and async methods (informational).\"\"\"\n        # Create a large batch for performance comparison\n        large_batch = [\n            \"short text\",\n            \"Sometimes it helps to have a better idea\",\n            \"More short\",\n            \"Let's not delve into that habbit sir\",\n            \"I believe we can get to\",\n            \"I am going to do it. I have made up my mind. These are the first few words of the new… the best … the Longest Text In The Entire History Of The Known Universe! This Has To Have Over 35,000 words the beat the current world record set by that person who made that flaming chicken handbooky thingy. I might just be saying random things the whole time I type in this so you might get confused a lot. I just discovered something terrible. autocorrect is on!! no!!! this has to be crazy, so I will have to break all the English language rules and the basic knowledge of the average human being. I am not an average human being, however I am special. no no no, not THAT kind of special ;). Why do people send that wink face! it always gives me nightmares! it can make a completely normal sentence creepy. imagine you are going to a friend’s house, so you text this: [ see you soon 🙂 ] seems normal, right? But what is you add the word semi to that colon? (Is that right? or is it the other way around) what is you add a lorry to that briquettes? (Semi-truck to that coal-on) anyway, back to the point: [ see you soon 😉 ]THAT IS JUST SO CREEPY! is that really your friend, or is it a creepy stalker watching your every move? Or even worse, is it your friend who is a creepy stalker? maybe you thought it was your friend, but it was actually your fri end (let me explain: you are happily in McDonalds, getting fat while eating yummy food and some random dude walks up and blots out the sun (he looks like a regular here) you can’t see anything else than him, so you can’t try to avoid eye contact. he finishes eating his cheeseburger (more like horseburgher(I learned that word from the merchant of Venice(which is a good play(if you can understand it(I can cause I got a special book with all the words in readable English written on the side of the page(which is kinda funny because Shakespeare was supposed to be a good poet but no-one can understand him(and he’s racist in act 2 scene1 of the play too))))))) and sits down beside you , like you are old pals (you’ve never met him before but he looks like he could be in some weird cult) he clears his throat and asks you a very personal question. “can i have some French fries?” (I don’t know why there called French fries when I’ve never seen a French person eat fries! all they eat it is stuff like baguettes and crêpes and rats named ratty-two-ee which is a really fun game on the PlayStation 2) And you think {bubbly cloud thinking bubble} “Hahahahahhahahahahahahahaha!!!!!!!!!!!! Hehheheheheh…..heeeheehe..hehe… sigh. I remember that i was just about to eat one of my fries when I noticed something mushy and moist and [insert gross color like green or brown] on the end of one of my fries! now I can give it to this NERD!! ” (yes he is a nerd because all he does all day is watch the extended editions of the hobbit, lord of the rings and star wars and eat fat cakes (what the heck is a fat cake? I think it might be like a Twinkie or something)and twinkies(wow so is doesn’t really matter which is which because he eats both(i may have just done that so I didn’t have to Google what a fat cake is (right now I am typing on my iPhone 3gs anyway, which has a broken antenna so i can’t get internet anyway (it’s actually a really funny story that i’ll tell you sometime)))and sit in his man cave with his friend named Joe (an ACTUAL friend, not a fri end)and all Joe does is watch sports like football with bob and all bob does is gamble ferociously (don’t ask(it means he buys all those bags of chips that say “win a free monkey or something if you find a banana in your bag*”(if there is a little star it means there is fine print so I always check the back of the package) *flips over the package* okay, it says: “one of our workers accidentally threw a banana in the packing machine and we don’t want to get sued so we did this promotion thing” cool. Oh wow, this is salt and vinegar! my favourite! i hate cheese and onion.))and that’s pretty much his life, he lives in Jamaica with Naruto and his friends) so you give him that gross fri end he throws up all over you and me and the worker behind the counter who was still making an onion, and THAT is the story of the fri end, not a friend who somehow remembered your name and your phone number / email so he could text you saying he would come to your house soon. *finally takes a breath after typing a few hundred words about fri-ends* so what now? i know, i know, you think i ramble too much and use too many brackets (i don’t) but now i am going to talk about my amAZEing day. first i woke up, ate choco pops for breakfast even tho i always hate it when people say that cause i get jealous and super hungry. then i… umm… yea! that was my day. you know that other person i mentioned before? that flaming chicken person? WELL. i will steal something from that person but do it better. i will… drum roll please … badabadabadabadabadabadabummmmmmmmmmmchshchshchshchshbadabadboumboumpoopoopichypichypichypowpow-crash! *a drum roll was just playing in the background* that drumroll was so long i forget what i was talking about. *scrolls up to see what he was writing about* oh yea! i will make my own FLAMING CHICKEN HANDBOOK! what things do i like? instead of flaming it could be rainbow, instead of chicken it could be fluffysheep and instead of handbook it could be handbook (not very creative, i know) but the total complete name is now to rainbow fluffysheep handbook! to make life easier for you guys, instead of taking random rules out of book willy nilly, i will take them out using my favourite numbers! so, section 5040 of the rainbow fluffysheep handbook states that the king of all oddly coloured farm animals (thats me!) is allowed to tell you any part out of this book randomly or if it is his one of his favorite numbers! 5040 is a great number because it is divisible by 60 integers which i don’t know. i’m tired. it is 10:41 and i am getting sleepy… hey hey hey! an intruder! remember that from pokepals rulers of time and darkness or something like that! with piplup and sunflora and chimchar! whaoh piplup is really hard to write on a tiny qwerty keyboard! try it! i realised that asdf is actually written in order on the qwerty keyboard! (just in case you didn’t know, asdf is an amazing short video clips cartoony thing on youtube i first learned bout on flipnote hatena, which is now shut down 😦 ) what if one day they get rid of the qwerty keyboard completely! i will type it out for you just in case one day they get rid of it.\",\n        ]\n        results_sync = []\n        results_async = []\n\n        # Pre-initialize a thread pool executor with a reasonable number of workers\n        # This avoids the overhead of creating the pool for each task\n\n        try:\n            executor = concurrent.futures.ThreadPoolExecutor(max_workers=2048)\n            loop = asyncio.get_running_loop()\n\n            async def encode_sync_with_executor(_):\n                # Use the pre-initialized executor\n                return await loop.run_in_executor(executor, lambda: self.tokenizer.encode_batch_fast(large_batch))\n\n            async def encode_to_thread_sync(_):\n                return await asyncio.to_thread(self.tokenizer.encode_batch_fast, large_batch)\n\n            async def encode_async(_):\n                return await self.tokenizer.async_encode_batch_fast(large_batch)\n\n            await asyncio.gather(*[encode_sync_with_executor(i) for i in range(2048)])\n            await asyncio.gather(*[encode_async(i) for i in range(2048)])\n\n            for n_tasks in [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]:\n                # Measure sync performance with pre-initialized executor\n                # Warm up\n                await asyncio.gather(*[encode_sync_with_executor(i) for i in range(10)])\n                time.sleep(0.03)\n                # Actual measurement\n                start = time.perf_counter()\n                await asyncio.gather(*[encode_sync_with_executor(i) for i in range(n_tasks)])\n                sync_time = time.perf_counter() - start\n\n                # Measure async performance\n                # Warm up\n                await asyncio.gather(*[encode_async(i) for i in range(10)])\n\n                # Actual measurement\n                time.sleep(0.03)\n                start = time.perf_counter()\n                await asyncio.gather(*[encode_async(i) for i in range(n_tasks)])\n                async_time = time.perf_counter() - start\n\n                # Log times\n                print(f\"sync vs async processing times: {sync_time:.4f}s vs {async_time:.4f}s for {n_tasks} tasks\")\n                results_sync.append(sync_time)\n                results_async.append(async_time)\n        finally:\n            # Make sure we shut down the executor properly\n            executor.shutdown(wait=False)\n"
  },
  {
    "path": "bindings/python/tests/bindings/test_trainers.py",
    "content": "import copy\nimport os\nimport pickle\n\nimport pytest\n\nfrom tokenizers import (\n    AddedToken,\n    SentencePieceUnigramTokenizer,\n    Tokenizer,\n    models,\n    normalizers,\n    pre_tokenizers,\n    trainers,\n)\n\nfrom ..utils import data_dir, train_files, DATA_PATH\n\n\nclass TestBpeTrainer:\n    def test_can_modify(self):\n        trainer = trainers.BpeTrainer(\n            vocab_size=12345,\n            min_frequency=12,\n            show_progress=False,\n            special_tokens=[\"1\", \"2\"],\n            limit_alphabet=13,\n            initial_alphabet=[\"a\", \"b\", \"c\"],\n            continuing_subword_prefix=\"pref\",\n            end_of_word_suffix=\"suf\",\n        )\n\n        assert trainer.vocab_size == 12345\n        assert trainer.min_frequency == 12\n        assert trainer.show_progress == False\n        assert trainer.special_tokens == [\n            AddedToken(\"1\", special=True),\n            AddedToken(\"2\", special=True),\n        ]\n        assert trainer.limit_alphabet == 13\n        assert sorted(trainer.initial_alphabet) == [\"a\", \"b\", \"c\"]\n        assert trainer.continuing_subword_prefix == \"pref\"\n        assert trainer.end_of_word_suffix == \"suf\"\n\n        # Modify these\n        trainer.vocab_size = 20000\n        assert trainer.vocab_size == 20000\n        trainer.min_frequency = 1\n        assert trainer.min_frequency == 1\n        trainer.show_progress = True\n        assert trainer.show_progress == True\n        trainer.special_tokens = []\n        assert trainer.special_tokens == []\n        trainer.limit_alphabet = None\n        assert trainer.limit_alphabet == None\n        trainer.initial_alphabet = [\"d\", \"z\"]\n        assert sorted(trainer.initial_alphabet) == [\"d\", \"z\"]\n        trainer.continuing_subword_prefix = None\n        assert trainer.continuing_subword_prefix == None\n        trainer.end_of_word_suffix = None\n        assert trainer.continuing_subword_prefix == None\n\n    def test_can_pickle(self):\n        assert (\n            trainers.BpeTrainer(min_frequency=12).__getstate__()\n            == b\"\"\"{\"BpeTrainer\":{\"min_frequency\":12,\"vocab_size\":30000,\"show_progress\":true,\"special_tokens\":[],\"limit_alphabet\":null,\"initial_alphabet\":[],\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"max_token_length\":null,\"words\":{}}}\"\"\"\n        )\n        assert isinstance(pickle.loads(pickle.dumps(trainers.BpeTrainer(min_frequency=12))), trainers.BpeTrainer)\n\n        assert isinstance(copy.deepcopy(trainers.BpeTrainer(min_frequency=12)), trainers.BpeTrainer)\n        # Make sure everything is correct\n        assert pickle.dumps(pickle.loads(pickle.dumps(trainers.BpeTrainer(min_frequency=12)))) == pickle.dumps(\n            trainers.BpeTrainer(min_frequency=12)\n        )\n\n\nclass TestWordPieceTrainer:\n    def test_can_modify(self):\n        trainer = trainers.WordPieceTrainer(\n            vocab_size=12345,\n            min_frequency=12,\n            show_progress=False,\n            special_tokens=[\"1\", \"2\"],\n            limit_alphabet=13,\n            initial_alphabet=[\"a\", \"b\", \"c\"],\n            continuing_subword_prefix=\"pref\",\n            end_of_word_suffix=\"suf\",\n        )\n\n        assert trainer.vocab_size == 12345\n        assert trainer.min_frequency == 12\n        assert trainer.show_progress == False\n        assert trainer.special_tokens == [\n            AddedToken(\"1\", special=True),\n            AddedToken(\"2\", special=True),\n        ]\n        assert trainer.limit_alphabet == 13\n        assert sorted(trainer.initial_alphabet) == [\"a\", \"b\", \"c\"]\n        assert trainer.continuing_subword_prefix == \"pref\"\n        assert trainer.end_of_word_suffix == \"suf\"\n\n        # Modify these\n        trainer.vocab_size = 20000\n        assert trainer.vocab_size == 20000\n        trainer.min_frequency = 1\n        assert trainer.min_frequency == 1\n        trainer.show_progress = True\n        assert trainer.show_progress == True\n        trainer.special_tokens = []\n        assert trainer.special_tokens == []\n        trainer.limit_alphabet = None\n        assert trainer.limit_alphabet == None\n        trainer.initial_alphabet = [\"d\", \"z\"]\n        assert sorted(trainer.initial_alphabet) == [\"d\", \"z\"]\n        trainer.continuing_subword_prefix = None\n        assert trainer.continuing_subword_prefix == None\n        trainer.end_of_word_suffix = None\n        assert trainer.continuing_subword_prefix == None\n\n    def test_can_pickle(self):\n        assert isinstance(pickle.loads(pickle.dumps(trainers.WordPieceTrainer())), trainers.WordPieceTrainer)\n\n\nclass TestWordLevelTrainer:\n    def test_can_modify(self):\n        trainer = trainers.WordLevelTrainer(\n            vocab_size=12345, min_frequency=12, show_progress=False, special_tokens=[\"1\", \"2\"]\n        )\n\n        assert trainer.vocab_size == 12345\n        assert trainer.min_frequency == 12\n        assert trainer.show_progress == False\n        assert trainer.special_tokens == [\n            AddedToken(\"1\", special=True),\n            AddedToken(\"2\", special=True),\n        ]\n\n        # Modify these\n        trainer.vocab_size = 20000\n        assert trainer.vocab_size == 20000\n        trainer.min_frequency = 1\n        assert trainer.min_frequency == 1\n        trainer.show_progress = True\n        assert trainer.show_progress == True\n        trainer.special_tokens = []\n        assert trainer.special_tokens == []\n\n    def test_can_pickle(self):\n        assert isinstance(pickle.loads(pickle.dumps(trainers.WordLevelTrainer())), trainers.WordLevelTrainer)\n\n\nclass TestUnigram:\n    def test_train(self, train_files):\n        tokenizer = SentencePieceUnigramTokenizer()\n        tokenizer.train(train_files[\"small\"], show_progress=False)\n\n        filename = \"tests/data/unigram_trained.json\"\n        tokenizer.save(filename)\n        os.remove(filename)\n\n    def test_train_parallelism_with_custom_pretokenizer(self, train_files):\n        class GoodCustomPretok:\n            def split(self, n, normalized):\n                #  Here we just test that we can return a List[NormalizedString], it\n                # does not really make sense to return twice the same otherwise\n                return [normalized, normalized]\n\n            def pre_tokenize(self, pretok):\n                pretok.split(self.split)\n\n        custom = pre_tokenizers.PreTokenizer.custom(GoodCustomPretok())\n        bpe_tokenizer = Tokenizer(models.BPE())\n        bpe_tokenizer.normalizer = normalizers.Lowercase()\n        bpe_tokenizer.pre_tokenizer = custom\n\n        if \"TOKENIZERS_PARALLELISM\" in os.environ:\n            del os.environ[\"TOKENIZERS_PARALLELISM\"]\n\n        trainer = trainers.BpeTrainer(special_tokens=[\"<unk>\"], show_progress=False)\n        bpe_tokenizer.train([train_files[\"small\"]], trainer=trainer)\n\n    def test_can_pickle(self):\n        assert isinstance(pickle.loads(pickle.dumps(trainers.UnigramTrainer())), trainers.UnigramTrainer)\n\n    def test_train_with_special_tokens(self):\n        filename = \"tests/data/dummy-unigram-special_tokens-train.txt\"\n        with open(filename, \"w\") as f:\n            f.write(\n                \"\"\"\n[CLS] The Zen of Python, by Tim Peters [SEP]\n[CLS] Beautiful is better than ugly. [SEP]\n[CLS] Explicit is better than implicit. [SEP]\n[CLS] Simple is better than complex. [SEP]\n[CLS] Complex is better than complicated. [SEP]\n[CLS] Flat is better than nested. [SEP]\n[CLS] Sparse is better than dense. [SEP]\n[CLS] Readability counts. [SEP]\n[CLS] Special cases aren't special enough to break the rules. [SEP]\n[CLS] Although practicality beats purity. [SEP]\n[CLS] Errors should never pass silently. [SEP]\n[CLS] Unless explicitly silenced. [SEP]\n[CLS] In the face of ambiguity, refuse the temptation to guess. [SEP]\n[CLS] There should be one-- and preferably only one --obvious way to do it. [SEP]\n[CLS] Although that way may not be obvious at first unless you're Dutch. [SEP]\n[CLS] Now is better than never. [SEP]\n[CLS] Although never is often better than *right* now. [SEP]\n[CLS] If the implementation is hard to explain, it's a bad idea. [SEP]\n[CLS] If the implementation is easy to explain, it may be a good idea. [SEP]\n[CLS] Namespaces are one honking great idea -- let's do more of those! [SEP]\n            \"\"\"\n            )\n\n        tokenizer = Tokenizer(models.Unigram())\n        trainer = trainers.UnigramTrainer(\n            show_progress=False, special_tokens=[\"[PAD]\", \"[SEP]\", \"[CLS]\"], unk_token=\"[UNK]\"\n        )\n\n        tokenizer.train([filename], trainer=trainer)\n\n        assert tokenizer.encode(\"[CLS] This is a test [SEP]\").tokens == [\n            \"[CLS]\",\n            \" T\",\n            \"h\",\n            \"i\",\n            \"s\",\n            \" is \",\n            \"a\",\n            \" \",\n            \"te\",\n            \"s\",\n            \"t \",\n            \"[SEP]\",\n        ]\n\n        tokenizer = Tokenizer(models.Unigram())\n        trainer = trainers.UnigramTrainer(\n            show_progress=False,\n            special_tokens=[\"[PAD]\", \"[SEP]\", \"[CLS]\"],\n            unk_token=\"[UNK]\",\n            vocab_size=100,\n        )\n        tokenizer.train([filename], trainer=trainer)\n\n        assert tokenizer.get_vocab_size() == 100\n\n        tokenizer = Tokenizer(models.Unigram())\n        trainer = trainers.UnigramTrainer(\n            show_progress=False,\n            special_tokens=[\"[PAD]\", \"[SEP]\", \"[CLS]\", \"[UNK]\"],\n            unk_token=\"[UNK]\",\n            vocab_size=100,\n        )\n        tokenizer.train([filename], trainer=trainer)\n\n        assert tokenizer.get_vocab_size() == 100\n\n    def test_cannot_train_different_model(self):\n        tokenizer = Tokenizer(models.BPE())\n        trainer = trainers.UnigramTrainer(show_progress=False)\n\n        with pytest.raises(Exception, match=\"UnigramTrainer can only train a Unigram\"):\n            tokenizer.train([], trainer)\n\n    def test_can_modify(self):\n        trainer = trainers.UnigramTrainer(\n            vocab_size=12345,\n            show_progress=False,\n            special_tokens=[\"1\", AddedToken(\"2\", lstrip=True)],\n            initial_alphabet=[\"a\", \"b\", \"c\"],\n        )\n\n        assert trainer.vocab_size == 12345\n        assert trainer.show_progress == False\n        assert trainer.special_tokens == [\n            AddedToken(\"1\", normalized=False, special=True),\n            AddedToken(\"2\", lstrip=True, normalized=False, special=True),\n        ]\n        assert sorted(trainer.initial_alphabet) == [\"a\", \"b\", \"c\"]\n\n        # Modify these\n        trainer.vocab_size = 20000\n        assert trainer.vocab_size == 20000\n        trainer.show_progress = True\n        assert trainer.show_progress == True\n        trainer.special_tokens = []\n        assert trainer.special_tokens == []\n        trainer.initial_alphabet = [\"d\", \"z\"]\n        assert sorted(trainer.initial_alphabet) == [\"d\", \"z\"]\n\n    def test_continuing_prefix_trainer_mismatch(self, train_files):\n        UNK = \"[UNK]\"\n        special_tokens = [UNK]\n        tokenizer = Tokenizer(models.BPE(unk_token=UNK, continuing_subword_prefix=\"##\"))\n        trainer = trainers.BpeTrainer(special_tokens=special_tokens)\n        tokenizer.pre_tokenizer = pre_tokenizers.Sequence(\n            [pre_tokenizers.Whitespace(), pre_tokenizers.Digits(individual_digits=True)]\n        )\n        tokenizer.train(files=[train_files[\"big\"]], trainer=trainer)\n\n        tokenizer_json = os.path.join(DATA_PATH, \"tokenizer.json\")\n        tokenizer.save(tokenizer_json)\n\n        tokenizer.from_file(tokenizer_json)\n"
  },
  {
    "path": "bindings/python/tests/documentation/__init__.py",
    "content": ""
  },
  {
    "path": "bindings/python/tests/documentation/test_pipeline.py",
    "content": "from tokenizers import Tokenizer\n\nfrom ..utils import data_dir, doc_pipeline_bert_tokenizer, doc_wiki_tokenizer\n\ndisable_printing = True\noriginal_print = print\n\n\ndef print(*args, **kwargs):\n    if not disable_printing:\n        original_print(*args, **kwargs)\n\n\nclass TestPipeline:\n    def test_pipeline(self, doc_wiki_tokenizer):\n        try:\n            # START reload_tokenizer\n            from tokenizers import Tokenizer\n\n            tokenizer = Tokenizer.from_file(\"data/tokenizer-wiki.json\")\n            # END reload_tokenizer\n        except Exception:\n            tokenizer = Tokenizer.from_file(doc_wiki_tokenizer)\n\n        # START setup_normalizer\n        from tokenizers import normalizers\n        from tokenizers.normalizers import NFD, StripAccents\n\n        normalizer = normalizers.Sequence([NFD(), StripAccents()])\n        # END setup_normalizer\n        # START test_normalizer\n        normalizer.normalize_str(\"Héllò hôw are ü?\")\n        # \"Hello how are u?\"\n        # END test_normalizer\n        assert normalizer.normalize_str(\"Héllò hôw are ü?\") == \"Hello how are u?\"\n        # START replace_normalizer\n        tokenizer.normalizer = normalizer\n        # END replace_normalizer\n        # START setup_pre_tokenizer\n        from tokenizers.pre_tokenizers import Whitespace\n\n        pre_tokenizer = Whitespace()\n        pre_tokenizer.pre_tokenize_str(\"Hello! How are you? I'm fine, thank you.\")\n        # [(\"Hello\", (0, 5)), (\"!\", (5, 6)), (\"How\", (7, 10)), (\"are\", (11, 14)), (\"you\", (15, 18)),\n        #  (\"?\", (18, 19)), (\"I\", (20, 21)), (\"'\", (21, 22)), ('m', (22, 23)), (\"fine\", (24, 28)),\n        #  (\",\", (28, 29)), (\"thank\", (30, 35)), (\"you\", (36, 39)), (\".\", (39, 40))]\n        # END setup_pre_tokenizer\n        assert pre_tokenizer.pre_tokenize_str(\"Hello! How are you? I'm fine, thank you.\") == [\n            (\"Hello\", (0, 5)),\n            (\"!\", (5, 6)),\n            (\"How\", (7, 10)),\n            (\"are\", (11, 14)),\n            (\"you\", (15, 18)),\n            (\"?\", (18, 19)),\n            (\"I\", (20, 21)),\n            (\"'\", (21, 22)),\n            (\"m\", (22, 23)),\n            (\"fine\", (24, 28)),\n            (\",\", (28, 29)),\n            (\"thank\", (30, 35)),\n            (\"you\", (36, 39)),\n            (\".\", (39, 40)),\n        ]\n        # START combine_pre_tokenizer\n        from tokenizers import pre_tokenizers\n        from tokenizers.pre_tokenizers import Digits\n\n        pre_tokenizer = pre_tokenizers.Sequence([Whitespace(), Digits(individual_digits=True)])\n        pre_tokenizer.pre_tokenize_str(\"Call 911!\")\n        # [(\"Call\", (0, 4)), (\"9\", (5, 6)), (\"1\", (6, 7)), (\"1\", (7, 8)), (\"!\", (8, 9))]\n        # END combine_pre_tokenizer\n        assert pre_tokenizer.pre_tokenize_str(\"Call 911!\") == [\n            (\"Call\", (0, 4)),\n            (\"9\", (5, 6)),\n            (\"1\", (6, 7)),\n            (\"1\", (7, 8)),\n            (\"!\", (8, 9)),\n        ]\n        # START replace_pre_tokenizer\n        tokenizer.pre_tokenizer = pre_tokenizer\n        # END replace_pre_tokenizer\n        # START setup_processor\n        from tokenizers.processors import TemplateProcessing\n\n        tokenizer.post_processor = TemplateProcessing(\n            single=\"[CLS] $A [SEP]\",\n            pair=\"[CLS] $A [SEP] $B:1 [SEP]:1\",\n            special_tokens=[(\"[CLS]\", 1), (\"[SEP]\", 2)],\n        )\n        # END setup_processor\n        # START test_decoding\n        output = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\")\n        print(output.ids)\n        # [1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2]\n\n        tokenizer.decode([1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2])\n        # \"Hello , y ' all ! How are you ?\"\n        # END test_decoding\n        assert output.ids == [1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2]\n        assert (\n            tokenizer.decode([1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2])\n            == \"Hello , y ' all ! How are you ?\"\n        )\n\n    @staticmethod\n    def slow_train():\n        # START bert_setup_tokenizer\n        from tokenizers import Tokenizer\n        from tokenizers.models import WordPiece\n\n        bert_tokenizer = Tokenizer(WordPiece(unk_token=\"[UNK]\"))\n        # END bert_setup_tokenizer\n        # START bert_setup_normalizer\n        from tokenizers import normalizers\n        from tokenizers.normalizers import NFD, Lowercase, StripAccents\n\n        bert_tokenizer.normalizer = normalizers.Sequence([NFD(), Lowercase(), StripAccents()])\n        # END bert_setup_normalizer\n        # START bert_setup_pre_tokenizer\n        from tokenizers.pre_tokenizers import Whitespace\n\n        bert_tokenizer.pre_tokenizer = Whitespace()\n        # END bert_setup_pre_tokenizer\n        # START bert_setup_processor\n        from tokenizers.processors import TemplateProcessing\n\n        bert_tokenizer.post_processor = TemplateProcessing(\n            single=\"[CLS] $A [SEP]\",\n            pair=\"[CLS] $A [SEP] $B:1 [SEP]:1\",\n            special_tokens=[\n                (\"[CLS]\", 1),\n                (\"[SEP]\", 2),\n            ],\n        )\n        # END bert_setup_processor\n        # START bert_train_tokenizer\n        from tokenizers.trainers import WordPieceTrainer\n\n        trainer = WordPieceTrainer(vocab_size=30522, special_tokens=[\"[UNK]\", \"[CLS]\", \"[SEP]\", \"[PAD]\", \"[MASK]\"])\n        files = [f\"data/wikitext-103-raw/wiki.{split}.raw\" for split in [\"test\", \"train\", \"valid\"]]\n        bert_tokenizer.train(files, trainer)\n\n        bert_tokenizer.save(\"data/bert-wiki.json\")\n        # END bert_train_tokenizer\n\n    def test_bert_example(self, doc_pipeline_bert_tokenizer):\n        try:\n            bert_tokenizer = Tokenizer.from_file(\"data/bert-wiki.json\")\n        except Exception:\n            bert_tokenizer = Tokenizer.from_file(doc_pipeline_bert_tokenizer)\n\n        # START bert_test_decoding\n        output = bert_tokenizer.encode(\"Welcome to the 🤗 Tokenizers library.\")\n        print(output.tokens)\n        # [\"[CLS]\", \"welcome\", \"to\", \"the\", \"[UNK]\", \"tok\", \"##eni\", \"##zer\", \"##s\", \"library\", \".\", \"[SEP]\"]\n\n        bert_tokenizer.decode(output.ids)\n        # \"welcome to the tok ##eni ##zer ##s library .\"\n        # END bert_test_decoding\n        assert bert_tokenizer.decode(output.ids) == \"welcome to the tok ##eni ##zer ##s library .\"\n        # START bert_proper_decoding\n        from tokenizers import decoders\n\n        bert_tokenizer.decoder = decoders.WordPiece()\n        bert_tokenizer.decode(output.ids)\n        # \"welcome to the tokenizers library.\"\n        # END bert_proper_decoding\n        assert bert_tokenizer.decode(output.ids) == \"welcome to the tokenizers library.\"\n\n\nif __name__ == \"__main__\":\n    import os\n    from urllib import request\n    from zipfile import ZipFile\n\n    disable_printing = False\n    if not os.path.isdir(\"data/wikitext-103-raw\"):\n        print(\"Downloading wikitext-103...\")\n        wiki_text, _ = request.urlretrieve(\n            \"https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip\"\n        )\n        with ZipFile(wiki_text, \"r\") as z:\n            print(\"Unzipping in data...\")\n            z.extractall(\"data\")\n\n    print(\"Now training...\")\n    TestPipeline.slow_train()\n"
  },
  {
    "path": "bindings/python/tests/documentation/test_quicktour.py",
    "content": "from tokenizers import Tokenizer\nfrom ..utils import data_dir, doc_wiki_tokenizer\n\n\ndisable_printing = True\noriginal_print = print\n\n\ndef print(*args, **kwargs):\n    if not disable_printing:\n        original_print(*args, **kwargs)\n\n\nclass TestQuicktour:\n    # This method contains everything we don't want to run\n    @staticmethod\n    def slow_train():\n        tokenizer, trainer = TestQuicktour.get_tokenizer_trainer()\n\n        # START train\n        files = [f\"data/wikitext-103-raw/wiki.{split}.raw\" for split in [\"test\", \"train\", \"valid\"]]\n        tokenizer.train(files, trainer)\n        # END train\n        # START save\n        tokenizer.save(\"data/tokenizer-wiki.json\")\n        # END save\n\n    @staticmethod\n    def get_tokenizer_trainer():\n        # START init_tokenizer\n        from tokenizers import Tokenizer\n        from tokenizers.models import BPE\n\n        tokenizer = Tokenizer(BPE(unk_token=\"[UNK]\"))\n        # END init_tokenizer\n        # START init_trainer\n        from tokenizers.trainers import BpeTrainer\n\n        trainer = BpeTrainer(special_tokens=[\"[UNK]\", \"[CLS]\", \"[SEP]\", \"[PAD]\", \"[MASK]\"])\n        # END init_trainer\n        # START init_pretok\n        from tokenizers.pre_tokenizers import Whitespace\n\n        tokenizer.pre_tokenizer = Whitespace()\n        # END init_pretok\n        return tokenizer, trainer\n\n    def test_quicktour(self, doc_wiki_tokenizer):\n        def print(*args, **kwargs):\n            pass\n\n        try:\n            # START reload_tokenizer\n            tokenizer = Tokenizer.from_file(\"data/tokenizer-wiki.json\")\n            # END reload_tokenizer\n        except Exception:\n            tokenizer = Tokenizer.from_file(doc_wiki_tokenizer)\n        # START encode\n        output = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\")\n        # END encode\n        # START print_tokens\n        print(output.tokens)\n        # [\"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\"]\n        # END print_tokens\n        assert output.tokens == [\n            \"Hello\",\n            \",\",\n            \"y\",\n            \"'\",\n            \"all\",\n            \"!\",\n            \"How\",\n            \"are\",\n            \"you\",\n            \"[UNK]\",\n            \"?\",\n        ]\n        # START print_ids\n        print(output.ids)\n        # [27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35]\n        # END print_ids\n        assert output.ids == [27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35]\n        # START print_offsets\n        print(output.offsets[9])\n        # (26, 27)\n        # END print_offsets\n        assert output.offsets[9] == (26, 27)\n        # START use_offsets\n        sentence = \"Hello, y'all! How are you 😁 ?\"\n        sentence[26:27]\n        # \"😁\"\n        # END use_offsets\n        assert sentence[26:27] == \"😁\"\n        # START check_sep\n        tokenizer.token_to_id(\"[SEP]\")\n        # 2\n        # END check_sep\n        assert tokenizer.token_to_id(\"[SEP]\") == 2\n        # START init_template_processing\n        from tokenizers.processors import TemplateProcessing\n\n        tokenizer.post_processor = TemplateProcessing(\n            single=\"[CLS] $A [SEP]\",\n            pair=\"[CLS] $A [SEP] $B:1 [SEP]:1\",\n            special_tokens=[\n                (\"[CLS]\", tokenizer.token_to_id(\"[CLS]\")),\n                (\"[SEP]\", tokenizer.token_to_id(\"[SEP]\")),\n            ],\n        )\n        # END init_template_processing\n        # START print_special_tokens\n        output = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\")\n        print(output.tokens)\n        # [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n        # END print_special_tokens\n        assert output.tokens == [\n            \"[CLS]\",\n            \"Hello\",\n            \",\",\n            \"y\",\n            \"'\",\n            \"all\",\n            \"!\",\n            \"How\",\n            \"are\",\n            \"you\",\n            \"[UNK]\",\n            \"?\",\n            \"[SEP]\",\n        ]\n        # START print_special_tokens_pair\n        output = tokenizer.encode(\"Hello, y'all!\", \"How are you 😁 ?\")\n        print(output.tokens)\n        # [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"[SEP]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n        # END print_special_tokens_pair\n        assert output.tokens == [\n            \"[CLS]\",\n            \"Hello\",\n            \",\",\n            \"y\",\n            \"'\",\n            \"all\",\n            \"!\",\n            \"[SEP]\",\n            \"How\",\n            \"are\",\n            \"you\",\n            \"[UNK]\",\n            \"?\",\n            \"[SEP]\",\n        ]\n        # START print_type_ids\n        print(output.type_ids)\n        # [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\n        # END print_type_ids\n        assert output.type_ids == [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\n        # START encode_batch\n        output = tokenizer.encode_batch([\"Hello, y'all!\", \"How are you 😁 ?\"])\n        # END encode_batch\n        # START encode_batch_pair\n        output = tokenizer.encode_batch(\n            [[\"Hello, y'all!\", \"How are you 😁 ?\"], [\"Hello to you too!\", \"I'm fine, thank you!\"]]\n        )\n        # END encode_batch_pair\n        # START enable_padding\n        tokenizer.enable_padding(pad_id=3, pad_token=\"[PAD]\")\n        # END enable_padding\n        # START print_batch_tokens\n        output = tokenizer.encode_batch([\"Hello, y'all!\", \"How are you 😁 ?\"])\n        print(output[1].tokens)\n        # [\"[CLS]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\", \"[PAD]\"]\n        # END print_batch_tokens\n        assert output[1].tokens == [\"[CLS]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\", \"[PAD]\"]\n        # START print_attention_mask\n        print(output[1].attention_mask)\n        # [1, 1, 1, 1, 1, 1, 1, 0]\n        # END print_attention_mask\n        assert output[1].attention_mask == [1, 1, 1, 1, 1, 1, 1, 0]\n\n\nif __name__ == \"__main__\":\n    import os\n    from urllib import request\n    from zipfile import ZipFile\n\n    disable_printing = False\n    if not os.path.isdir(\"data/wikitext-103-raw\"):\n        print(\"Downloading wikitext-103...\")\n        wiki_text, _ = request.urlretrieve(\n            \"https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip\"\n        )\n        with ZipFile(wiki_text, \"r\") as z:\n            print(\"Unzipping in data...\")\n            z.extractall(\"data\")\n\n    print(\"Now training...\")\n    TestQuicktour.slow_train()\n"
  },
  {
    "path": "bindings/python/tests/documentation/test_tutorial_train_from_iterators.py",
    "content": "# flake8: noqa\nimport gzip\nimport os\n\nimport datasets  # type: ignore[import-not-found]\nimport pytest\n\nfrom ..utils import data_dir, train_files\n\n\nclass TestTrainFromIterators:\n    @staticmethod\n    def get_tokenizer_trainer():\n        # START init_tokenizer_trainer\n        from tokenizers import Tokenizer, decoders, models, normalizers, pre_tokenizers, trainers\n\n        tokenizer = Tokenizer(models.Unigram())\n        tokenizer.normalizer = normalizers.NFKC()\n        tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel()\n        tokenizer.decoder = decoders.ByteLevel()\n\n        trainer = trainers.UnigramTrainer(\n            vocab_size=20000,\n            initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),\n            special_tokens=[\"<PAD>\", \"<BOS>\", \"<EOS>\"],\n        )\n        # END init_tokenizer_trainer\n        trainer.show_progress = False\n\n        return tokenizer, trainer\n\n    @staticmethod\n    def load_dummy_dataset():\n        # START load_dataset\n        import datasets  # type: ignore[import-not-found]\n\n        dataset = datasets.load_dataset(\"wikitext\", \"wikitext-103-raw-v1\", split=\"train+test+validation\")\n        # END load_dataset\n\n    @pytest.fixture(scope=\"class\")\n    def setup_gzip_files(self, train_files):\n        with open(train_files[\"small\"], \"rt\") as small:\n            for n in range(3):\n                path = f\"data/my-file.{n}.gz\"\n                with gzip.open(path, \"wt\") as f:\n                    f.write(small.read())\n\n    def test_train_basic(self):\n        tokenizer, trainer = self.get_tokenizer_trainer()\n\n        # START train_basic\n        # First few lines of the \"Zen of Python\" https://www.python.org/dev/peps/pep-0020/\n        data = [\n            \"Beautiful is better than ugly.\"\n            \"Explicit is better than implicit.\"\n            \"Simple is better than complex.\"\n            \"Complex is better than complicated.\"\n            \"Flat is better than nested.\"\n            \"Sparse is better than dense.\"\n            \"Readability counts.\"\n        ]\n        tokenizer.train_from_iterator(data, trainer=trainer)\n        # END train_basic\n\n    def test_datasets(self):\n        tokenizer, trainer = self.get_tokenizer_trainer()\n\n        # In order to keep tests fast, we only use the first 100 examples\n        os.environ[\"TOKENIZERS_PARALLELISM\"] = \"true\"\n        dataset = datasets.load_dataset(\"wikitext\", \"wikitext-103-raw-v1\", split=\"train[0:100]\")\n\n        # START def_batch_iterator\n        def batch_iterator(batch_size=1000):\n            # Only keep the text column to avoid decoding the rest of the columns unnecessarily\n            tok_dataset = dataset.select_columns(\"text\")\n            for batch in tok_dataset.iter(batch_size):\n                yield batch[\"text\"]\n\n        # END def_batch_iterator\n\n        # START train_datasets\n        tokenizer.train_from_iterator(batch_iterator(), trainer=trainer, length=len(dataset))\n        # END train_datasets\n\n    def test_gzip(self, setup_gzip_files):\n        tokenizer, trainer = self.get_tokenizer_trainer()\n\n        # START single_gzip\n        import gzip\n\n        with gzip.open(\"data/my-file.0.gz\", \"rt\") as f:\n            tokenizer.train_from_iterator(f, trainer=trainer)\n        # END single_gzip\n        # START multi_gzip\n        files = [\"data/my-file.0.gz\", \"data/my-file.1.gz\", \"data/my-file.2.gz\"]\n\n        def gzip_iterator():\n            for path in files:\n                with gzip.open(path, \"rt\") as f:\n                    for line in f:\n                        yield line\n\n        tokenizer.train_from_iterator(gzip_iterator(), trainer=trainer)\n        # END multi_gzip\n"
  },
  {
    "path": "bindings/python/tests/implementations/__init__.py",
    "content": ""
  },
  {
    "path": "bindings/python/tests/implementations/test_base_tokenizer.py",
    "content": "from tokenizers import Tokenizer, decoders, models, normalizers, pre_tokenizers, processors\nfrom tokenizers.implementations import BaseTokenizer\n\n\nclass TestBaseTokenizer:\n    def test_get_set_components(self):\n        toki = Tokenizer(models.BPE())\n        toki.normalizer = normalizers.NFC()\n        toki.pre_tokenizer = pre_tokenizers.ByteLevel()\n        toki.post_processor = processors.BertProcessing((\"A\", 0), (\"B\", 1))\n        toki.decoder = decoders.ByteLevel()\n\n        tokenizer = BaseTokenizer(toki)\n\n        assert isinstance(tokenizer.model, models.BPE)\n        assert isinstance(tokenizer.normalizer, normalizers.NFC)\n        assert isinstance(tokenizer.pre_tokenizer, pre_tokenizers.ByteLevel)\n        assert isinstance(tokenizer.post_processor, processors.BertProcessing)\n        assert isinstance(tokenizer.decoder, decoders.ByteLevel)\n\n        tokenizer.model = models.Unigram()\n        assert isinstance(tokenizer.model, models.Unigram)\n        tokenizer.normalizer = normalizers.NFD()\n        assert isinstance(tokenizer.normalizer, normalizers.NFD)\n        tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()\n        assert isinstance(tokenizer.pre_tokenizer, pre_tokenizers.Whitespace)\n        tokenizer.post_processor = processors.ByteLevel()\n        assert isinstance(tokenizer.post_processor, processors.ByteLevel)\n        tokenizer.decoder = decoders.WordPiece()\n        assert isinstance(tokenizer.decoder, decoders.WordPiece)\n"
  },
  {
    "path": "bindings/python/tests/implementations/test_bert_wordpiece.py",
    "content": "from tokenizers import BertWordPieceTokenizer\n\nfrom ..utils import bert_files, data_dir, multiprocessing_with_parallelism\n\n\nclass TestBertWordPieceTokenizer:\n    def test_basic_encode(self, bert_files):\n        tokenizer = BertWordPieceTokenizer.from_file(bert_files[\"vocab\"])\n\n        # Encode with special tokens by default\n        output = tokenizer.encode(\"My name is John\", \"pair\")\n        assert output.ids == [101, 2026, 2171, 2003, 2198, 102, 3940, 102]\n        assert output.tokens == [\n            \"[CLS]\",\n            \"my\",\n            \"name\",\n            \"is\",\n            \"john\",\n            \"[SEP]\",\n            \"pair\",\n            \"[SEP]\",\n        ]\n        assert output.offsets == [\n            (0, 0),\n            (0, 2),\n            (3, 7),\n            (8, 10),\n            (11, 15),\n            (0, 0),\n            (0, 4),\n            (0, 0),\n        ]\n        assert output.type_ids == [0, 0, 0, 0, 0, 0, 1, 1]\n\n        # Can encode without the special tokens\n        output = tokenizer.encode(\"My name is John\", \"pair\", add_special_tokens=False)\n        assert output.ids == [2026, 2171, 2003, 2198, 3940]\n        assert output.tokens == [\"my\", \"name\", \"is\", \"john\", \"pair\"]\n        assert output.offsets == [(0, 2), (3, 7), (8, 10), (11, 15), (0, 4)]\n        assert output.type_ids == [0, 0, 0, 0, 1]\n\n    def test_multiprocessing_with_parallelism(self, bert_files):\n        tokenizer = BertWordPieceTokenizer.from_file(bert_files[\"vocab\"])\n        multiprocessing_with_parallelism(tokenizer, False)\n        multiprocessing_with_parallelism(tokenizer, True)\n\n    def test_train_from_iterator(self):\n        text = [\"A first sentence\", \"Another sentence\", \"And a last one\"]\n        tokenizer = BertWordPieceTokenizer()\n        tokenizer.train_from_iterator(text, show_progress=False)\n\n        output = tokenizer.encode(\"A sentence\")\n        assert output.tokens == [\"a\", \"sentence\"]\n"
  },
  {
    "path": "bindings/python/tests/implementations/test_byte_level_bpe.py",
    "content": "from tokenizers import ByteLevelBPETokenizer\n\nfrom ..utils import data_dir, multiprocessing_with_parallelism, roberta_files\n\n\nclass TestByteLevelBPE:\n    def test_basic_encode(self, roberta_files):\n        tokenizer = ByteLevelBPETokenizer.from_file(roberta_files[\"vocab\"], roberta_files[\"merges\"])\n        output = tokenizer.encode(\"The quick brown fox jumps over the lazy dog\")\n\n        assert output.ids == [133, 2119, 6219, 23602, 13855, 81, 5, 22414, 2335]\n        assert output.tokens == [\n            \"The\",\n            \"Ġquick\",\n            \"Ġbrown\",\n            \"Ġfox\",\n            \"Ġjumps\",\n            \"Ġover\",\n            \"Ġthe\",\n            \"Ġlazy\",\n            \"Ġdog\",\n        ]\n        assert output.offsets == [\n            (0, 3),\n            (3, 9),\n            (9, 15),\n            (15, 19),\n            (19, 25),\n            (25, 30),\n            (30, 34),\n            (34, 39),\n            (39, 43),\n        ]\n\n    def test_add_prefix_space(self, roberta_files):\n        tokenizer = ByteLevelBPETokenizer.from_file(\n            roberta_files[\"vocab\"], roberta_files[\"merges\"], add_prefix_space=True\n        )\n        output = tokenizer.encode(\"The quick brown fox jumps over the lazy dog\")\n\n        assert output.ids == [20, 2119, 6219, 23602, 13855, 81, 5, 22414, 2335]\n        assert output.tokens == [\n            \"ĠThe\",\n            \"Ġquick\",\n            \"Ġbrown\",\n            \"Ġfox\",\n            \"Ġjumps\",\n            \"Ġover\",\n            \"Ġthe\",\n            \"Ġlazy\",\n            \"Ġdog\",\n        ]\n        assert output.offsets == [\n            (0, 3),\n            (3, 9),\n            (9, 15),\n            (15, 19),\n            (19, 25),\n            (25, 30),\n            (30, 34),\n            (34, 39),\n            (39, 43),\n        ]\n\n    def test_lowerspace(self, roberta_files):\n        tokenizer = ByteLevelBPETokenizer.from_file(\n            roberta_files[\"vocab\"],\n            roberta_files[\"merges\"],\n            add_prefix_space=True,\n            lowercase=True,\n        )\n        output = tokenizer.encode(\"The Quick Brown Fox Jumps Over The Lazy Dog\")\n\n        assert output.ids == [5, 2119, 6219, 23602, 13855, 81, 5, 22414, 2335]\n        assert output.tokens == [\n            \"Ġthe\",\n            \"Ġquick\",\n            \"Ġbrown\",\n            \"Ġfox\",\n            \"Ġjumps\",\n            \"Ġover\",\n            \"Ġthe\",\n            \"Ġlazy\",\n            \"Ġdog\",\n        ]\n\n    def test_multiprocessing_with_parallelism(self, roberta_files):\n        tokenizer = ByteLevelBPETokenizer.from_file(roberta_files[\"vocab\"], roberta_files[\"merges\"])\n        multiprocessing_with_parallelism(tokenizer, False)\n        multiprocessing_with_parallelism(tokenizer, True)\n\n    def test_train_from_iterator(self):\n        text = [\"A first sentence\", \"Another sentence\", \"And a last one\"]\n        tokenizer = ByteLevelBPETokenizer()\n        tokenizer.train_from_iterator(text, show_progress=False)\n\n        output = tokenizer.encode(\"A sentence\")\n        assert output.tokens == [\"A\", \"Ġsentence\"]\n"
  },
  {
    "path": "bindings/python/tests/implementations/test_char_bpe.py",
    "content": "from tokenizers import CharBPETokenizer\n\nfrom ..utils import data_dir, multiprocessing_with_parallelism, openai_files\n\n\nclass TestCharBPETokenizer:\n    def test_basic_encode(self, openai_files):\n        tokenizer = CharBPETokenizer.from_file(openai_files[\"vocab\"], openai_files[\"merges\"])\n\n        output = tokenizer.encode(\"My name is John\", \"pair\")\n        assert output.ids == [0, 253, 1362, 544, 0, 7, 12662, 2688]\n        assert output.tokens == [\n            \"<unk>\",\n            \"y</w>\",\n            \"name</w>\",\n            \"is</w>\",\n            \"<unk>\",\n            \"o\",\n            \"hn</w>\",\n            \"pair</w>\",\n        ]\n        assert output.offsets == [\n            (0, 1),\n            (1, 2),\n            (3, 7),\n            (8, 10),\n            (11, 12),\n            (12, 13),\n            (13, 15),\n            (0, 4),\n        ]\n        assert output.type_ids == [0, 0, 0, 0, 0, 0, 0, 1]\n\n    def test_lowercase(self, openai_files):\n        tokenizer = CharBPETokenizer.from_file(openai_files[\"vocab\"], openai_files[\"merges\"], lowercase=True)\n        output = tokenizer.encode(\"My name is John\", \"pair\", add_special_tokens=False)\n        assert output.ids == [547, 1362, 544, 2476, 2688]\n        assert output.tokens == [\"my</w>\", \"name</w>\", \"is</w>\", \"john</w>\", \"pair</w>\"]\n        assert output.offsets == [(0, 2), (3, 7), (8, 10), (11, 15), (0, 4)]\n        assert output.type_ids == [0, 0, 0, 0, 1]\n\n    def test_decoding(self, openai_files):\n        tokenizer = CharBPETokenizer.from_file(openai_files[\"vocab\"], openai_files[\"merges\"], lowercase=True)\n        decoded = tokenizer.decode(tokenizer.encode(\"my name is john\").ids)\n        assert decoded == \"my name is john\"\n\n    def test_multiprocessing_with_parallelism(self, openai_files):\n        tokenizer = CharBPETokenizer.from_file(openai_files[\"vocab\"], openai_files[\"merges\"])\n        multiprocessing_with_parallelism(tokenizer, False)\n        multiprocessing_with_parallelism(tokenizer, True)\n\n    def test_train_from_iterator(self):\n        text = [\"A first sentence\", \"Another sentence\", \"And a last one\"]\n        tokenizer = CharBPETokenizer()\n        tokenizer.train_from_iterator(text, show_progress=False)\n\n        output = tokenizer.encode(\"A sentence\")\n        assert output.tokens == [\"A</w>\", \"sentence</w>\"]\n"
  },
  {
    "path": "bindings/python/tests/implementations/test_sentencepiece.py",
    "content": "import pytest\n\nfrom tokenizers import SentencePieceBPETokenizer, SentencePieceUnigramTokenizer\n\n\nclass TestSentencePieceBPE:\n    def test_train_from_iterator(self):\n        text = [\"A first sentence\", \"Another sentence\", \"And a last one\"]\n        tokenizer = SentencePieceBPETokenizer()\n        tokenizer.train_from_iterator(text, show_progress=False)\n\n        output = tokenizer.encode(\"A sentence\")\n        assert output.tokens == [\"▁A\", \"▁sentence\"]\n\n\nclass TestSentencePieceUnigram:\n    def test_train(self, tmpdir):\n        p = tmpdir.mkdir(\"tmpdir\").join(\"file.txt\")\n        p.write(\"A first sentence\\nAnother sentence\\nAnd a last one\")\n\n        tokenizer = SentencePieceUnigramTokenizer()\n        tokenizer.train(files=str(p), show_progress=False)\n\n        output = tokenizer.encode(\"A sentence\")\n        assert output.tokens == [\"▁A\", \"▁\", \"s\", \"en\", \"t\", \"en\", \"c\", \"e\"]\n\n        with pytest.raises(Exception) as excinfo:\n            _ = tokenizer.encode(\"A sentence 🤗\")\n        assert str(excinfo.value) == \"Encountered an unknown token but `unk_id` is missing\"\n\n    def test_train_with_unk_token(self, tmpdir):\n        p = tmpdir.mkdir(\"tmpdir\").join(\"file.txt\")\n        p.write(\"A first sentence\\nAnother sentence\\nAnd a last one\")\n\n        tokenizer = SentencePieceUnigramTokenizer()\n        tokenizer.train(files=str(p), show_progress=False, special_tokens=[\"<unk>\"], unk_token=\"<unk>\")\n        output = tokenizer.encode(\"A sentence 🤗\")\n        assert output.ids[-1] == 0\n        assert output.tokens == [\"▁A\", \"▁\", \"s\", \"en\", \"t\", \"en\", \"c\", \"e\", \"▁\", \"🤗\"]\n\n    def test_train_from_iterator(self):\n        text = [\"A first sentence\", \"Another sentence\", \"And a last one\"]\n        tokenizer = SentencePieceUnigramTokenizer()\n        tokenizer.train_from_iterator(text, show_progress=False)\n\n        output = tokenizer.encode(\"A sentence\")\n        assert output.tokens == [\"▁A\", \"▁\", \"s\", \"en\", \"t\", \"en\", \"c\", \"e\"]\n\n        with pytest.raises(Exception) as excinfo:\n            _ = tokenizer.encode(\"A sentence 🤗\")\n        assert str(excinfo.value) == \"Encountered an unknown token but `unk_id` is missing\"\n\n    def test_train_from_iterator_with_unk_token(self):\n        text = [\"A first sentence\", \"Another sentence\", \"And a last one\"]\n        tokenizer = SentencePieceUnigramTokenizer()\n        tokenizer.train_from_iterator(\n            text, vocab_size=100, show_progress=False, special_tokens=[\"<unk>\"], unk_token=\"<unk>\"\n        )\n        output = tokenizer.encode(\"A sentence 🤗\")\n        assert output.ids[-1] == 0\n        assert output.tokens == [\"▁A\", \"▁\", \"s\", \"en\", \"t\", \"en\", \"c\", \"e\", \"▁\", \"🤗\"]\n"
  },
  {
    "path": "bindings/python/tests/test_serialization.py",
    "content": "import json\nimport os\nimport unittest\n\nimport tqdm\nfrom huggingface_hub import hf_hub_download\nfrom tokenizers import Tokenizer\nfrom tokenizers.models import BPE, Unigram\n\nfrom .utils import albert_base, data_dir\n\n\nclass TestSerialization:\n    def test_full_serialization_albert(self, albert_base):\n        # Check we can read this file.\n        # This used to fail because of BufReader that would fail because the\n        # file exceeds the buffer capacity\n        Tokenizer.from_file(albert_base)\n\n    def test_str_big(self, albert_base):\n        tokenizer = Tokenizer.from_file(albert_base)\n        assert (\n            str(tokenizer)\n            == \"\"\"Tokenizer(version=\"1.0\", truncation=None, padding=None, added_tokens=[{\"id\":0, \"content\":\"<pad>\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, ...}, {\"id\":1, \"content\":\"<unk>\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, ...}, {\"id\":2, \"content\":\"[CLS]\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, ...}, {\"id\":3, \"content\":\"[SEP]\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, ...}, {\"id\":4, \"content\":\"[MASK]\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, ...}], normalizer=Sequence(normalizers=[Replace(pattern=String(\"``\"), content=\"\\\"\"), Replace(pattern=String(\"''\"), content=\"\\\"\"), NFKD(), StripAccents(), Lowercase(), ...]), pre_tokenizer=Sequence(pretokenizers=[WhitespaceSplit(), Metaspace(replacement=\"▁\", prepend_scheme=always, split=True)]), post_processor=TemplateProcessing(single=[SpecialToken(id=\"[CLS]\", type_id=0), Sequence(id=A, type_id=0), SpecialToken(id=\"[SEP]\", type_id=0)], pair=[SpecialToken(id=\"[CLS]\", type_id=0), Sequence(id=A, type_id=0), SpecialToken(id=\"[SEP]\", type_id=0), Sequence(id=B, type_id=1), SpecialToken(id=\"[SEP]\", type_id=1)], special_tokens={\"[CLS]\":SpecialToken(id=\"[CLS]\", ids=[2], tokens=[\"[CLS]\"]), \"[SEP]\":SpecialToken(id=\"[SEP]\", ids=[3], tokens=[\"[SEP]\"])}), decoder=Metaspace(replacement=\"▁\", prepend_scheme=always, split=True), model=Unigram(unk_id=1, vocab=[(\"<pad>\", 0), (\"<unk>\", 0), (\"[CLS]\", 0), (\"[SEP]\", 0), (\"[MASK]\", 0), ...], byte_fallback=False))\"\"\"\n        )\n\n    def test_repr_str(self):\n        tokenizer = Tokenizer(BPE())\n        tokenizer.add_tokens([\"my\"])\n        assert (\n            repr(tokenizer)\n            == \"\"\"Tokenizer(version=\"1.0\", truncation=None, padding=None, added_tokens=[{\"id\":0, \"content\":\"my\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, \"normalized\":True, \"special\":False}], normalizer=None, pre_tokenizer=None, post_processor=None, decoder=None, model=BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[]))\"\"\"\n        )\n        assert (\n            str(tokenizer)\n            == \"\"\"Tokenizer(version=\"1.0\", truncation=None, padding=None, added_tokens=[{\"id\":0, \"content\":\"my\", \"single_word\":False, \"lstrip\":False, \"rstrip\":False, ...}], normalizer=None, pre_tokenizer=None, post_processor=None, decoder=None, model=BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[]))\"\"\"\n        )\n\n    def test_repr_str_ellipsis(self):\n        model = BPE()\n        assert (\n            repr(model)\n            == \"\"\"BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[])\"\"\"\n        )\n        assert (\n            str(model)\n            == \"\"\"BPE(dropout=None, unk_token=None, continuing_subword_prefix=None, end_of_word_suffix=None, fuse_unk=False, byte_fallback=False, ignore_merges=False, vocab={}, merges=[])\"\"\"\n        )\n\n        vocab = [\n            (\"A\", 0.0),\n            (\"B\", -0.01),\n            (\"C\", -0.02),\n            (\"D\", -0.03),\n            (\"E\", -0.04),\n        ]\n        # No ellispsis yet\n        model = Unigram(vocab, 0, byte_fallback=False)\n        assert (\n            repr(model)\n            == \"\"\"Unigram(unk_id=0, vocab=[(\"A\", 0), (\"B\", -0.01), (\"C\", -0.02), (\"D\", -0.03), (\"E\", -0.04)], byte_fallback=False)\"\"\"\n        )\n        assert (\n            str(model)\n            == \"\"\"Unigram(unk_id=0, vocab=[(\"A\", 0), (\"B\", -0.01), (\"C\", -0.02), (\"D\", -0.03), (\"E\", -0.04)], byte_fallback=False)\"\"\"\n        )\n\n        # Ellispis for longer than 5 elements only on `str`.\n        vocab = [\n            (\"A\", 0.0),\n            (\"B\", -0.01),\n            (\"C\", -0.02),\n            (\"D\", -0.03),\n            (\"E\", -0.04),\n            (\"F\", -0.04),\n        ]\n        model = Unigram(vocab, 0, byte_fallback=False)\n        assert (\n            repr(model)\n            == \"\"\"Unigram(unk_id=0, vocab=[(\"A\", 0), (\"B\", -0.01), (\"C\", -0.02), (\"D\", -0.03), (\"E\", -0.04), (\"F\", -0.04)], byte_fallback=False)\"\"\"\n        )\n        assert (\n            str(model)\n            == \"\"\"Unigram(unk_id=0, vocab=[(\"A\", 0), (\"B\", -0.01), (\"C\", -0.02), (\"D\", -0.03), (\"E\", -0.04), ...], byte_fallback=False)\"\"\"\n        )\n\n\ndef check(tokenizer_file) -> bool:\n    with open(tokenizer_file, \"r\") as f:\n        data = json.load(f)\n    if \"pre_tokenizer\" not in data:\n        return True\n    if \"type\" not in data[\"pre_tokenizer\"]:\n        return False\n    if data[\"pre_tokenizer\"][\"type\"] == \"Sequence\":\n        for pre_tok in data[\"pre_tokenizer\"][\"pretokenizers\"]:\n            if \"type\" not in pre_tok:\n                return False\n    return True\n\n\ndef slow(test_case):\n    \"\"\"\n    Decorator marking a test as slow.\n\n    Slow tests are skipped by default. Set the RUN_SLOW environment variable to a truthy value to run them.\n\n    \"\"\"\n    if os.getenv(\"RUN_SLOW\") != \"1\":\n        return unittest.skip(\"use `RUN_SLOW=1` to run\")(test_case)\n    else:\n        return test_case\n\n\n@slow\nclass TestFullDeserialization(unittest.TestCase):\n    def test_full_deserialization_hub(self):\n        # Check we can read this file.\n        # This used to fail because of BufReader that would fail because the\n        # file exceeds the buffer capacity\n        not_loadable = []\n        invalid_pre_tokenizer = []\n\n        # models = api.list_models(filter=\"transformers\")\n        # for model in tqdm.tqdm(models):\n        #     model_id = model.modelId\n        #     for model_file in model.siblings:\n        #         filename = model_file.rfilename\n        #         if filename == \"tokenizer.json\":\n        #             all_models.append((model_id, filename))\n\n        all_models = [(\"HueyNemud/das22-10-camembert_pretrained\", \"tokenizer.json\")]\n        for model_id, filename in tqdm.tqdm(all_models):\n            tokenizer_file = hf_hub_download(model_id, filename=filename)\n\n            is_ok = check(tokenizer_file)\n            if not is_ok:\n                print(f\"{model_id} is affected by no type\")\n                invalid_pre_tokenizer.append(model_id)\n            try:\n                Tokenizer.from_file(tokenizer_file)\n            except Exception as e:\n                print(f\"{model_id} is not loadable: {e}\")\n                not_loadable.append(model_id)\n            except:  # noqa: E722\n                print(f\"{model_id} is not loadable: Rust error\")\n                not_loadable.append(model_id)\n\n            self.assertEqual(invalid_pre_tokenizer, [])\n            self.assertEqual(not_loadable, [])\n"
  },
  {
    "path": "bindings/python/tests/utils.py",
    "content": "import multiprocessing as mp\nimport os\n\nimport pytest\n\nimport requests\n\n\nDATA_PATH = os.path.join(\"tests\", \"data\")\n\n\ndef download(url, with_filename=None):\n    filename = with_filename if with_filename is not None else url.rsplit(\"/\")[-1]\n    filepath = os.path.join(DATA_PATH, filename)\n    if not os.path.exists(filepath):\n        with open(filepath, \"wb\") as f:\n            response = requests.get(url, stream=True)\n            response.raise_for_status()\n            for chunk in response.iter_content(1024):\n                f.write(chunk)\n    return filepath\n\n\n@pytest.fixture(scope=\"session\")\ndef data_dir():\n    assert os.getcwd().endswith(\"python\")\n    exist = os.path.exists(DATA_PATH) and os.path.isdir(DATA_PATH)\n    if not exist:\n        os.mkdir(DATA_PATH)\n\n\n@pytest.fixture(scope=\"session\")\ndef roberta_files(data_dir):\n    return {\n        \"vocab\": download(\"https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-vocab.json\"),\n        \"merges\": download(\"https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-merges.txt\"),\n    }\n\n\n@pytest.fixture(scope=\"session\")\ndef bert_files(data_dir):\n    return {\n        \"vocab\": download(\"https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt\"),\n    }\n\n\n@pytest.fixture(scope=\"session\")\ndef openai_files(data_dir):\n    return {\n        \"vocab\": download(\"https://s3.amazonaws.com/models.huggingface.co/bert/openai-gpt-vocab.json\"),\n        \"merges\": download(\"https://s3.amazonaws.com/models.huggingface.co/bert/openai-gpt-merges.txt\"),\n    }\n\n\n@pytest.fixture(scope=\"session\")\ndef train_files(data_dir):\n    big = download(\"https://norvig.com/big.txt\")\n    small = os.path.join(DATA_PATH, \"small.txt\")\n    with open(small, \"w\") as f:\n        with open(big, \"r\") as g:\n            for i, line in enumerate(g):\n                f.write(line)\n                if i > 100:\n                    break\n    return {\n        \"small\": small,\n        \"big\": big,\n    }\n\n\n@pytest.fixture(scope=\"session\")\ndef albert_base(data_dir):\n    return download(\"https://s3.amazonaws.com/models.huggingface.co/bert/albert-base-v1-tokenizer.json\")\n\n\n@pytest.fixture(scope=\"session\")\ndef doc_wiki_tokenizer(data_dir):\n    return download(\n        \"https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-quicktour/tokenizer.json\",\n        \"tokenizer-wiki.json\",\n    )\n\n\n@pytest.fixture(scope=\"session\")\ndef doc_pipeline_bert_tokenizer(data_dir):\n    return download(\n        \"https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-pipeline/tokenizer.json\",\n        \"bert-wiki.json\",\n    )\n\n\n# On MacOS Python 3.8+ the default was modified to `spawn`, we need `fork` in tests.\nmp.set_start_method(\"fork\")\n\n\ndef multiprocessing_with_parallelism(tokenizer, enabled: bool):\n    \"\"\"\n    This helper can be used to test that disabling parallelism avoids dead locks when the\n    same tokenizer is used after forking.\n    \"\"\"\n    # It's essential to this test that we call 'encode' or 'encode_batch'\n    # before the fork. This causes the main process to \"lock\" some resources\n    # provided by the Rust \"rayon\" crate that are needed for parallel processing.\n    tokenizer.encode(\"Hi\")\n    tokenizer.encode_batch([\"hi\", \"there\"])\n\n    def encode(tokenizer):\n        tokenizer.encode(\"Hi\")\n        tokenizer.encode_batch([\"hi\", \"there\"])\n\n    # Make sure this environment variable is set before the fork happens\n    os.environ[\"TOKENIZERS_PARALLELISM\"] = str(enabled)\n    p = mp.Process(target=encode, args=(tokenizer,))\n    p.start()\n    p.join(timeout=1)\n\n    # At this point the process should have successfully exited, depending on whether parallelism\n    # was activated or not. So we check the status and kill it if needed\n    alive = p.is_alive()\n    if alive:\n        p.terminate()\n\n    assert (alive and mp.get_start_method() == \"fork\") == enabled\n"
  },
  {
    "path": "bindings/python/tools/stub-gen/Cargo.toml",
    "content": "[package]\nname = \"stub-gen\"\nversion = \"0.1.0\"\nedition = \"2021\"\ndescription = \"Stub generation tool for tokenizers Python bindings\"\n\n[[bin]]\nname = \"stub-gen\"\npath = \"src/main.rs\"\n\n[dependencies]\nenv_logger = \"0.11\"\npyo3 = { version = \"0.27.2\", default-features = false, features = [\"auto-initialize\"] }\npyo3-introspection = \"0.27.2\"\n"
  },
  {
    "path": "bindings/python/tools/stub-gen/src/main.rs",
    "content": "use pyo3::prelude::*;\nuse pyo3::types::PyList;\nuse std::ffi::OsString;\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    env_logger::try_init().ok();\n\n    let manifest_dir = find_manifest_dir()?;\n    let cdylib = manifest_dir.join(\"tokenizers.abi3.so\");\n    let out_dir = manifest_dir.join(\"py_src/tokenizers\");\n\n    build_extension(&manifest_dir)?;\n    refresh_cdylib(&manifest_dir, &cdylib)?;\n    setup_python_env()?;\n    generate_stubs(&cdylib, &out_dir)?;\n    Ok(())\n}\n\n/// Set up PYTHONHOME environment variable if not already set.\n/// This is needed for PyO3 embedded Python to find the standard library,\n/// especially when using virtual environments created by uv.\nfn setup_python_env() -> Result<(), Box<dyn std::error::Error>> {\n    if std::env::var_os(\"PYTHONHOME\").is_some() {\n        return Ok(());\n    }\n\n    // Query Python for its base_prefix (the actual Python installation, not venv)\n    let output = Command::new(\"python3\")\n        .args([\"-c\", \"import sys; print(sys.base_prefix, end='')\"])\n        .output()?;\n\n    if !output.status.success() {\n        return Err(\"Failed to query Python base_prefix\".into());\n    }\n\n    let base_prefix = String::from_utf8(output.stdout)?;\n    if !base_prefix.is_empty() {\n        println!(\"Setting PYTHONHOME={}\", base_prefix);\n        std::env::set_var(\"PYTHONHOME\", &base_prefix);\n    }\n\n    Ok(())\n}\n\nfn find_manifest_dir() -> Result<PathBuf, Box<dyn std::error::Error>> {\n    // Look for the bindings/python directory relative to current working directory\n    // or from the tool's location\n    let cwd = std::env::current_dir()?;\n\n    // Check if we're already in bindings/python\n    if cwd.join(\"pyproject.toml\").exists() && cwd.join(\"py_src\").exists() {\n        return Ok(cwd);\n    }\n\n    // Check if bindings/python exists relative to cwd\n    let bindings_python = cwd.join(\"bindings/python\");\n    if bindings_python.join(\"pyproject.toml\").exists() {\n        return Ok(bindings_python);\n    }\n\n    // Try to find it from the executable location\n    if let Ok(exe) = std::env::current_exe() {\n        // Go up from tools/stub-gen/target/... to bindings/python\n        let mut path = exe.as_path();\n        for _ in 0..10 {\n            if let Some(parent) = path.parent() {\n                if parent.join(\"pyproject.toml\").exists() && parent.join(\"py_src\").exists() {\n                    return Ok(parent.to_path_buf());\n                }\n                path = parent;\n            }\n        }\n    }\n\n    Err(\"Could not find bindings/python directory. Run from the tokenizers root or bindings/python directory.\".into())\n}\n\nfn generate_stubs(cdylib: &Path, out_dir: &Path) -> Result<(), Box<dyn std::error::Error>> {\n    if !cdylib.is_file() {\n        return Err(format!(\"Failed to locate cdylib at {}\", cdylib.display()).into());\n    }\n\n    println!(\"Initializing python\");\n    Python::initialize();\n    let cdylib = cdylib.to_path_buf();\n    let out_dir = out_dir.to_path_buf();\n\n    Python::attach(|py| -> PyResult<()> {\n        println!(\"Gathering Python environment information...\");\n        let sys = py.import(\"sys\")?;\n        println!(\"sys.version = {}\", sys.getattr(\"version\")?);\n        println!(\"sys.executable = {}\", sys.getattr(\"executable\")?);\n        println!(\"sys.prefix = {}\", sys.getattr(\"prefix\")?);\n        println!(\"sys.base_prefix = {}\", sys.getattr(\"base_prefix\")?);\n\n        let so_dir = cdylib\n            .parent()\n            .unwrap_or_else(|| Path::new(\".\"))\n            .to_path_buf();\n\n        let bindings = sys.getattr(\"path\")?;\n        let sys_path = bindings.cast::<PyList>()?;\n        sys_path.insert(0, so_dir.to_str().unwrap())?;\n\n        let old = std::env::var_os(\"PYTHONPATH\");\n        let mut new = OsString::new();\n        new.push(&so_dir);\n        if let Some(old) = old {\n            new.push(\":\");\n            new.push(old);\n        }\n        std::env::set_var(\"PYTHONPATH\", &new);\n        println!(\"New PYTHONPATH={:?}\", std::env::var_os(\"PYTHONPATH\"));\n        let sysconfig = PyModule::import(py, \"sysconfig\")?;\n        let python_version = sysconfig.call_method0(\"get_python_version\")?;\n        println!(\"Using python version: {}\", python_version);\n        let python_lib = sysconfig.call_method(\"get_config_var\", (\"LIBDEST\",), None)?;\n        println!(\"Using python lib: {}\", python_lib);\n        let python_site_packages = sysconfig.call_method(\"get_path\", (\"purelib\",), None)?;\n        println!(\"Using python site-packages: {}\", python_site_packages);\n        py.run(\n            c\"import tokenizers; import sys; print('import ok:', tokenizers.__file__); print('sys.path[0]=', sys.path[0])\",\n            None,\n            None,\n        )\n        .unwrap_or_else(|e| panic!(\"Failed to import tokenizers: {:?}\", e));\n\n        println!(\"Generating stub files\");\n        assert!(\n            cdylib.is_file(),\n            \"Failed to locate cdylib at {}\",\n            cdylib.display()\n        );\n        println!(\"Found cdylib at {}\", cdylib.display());\n\n        let main_module_name = \"tokenizers\";\n        let python_module = pyo3_introspection::introspect_cdylib(&cdylib, main_module_name)\n            .unwrap_or_else(|_| panic!(\"Failed introspection of {}\", main_module_name));\n        let type_stubs = pyo3_introspection::module_stub_files(&python_module);\n\n        for (rel_path, contents) in type_stubs {\n            let out_path = out_dir.join(&rel_path);\n            if let Some(parent) = out_path.parent() {\n                std::fs::create_dir_all(parent)\n                    .unwrap_or_else(|_| panic!(\"Failed introspection of {}\", main_module_name))\n            }\n            std::fs::write(&out_path, contents).expect(\"Failed to write stubs file\");\n            println!(\"Generated stub: {}\", out_path.display());\n        }\n\n        Ok(())\n    })?;\n\n    Ok(())\n}\n\nfn build_extension(manifest_dir: &Path) -> Result<(), Box<dyn std::error::Error>> {\n    println!(\"Building and installing extension (release)...\");\n    let status = Command::new(\"maturin\")\n        .current_dir(manifest_dir)\n        .args([\"develop\", \"--release\"])\n        .status()?;\n\n    if !status.success() {\n        return Err(\"`maturin develop` failed\".into());\n    }\n\n    Ok(())\n}\n\nfn refresh_cdylib(manifest_dir: &Path, cdylib: &Path) -> Result<(), Box<dyn std::error::Error>> {\n    let built_cdylib = manifest_dir.join(format!(\n        \"target/release/{}tokenizers.{}\",\n        std::env::consts::DLL_PREFIX,\n        std::env::consts::DLL_EXTENSION\n    ));\n\n    if !built_cdylib.is_file() {\n        return Err(format!(\n            \"Could not find built cdylib at {}.\",\n            built_cdylib.display()\n        )\n        .into());\n    }\n\n    println!(\n        \"Refreshing cdylib used for introspection: {}\",\n        cdylib.display()\n    );\n    std::fs::copy(&built_cdylib, cdylib)?;\n    Ok(())\n}\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for those with `?=`\nSPHINXOPTS    ?=\nSPHINXBUILD   ?= sphinx-build\nBUILDDIR      ?= build\nSOURCEDIR      = source\n\n# Put it first so that \"make\" without argument is like \"make html_all\".\nhtml_all:\n\t@echo \"Generating doc for Rust\"\n\t@$(SPHINXBUILD) -M html \"$(SOURCEDIR)\" \"$(BUILDDIR)/rust\" $(SPHINXOPTS) $(O) -t rust\n\t@echo \"Generating doc for Python\"\n\t@$(SPHINXBUILD) -M html \"$(SOURCEDIR)\" \"$(BUILDDIR)/python\" $(SPHINXOPTS) $(O) -t python\n\t@echo \"Generating doc for Node.js\"\n\t@$(SPHINXBUILD) -M html \"$(SOURCEDIR)\" \"$(BUILDDIR)/node\" $(SPHINXOPTS) $(O) -t node\n\n.PHONY: html_all Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/README.md",
    "content": "## Requirements\n\nIn order to generate the documentation, it is necessary to have a Python environment with the\nfollowing:\n```python\npip install sphinx sphinx_rtd_theme setuptools_rust\n```\n\nIt is also necessary to have the `tokenizers` library in this same environment, for Sphinx to\ngenerate all the API Reference and links properly.  If you want to visualize the documentation with\nsome modifications made to the Python bindings, make sure you build it from source.\n\n## Building the documentation\n\nOnce everything is setup, you can build the documentation automatically for all the languages\nusing the following command in the `/docs` folder:\n\n```bash\nmake html_all\n```\n\nIf you want to build only for a specific language, you can use:\n\n```bash\nmake html O=\"-t python\"\n```\n\n(Replacing `python` by the target language among `rust`, `node`, and `python`)\n\n\n**NOTE**\n\nIf you are making any structural change to the documentation, it is recommended to clean the build\ndirectory before rebuilding:\n\n```bash\nmake clean && make html_all\n```\n"
  },
  {
    "path": "docs/source/_ext/entities.py",
    "content": "from collections import defaultdict, abc\nfrom typing import cast\n\nfrom docutils import nodes\nfrom docutils.parsers.rst import Directive\n\nimport sphinx\nfrom sphinx.locale import _\nfrom sphinx.util.docutils import SphinxDirective\nfrom sphinx.errors import ExtensionError\n\nfrom conf import languages as LANGUAGES\n\nlogger = sphinx.util.logging.getLogger(__name__)\n\nGLOBALNAME = \"$GLOBAL$\"\n\n\ndef update(d, u):\n    for k, v in u.items():\n        if isinstance(v, abc.Mapping):\n            d[k] = update(d.get(k, {}), v)\n        else:\n            d[k] = v\n    return d\n\n\nclass EntityNode(nodes.General, nodes.Element):\n    pass\n\n\nclass EntitiesNode(nodes.General, nodes.Element):\n    pass\n\n\nclass AllEntities:\n    def __init__(self):\n        self.entities = defaultdict(dict)\n\n    @classmethod\n    def install(cls, env):\n        if not hasattr(env, \"entity_all_entities\"):\n            entities = cls()\n            env.entity_all_entities = entities\n        return env.entity_all_entities\n\n    def merge(self, other):\n        self.entities.update(other.entities)\n\n    def purge(self, docname):\n        for env_docname in [GLOBALNAME, docname]:\n            self.entities[env_docname] = dict(\n                [\n                    (name, entity)\n                    for name, entity in self.entities[env_docname].items()\n                    if entity[\"docname\"] != docname\n                ]\n            )\n\n    def _extract_entities(self, nodes):\n        pass\n\n    def _extract_options(self, nodes):\n        pass\n\n    def _add_entities(self, entities, language, is_global, docname):\n        scope = GLOBALNAME if is_global else docname\n        for entity in entities:\n            name = f'{language}-{entity[\"name\"]}'\n            content = entity[\"content\"]\n\n            if name in self.entities[scope]:\n                logger.warning(\n                    f'Entity \"{name}\" has already been defined{\" globally\" if is_global else \"\"}',\n                    location=docname,\n                )\n\n            self.entities[scope][name] = {\"docname\": docname, \"content\": content}\n\n    def _extract_global(self, nodes):\n        for node in nodes:\n            if node.tagname != \"field\":\n                raise Exception(f\"Expected a field, found {node.tagname}\")\n\n            name, _ = node.children\n            if name.tagname != \"field_name\":\n                raise Exception(f\"Expected a field name here, found {name_node.tagname}\")\n\n            if str(name.children[0]) == \"global\":\n                return True\n\n    def _extract_entities(self, nodes):\n        entities = []\n        for node in nodes:\n            if node.tagname != \"definition_list_item\":\n                raise Exception(f\"Expected a list item here, found {node.tagname}\")\n\n            name_node, content_node = node.children\n            if name_node.tagname != \"term\":\n                raise Exception(f\"Expected a term here, found {name_node.tagname}\")\n            if content_node.tagname != \"definition\":\n                raise Exception(f\"Expected a definition here, found {content_node.tagname}\")\n\n            name = str(name_node.children[0])\n            if len(content_node.children) == 1 and content_node.children[0].tagname == \"paragraph\":\n                content = content_node.children[0].children[0]\n            else:\n                content = content_node\n\n            entities.append({\"name\": name, \"content\": content})\n        return entities\n\n    def extract(self, node, docname):\n        is_global = False\n        entities = []\n\n        language = None\n        for node in node.children:\n            if language is None and node.tagname != \"paragraph\":\n                raise Exception(f\"Expected language name:\\n.. entities:: <LANGUAGE>\")\n            elif language is None and node.tagname == \"paragraph\":\n                language = str(node.children[0])\n                if language not in LANGUAGES:\n                    raise Exception(\n                        f'Unknown language \"{language}. Might be missing a newline after language\"'\n                    )\n            elif node.tagname == \"field_list\":\n                is_global = self._extract_global(node.children)\n            elif node.tagname == \"definition_list\":\n                entities.extend(self._extract_entities(node.children))\n            else:\n                raise Exception(f\"Expected a list of terms/options, found {node.tagname}\")\n\n        self._add_entities(entities, language, is_global, docname)\n\n    def resolve_pendings(self, app):\n        env = app.builder.env\n\n        updates = defaultdict(dict)\n        for env_docname in self.entities.keys():\n            for name, entity in self.entities[env_docname].items():\n                docname = entity[\"docname\"]\n                node = entity[\"content\"]\n\n                for node in node.traverse(sphinx.addnodes.pending_xref):\n                    contnode = cast(nodes.TextElement, node[0].deepcopy())\n                    newnode = None\n\n                    typ = node[\"reftype\"]\n                    target = node[\"reftarget\"]\n                    refdoc = node.get(\"refdoc\", docname)\n                    domain = None\n\n                    try:\n                        if \"refdomain\" in node and node[\"refdomain\"]:\n                            # let the domain try to resolve the reference\n                            try:\n                                domain = env.domains[node[\"refdomain\"]]\n                            except KeyError as exc:\n                                raise NoUri(target, typ) from exc\n                            newnode = domain.resolve_xref(\n                                env, refdoc, app.builder, typ, target, node, contnode\n                            )\n                    except NoUri:\n                        newnode = contnode\n\n                    updates[env_docname][name] = {\n                        \"docname\": docname,\n                        \"content\": newnode or contnode,\n                    }\n\n        update(self.entities, updates)\n\n    def get(self, language, name, docname):\n        name = f\"{language}-{name}\"\n        if name in self.entities[docname]:\n            return self.entities[docname][name]\n        elif name in self.entities[GLOBALNAME]:\n            return self.entities[GLOBALNAME][name]\n        else:\n            return None\n\n\nclass EntitiesDirective(SphinxDirective):\n    has_content = True\n\n    def run(self):\n        content = nodes.definition_list()\n        self.state.nested_parse(self.content, self.content_offset, content)\n\n        try:\n            entities = AllEntities.install(self.env)\n            entities.extract(content, self.env.docname)\n        except Exception as err:\n            raise self.error(f'Malformed directive \"entities\": {err}')\n\n        return []\n\n\ndef entity_role(name, rawtext, text, lineno, inliner, options={}, content=[]):\n    node = EntityNode()\n    node.entity = text\n\n    return [node], []\n\n\ndef process_entity_nodes(app, doctree, docname):\n    \"\"\" Replace all the entities by their content \"\"\"\n    env = app.builder.env\n\n    entities = AllEntities.install(env)\n    entities.resolve_pendings(app)\n\n    language = None\n    try:\n        language = next(l for l in LANGUAGES if l in app.tags)\n    except Exception:\n        logger.warning(f\"No language tag specified, not resolving entities in {docname}\")\n\n    for node in doctree.traverse(EntityNode):\n        if language is None:\n            node.replace_self(nodes.Text(_(node.entity), _(node.entity)))\n        else:\n            entity = entities.get(language, node.entity, docname)\n            if entity is None:\n                node.replace_self(nodes.Text(_(node.entity), _(node.entity)))\n                logger.warning(f'Entity \"{node.entity}\" has not been defined', location=node)\n            else:\n                node.replace_self(entity[\"content\"])\n\n\ndef purge_entities(app, env, docname):\n    \"\"\" Purge any entity that comes from the given docname \"\"\"\n    entities = AllEntities.install(env)\n    entities.purge(docname)\n\n\ndef merge_entities(app, env, docnames, other):\n    \"\"\" Merge multiple environment entities \"\"\"\n    entities = AllEntities.install(env)\n    other_entities = AllEntities.install(other)\n    entities.merge(other_entities)\n\n\ndef setup(app):\n    app.add_node(EntityNode)\n    app.add_node(EntitiesNode)\n    app.add_directive(\"entities\", EntitiesDirective)\n    app.add_role(\"entity\", entity_role)\n\n    app.connect(\"doctree-resolved\", process_entity_nodes)\n    app.connect(\"env-merge-info\", merge_entities)\n    app.connect(\"env-purge-doc\", purge_entities)\n\n    return {\n        \"version\": \"0.1\",\n        \"parallel_read_safe\": True,\n        \"parallel_write_safe\": True,\n    }\n"
  },
  {
    "path": "docs/source/_ext/rust_doc.py",
    "content": "from docutils import nodes\n\nimport sphinx\nfrom sphinx.locale import _\n\nfrom conf import rust_version\n\nlogger = sphinx.util.logging.getLogger(__name__)\n\n\nclass RustRef:\n    def __call__(self, name, rawtext, text, lineno, inliner, options={}, content=[]):\n        doctype = name.split(\"_\")[1]\n        parts = text.split(\"::\")\n\n        if text.startswith(\"~\"):\n            title = parts[-1]\n            parts[0] = parts[0][1:]\n        else:\n            content = text\n        link = self.base_link()\n\n        if doctype == \"struct\":\n            l, title = self.make_struct_link(parts, title)\n        if doctype == \"func\":\n            l, title = self.make_func_link(parts, title)\n        if doctype == \"meth\":\n            l, title = self.make_meth_link(parts, title)\n        if doctype == \"trait\":\n            l, title = self.make_trait_link(parts, title)\n        link += l\n\n        node = nodes.reference(internal=False, refuri=link, text=title)\n        wrapper = nodes.literal(classes=[\"xref\"])\n        wrapper += node\n\n        return [wrapper], []\n\n    def base_link(self):\n        return f\"https://docs.rs/tokenizers/{rust_version}\"\n\n    def make_struct_link(self, parts, title):\n        link = \"\"\n        struct_name = parts[-1]\n        path = parts[:-1]\n\n        for p in path:\n            link += f\"/{p}\"\n        link += f\"/struct.{struct_name}.html\"\n\n        return link, title\n\n    def make_func_link(self, parts, title):\n        link = \"\"\n        fn_name = parts[-1]\n\n        path = parts[:-1]\n        for p in path:\n            link += f\"/{p}\"\n        link += f\"/fn.{fn_name}.html\"\n\n        return link, title\n\n    def make_meth_link(self, parts, title):\n        meth_name = parts[-1]\n        if meth_name.endswith(\"()\"):\n            meth_name = meth_name[:-2]\n\n        link, title = self.make_struct_link(parts[:-1], title)\n        link += f\"#method.{meth_name}\"\n\n        if not title.endswith(\")\"):\n            title += \"()\"\n\n        return link, title\n\n    def make_trait_link(self, parts, title):\n        link = \"\"\n        trait_name = parts[-1]\n\n        path = parts[:-1]\n        for p in path:\n            link += f\"/{p}\"\n        link += f\"/trait.{trait_name}.html\"\n\n        return link, title\n\n\ndef setup(app):\n    app.add_role(\"rust_struct\", RustRef())\n    app.add_role(\"rust_func\", RustRef())\n    app.add_role(\"rust_meth\", RustRef())\n    app.add_role(\"rust_trait\", RustRef())\n\n    return {\n        \"version\": \"0.1\",\n        \"parallel_read_safe\": True,\n        \"parallel_write_safe\": True,\n    }\n"
  },
  {
    "path": "docs/source/_ext/toctree_tags.py",
    "content": "import re\nfrom sphinx.directives.other import TocTree\n\n\nclass TocTreeTags(TocTree):\n    hasPat = re.compile(\"^\\s*:(.+):(.+)$\")\n\n    def filter_entries(self, entries):\n        filtered = []\n        for e in entries:\n            m = self.hasPat.match(e)\n            if m != None:\n                if self.env.app.tags.has(m.groups()[0]):\n                    filtered.append(m.groups()[1])\n            else:\n                filtered.append(e)\n        return filtered\n\n    def run(self):\n        self.content = self.filter_entries(self.content)\n        return super().run()\n\n\ndef setup(app):\n    app.add_directive(\"toctree-tags\", TocTreeTags)\n\n    return {\n        \"version\": \"0.1\",\n    }\n"
  },
  {
    "path": "docs/source/_static/css/code-snippets.css",
    "content": "\n.highlight .c1, .highlight .sd{\n    color: #999\n}\n\n.highlight .nn, .highlight .k, .highlight .s1, .highlight .nb, .highlight .bp, .highlight .kc, .highlight .kt {\n    color: #FB8D68;\n}\n\n.highlight .kn, .highlight .nv, .highlight .s2, .highlight .ow, .highlight .kd, .highlight .kr, .highlight .s {\n    color: #6670FF;\n}\n\n.highlight .gp {\n    color: #FB8D68;\n}\n"
  },
  {
    "path": "docs/source/_static/css/huggingface.css",
    "content": "/* Our DOM objects */\n\n/* Version control */\n\n.selectors {\n    margin-bottom: 10px;\n}\n\n.dropdown-button {\n    display: inline-block;\n    width: 50%;\n    background-color: #6670FF;\n    color: white;\n    border: none;\n    padding: 5px;\n    font-size: 15px;\n    cursor: pointer;\n}\n\n.dropdown-button:hover, .dropdown-button:focus, .dropdown-button.active {\n    background-color: #A6B0FF;\n}\n\n.dropdown-button.active {\n    background-color: #7988FF;\n}\n\n.menu-dropdown {\n    display: none;\n    background-color: #7988FF;\n    min-width: 160px;\n    overflow: auto;\n    font-size: 15px;\n    padding: 10px 0;\n}\n\n.menu-dropdown a {\n    color: white;\n    padding: 3px 4px;\n    text-decoration: none;\n    display: block;\n}\n\n.menu-dropdown a:hover {\n    background-color: #A6B0FF;\n}\n\n.dropdown-link.active {\n    background-color: #A6B0FF;\n}\n\n.show {\n    display: block;\n}\n\n/* The literal code blocks */\n.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal {\n    color: #6670FF;\n}\n\n/* To keep the logo centered */\n.wy-side-scroll {\n    width: auto;\n    font-size: 20px;\n}\n\n/* The div that holds the Hugging Face logo */\n.HuggingFaceDiv {\n    width: 100%\n}\n\n/* The research field on top of the toc tree */\n.wy-side-nav-search{\n    padding-top: 0;\n    background-color: #6670FF;\n}\n\n/* The toc tree */\n.wy-nav-side{\n    background-color: #6670FF;\n    padding-bottom: 0;\n}\n\n/* The section headers in the toc tree */\n.wy-menu-vertical p.caption{\n    background-color: #4d59ff;\n    line-height: 40px;\n}\n\n/* The selected items in the toc tree */\n.wy-menu-vertical li.current{\n    background-color: #A6B0FF;\n}\n\n/* When a list item that does belong to the selected block from the toc tree is hovered */\n.wy-menu-vertical li.current a:hover{\n    background-color: #B6C0FF;\n}\n\n/* When a list item that does NOT belong to the selected block from the toc tree is hovered. */\n.wy-menu-vertical li a:hover{\n    background-color: #A7AFFB;\n}\n\n/* The text items on the toc tree */\n.wy-menu-vertical a {\n    color: #FFFFDD;\n    font-family: Calibre-Light, sans-serif;\n}\n.wy-menu-vertical header, .wy-menu-vertical p.caption{\n    color: white;\n    font-family: Calibre-Light, sans-serif;\n}\n\n/* The color inside the selected toc tree block */\n.wy-menu-vertical li.toctree-l2 a, .wy-menu-vertical li.toctree-l3 a, .wy-menu-vertical li.toctree-l4 a {\n    color: black;\n}\n\n/* Inside the depth-2 selected toc tree block */\n.wy-menu-vertical li.toctree-l2.current>a {\n    background-color: #B6C0FF\n}\n.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a {\n    background-color: #C6D0FF\n}\n\n/* Inside the depth-3 selected toc tree block */\n.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{\n    background-color: #D6E0FF\n}\n\n/* Inside code snippets */\n.rst-content dl:not(.docutils) dt{\n    font-size: 15px;\n}\n\n/* Links */\na {\n    color: #6670FF;\n}\n\n/* Content bars */\n.rst-content dl:not(.docutils) dt {\n    background-color: rgba(251, 141, 104, 0.1);\n    border-right: solid 2px #FB8D68;\n    border-left: solid 2px #FB8D68;\n    color: #FB8D68;\n    font-family: Calibre-Light, sans-serif;\n    border-top: none;\n    font-style: normal !important;\n}\n\n/* Expand button */\n.wy-menu-vertical li.toctree-l2 span.toctree-expand,\n.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current>a span.toctree-expand,\n.wy-menu-vertical li.toctree-l3 span.toctree-expand{\n    color: black;\n}\n\n/* Max window size */\n.wy-nav-content{\n    max-width: 1200px;\n}\n\n/* Mobile header */\n.wy-nav-top{\n    background-color: #6670FF;\n}\n\n\n/* Source spans */\n.rst-content .viewcode-link, .rst-content .viewcode-back{\n    color: #6670FF;\n    font-size: 110%;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n}\n\n/* It would be better for table to be visible without horizontal scrolling */\n.wy-table-responsive table td, .wy-table-responsive table th{\n    white-space: normal;\n}\n\n.footer {\n    margin-top: 20px;\n}\n\n.footer__Social {\n    display: flex;\n    flex-direction: row;\n}\n\n.footer__CustomImage {\n    margin: 2px 5px 0 0;\n}\n\n/* class and method names in doc */\n.rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) tt.descclassname, .rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) code.descname, .rst-content dl:not(.docutils) tt.descclassname, .rst-content dl:not(.docutils) code.descclassname{\n    font-family: Calibre, sans-serif;\n    font-size: 20px !important;\n}\n\n/* class name in doc*/\n.rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) code.descname{\n    margin-right: 10px;\n    font-family: Calibre-Medium, sans-serif;\n}\n\n/* Method and class parameters */\n.sig-param{\n    line-height: 23px;\n}\n\n/* Class introduction \"class\" string at beginning */\n.rst-content dl:not(.docutils) .property{\n    font-size: 18px;\n    color: black;\n}\n\n\n/* FONTS */\nbody{\n    font-family: Calibre, sans-serif;\n    font-size: 16px;\n}\n\nh1 {\n    font-family: Calibre-Thin, sans-serif;\n    font-size: 70px;\n}\n\nh2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend{\n    font-family: Calibre-Medium, sans-serif;\n}\n\n@font-face {\n    font-family: Calibre-Medium;\n    src: url(./Calibre-Medium.otf);\n    font-weight:400;\n}\n\n@font-face {\n    font-family: Calibre;\n    src: url(./Calibre-Regular.otf);\n    font-weight:400;\n}\n\n@font-face {\n    font-family: Calibre-Light;\n    src: url(./Calibre-Light.ttf);\n    font-weight:400;\n}\n\n@font-face {\n    font-family: Calibre-Thin;\n    src: url(./Calibre-Thin.otf);\n    font-weight:400;\n}\n\n/**\n * Nav Links to other parts of huggingface.co\n */\n div.hf-menu {\n    position: absolute;\n    top: 0;\n    right: 0;\n    padding-top: 20px;\n    padding-right: 20px;\n    z-index: 1000;\n}\ndiv.hf-menu a {\n    font-size: 14px;\n    letter-spacing: 0.3px;\n    text-transform: uppercase;\n    color: white;\n    -webkit-font-smoothing: antialiased;\n    background: linear-gradient(0deg, #6671ffb8, #9a66ffb8 50%);\n    padding: 10px 16px 6px 16px;\n    border-radius: 3px;\n    margin-left: 12px;\n    position: relative;\n}\ndiv.hf-menu a:active {\n    top: 1px;\n}\n@media (min-width: 768px) and (max-width: 1860px) {\n    .wy-breadcrumbs {\n        margin-top: 32px;\n    }\n}\n@media (max-width: 768px) {\n    div.hf-menu {\n        display: none;\n    }\n}\n"
  },
  {
    "path": "docs/source/_static/js/custom.js",
    "content": "// These three variables below need to be updated at each release for the selectors.\n\nconst languages = [ \"rust\", \"python\", \"node\" ];\n// Last stable version for each language\nconst stableVersion = {\n    \"rust\": \"master\",\n    \"python\": \"v0.10.0\",\n    \"node\": \"master\"\n}\n// Dictionary doc folder to Label for each language\nconst versionMapping = {\n    \"rust\": {\n        \"master\": \"master\",\n    },\n    \"python\": {\n        \"master\": \"master\",\n        \"v0.9.4\": \"v0.9.4\",\n        \"v0.10.0\": \"v0.10.0\",\n    },\n    \"node\": {\n        \"master\": \"master\",\n    }\n};\n\n// Dictionary language name to Label\nconst languageName = {\n    \"rust\": \"Rust\",\n    \"python\": \"Python\",\n    \"node\": \"Node.js\"\n};\nconst defaultLanguage = \"python\";\n\nfunction addIcon() {\n    const huggingFaceLogo =\n        \"https://huggingface.co/landing/assets/transformers-docs/huggingface_logo.svg\";\n    const image = document.createElement(\"img\");\n    image.setAttribute(\"src\", huggingFaceLogo);\n\n    const div = document.createElement(\"div\");\n    div.appendChild(image);\n    div.style.textAlign = 'center';\n    div.style.paddingTop = '30px';\n    div.style.backgroundColor = '#6670FF';\n\n    const scrollDiv = document.querySelector(\".wy-side-scroll\");\n    scrollDiv.prepend(div);\n}\n\nfunction addCustomFooter() {\n    const customFooter = document.createElement(\"div\");\n    const questionOrIssue = document.createElement(\"div\");\n    questionOrIssue.innerHTML =\n        \"Stuck? Read our <a href='https://medium.com/huggingface'>Blog posts</a>\" +\n        \" or <a href='https://github.com/huggingface/tokenizers'>Create an issue</a>\";\n    customFooter.appendChild(questionOrIssue);\n    customFooter.classList.add(\"footer\");\n\n    const social = document.createElement(\"div\");\n    social.classList.add(\"footer__Social\");\n\n    const imageDetails = [ {\n        link: \"https://huggingface.co\",\n        imageLink: \"https://huggingface.co/landing/assets/transformers-docs/website.svg\"\n    }, {\n        link: \"https://twitter.com/huggingface\",\n        imageLink: \"https://huggingface.co/landing/assets/transformers-docs/twitter.svg\"\n    }, {\n        link: \"https://github.com/huggingface\",\n        imageLink: \"https://huggingface.co/landing/assets/transformers-docs/github.svg\"\n    }, {\n        link: \"https://www.linkedin.com/company/huggingface/\",\n        imageLink: \"https://huggingface.co/landing/assets/transformers-docs/linkedin.svg\"\n    } ];\n\n    imageDetails.forEach(imageLinks => {\n        const link = document.createElement(\"a\");\n        const image = document.createElement(\"img\");\n        image.src = imageLinks.imageLink;\n        link.href = imageLinks.link;\n        image.style.width = \"30px\";\n        image.classList.add(\"footer__CustomImage\");\n        link.appendChild(image);\n        social.appendChild(link);\n    });\n\n    customFooter.appendChild(social);\n    document.querySelector(\"footer\").appendChild(customFooter);\n}\n\nfunction addGithubButton() {\n    const div = `\n        <div class=\"github-repo\">\n            <a class=\"github-button\"\n               href=\"https://github.com/huggingface/tokenizers\"\n               data-size=\"large\"\n               data-show-count=\"true\"\n               aria-label=\"Star huggingface/tokenizers on GitHub\">\n                Star\n            </a>\n        </div>\n    `;\n    document.querySelector(\".wy-side-nav-search .icon-home\").insertAdjacentHTML('afterend', div);\n}\n\nfunction addVersionControl() {\n    // Default language and version\n    let language = defaultLanguage;\n\n    // To grab the version currently in view, we parse the url\n    let parts = location.pathname.split('/');\n    const languageIndex = parts.findIndex((part) => languages.includes(part));\n    language = parts[languageIndex];\n    let version  = stableVersion[language];\n\n    const versionIndex  = languageIndex + 1;\n    // If a version is specified, update it\n    if (parts[versionIndex] != \"\" && !parts[versionIndex].endsWith(\".html\")) {\n        // If `latest`, let's keep the default (should be the explicit latest version)\n        if (parts[versionIndex] != \"latest\") {\n            version = parts[versionIndex];\n        }\n    // Otherwise redirect to the latest (if not opening locally)\n    } else if (!parts[parts.length - 1].endsWith(\".html\")) {\n        return window.location.pathname = [language, version, parts.splice(versionIndex)].join(\"/\");\n    // Opening locally, just don't show the version/language selector\n    } else {\n        return\n    }\n\n    // Language Menu\n    const languageMenu = document.createElement(\"div\");\n    languageMenu.classList.add(\"menu-dropdown\");\n    languageMenu.innerHTML = languages.map((lang) => {\n        let isVersion = false;\n        let updatedParts = parts.map((l, i) => {\n            if (isVersion) {\n                isVersion = false;\n                return 'latest';\n            }\n            if (i == languageIndex) {\n                isVersion = true;\n                return lang;\n            } else {\n                return l;\n            }\n        });\n        return `\n            <a class=\"dropdown-link ${lang == language? 'active' : ''}\"\n                href=${updatedParts.join(\"/\")}>\n                ${languageName[lang]}\n            </a>\n        `;\n    }).join(\"\\n\");\n\n    // Version Menu\n    const versionMenu = document.createElement(\"div\");\n    versionMenu.classList.add(\"menu-dropdown\");\n    versionMenu.innerHTML = Object.entries(versionMapping[language]).map(([key, value]) => {\n        let updatedParts = parts.map((v, i) => {\n            if (i == versionIndex) {\n                return key;\n            } else {\n                return v\n            }\n        });\n        return `\n            <a class=\"dropdown-link ${key == version ? 'active' : ''}\"\n                href=\"${updatedParts.join('/')}\">\n                    ${value}\n            </a>\n        `;\n    }).join(\"\\n\");\n\n    // Language button\n    const languageButton = document.createElement(\"div\");\n    languageButton.classList.add(\"dropdown-button\");\n    languageButton.innerText = languageName[language].concat(\" ▼\");\n\n    languageButton.addEventListener(\"click\", () => {\n        versionMenu.classList.remove(\"show\");\n        languageMenu.classList.toggle(\"show\");\n        languageButton.classList.toggle(\"active\");\n    });\n\n    // Button for version selection\n    const versionButton = document.createElement(\"div\");\n    versionButton.classList.add(\"dropdown-button\");\n    versionButton.innerText = version.concat(\" ▼\");\n\n    // Toggle the menu when we click on the button\n    versionButton.addEventListener(\"click\", () => {\n        languageMenu.classList.remove(\"show\");\n        versionMenu.classList.toggle(\"show\");\n        versionButton.classList.toggle(\"active\");\n    });\n\n    // Hide the menu when we click elsewhere\n    window.addEventListener(\"click\", (event) => {\n        if (event.target != languageButton){\n            languageButton.classList.remove('active');\n            languageMenu.classList.remove('show');\n        }\n        if (event.target != versionButton){\n            versionButton.classList.remove('active');\n            versionMenu.classList.remove('show');\n        }\n    });\n\n    const buttonContainer = document.createElement(\"div\");\n    buttonContainer.classList.add(\"button-container\");\n    buttonContainer.appendChild(languageButton);\n    buttonContainer.appendChild(versionButton);\n\n    // Container\n    const div = document.createElement(\"div\");\n    div.classList.add(\"selectors\");\n    div.appendChild(buttonContainer);\n    div.appendChild(languageMenu);\n    div.appendChild(versionMenu);\n    div.style.paddingTop = '25px';\n    div.style.backgroundColor = '#6670FF';\n    div.style.display = 'block';\n    div.style.textAlign = 'center';\n\n    const scrollDiv = document.querySelector(\".wy-side-scroll\");\n    scrollDiv.insertBefore(div, scrollDiv.children[1]);\n}\n\nfunction addHfMenu() {\n    const div = `\n    <div class=\"hf-menu\">\n        <a href=\"/welcome\">🔥 Sign in</a>\n        <a href=\"/models\">🚀 Models</a>\n        <a href=\"http://discuss.huggingface.co\">💬 Forum</a>\n    </div>\n    `;\n    document.body.insertAdjacentHTML('afterbegin', div);\n}\n\n/*!\n * github-buttons v2.2.10\n * (c) 2019 なつき\n * @license BSD-2-Clause\n */\n/**\n * modified to run programmatically\n */\nfunction parseGithubButtons (){\"use strict\";var e=window.document,t=e.location,o=window.encodeURIComponent,r=window.decodeURIComponent,n=window.Math,a=window.HTMLElement,i=window.XMLHttpRequest,l=\"https://unpkg.com/github-buttons@2.2.10/dist/buttons.html\",c=i&&i.prototype&&\"withCredentials\"in i.prototype,d=c&&a&&a.prototype.attachShadow&&!a.prototype.attachShadow.prototype,s=function(e,t,o){e.addEventListener?e.addEventListener(t,o):e.attachEvent(\"on\"+t,o)},u=function(e,t,o){e.removeEventListener?e.removeEventListener(t,o):e.detachEvent(\"on\"+t,o)},h=function(e,t,o){var r=function(n){return u(e,t,r),o(n)};s(e,t,r)},f=function(e,t,o){var r=function(n){if(t.test(e.readyState))return u(e,\"readystatechange\",r),o(n)};s(e,\"readystatechange\",r)},p=function(e){return function(t,o,r){var n=e.createElement(t);if(o)for(var a in o){var i=o[a];null!=i&&(null!=n[a]?n[a]=i:n.setAttribute(a,i))}if(r)for(var l=0,c=r.length;l<c;l++){var d=r[l];n.appendChild(\"string\"==typeof d?e.createTextNode(d):d)}return n}},g=p(e),b=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}},m=\"body{margin:0}a{color:#24292e;text-decoration:none;outline:0}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.widget{ display:inline-block;overflow:hidden;font-family:-apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Helvetica, Arial, sans-serif;font-size:0;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn,.social-count{display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;border:1px solid #c5c9cc;border-radius:0.25em}.btn{background-color:#eff3f6;background-image:-webkit-linear-gradient(top, #fafbfc, #eff3f6 90%);background-image:-moz-linear-gradient(top, #fafbfc, #eff3f6 90%);background-image:linear-gradient(180deg, #fafbfc, #eff3f6 90%);background-position:-1px -1px;background-repeat:repeat-x;background-size:110% 110%;border-color:rgba(27,31,35,0.2);-ms-filter:\\\"progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFFAFBFC', endColorstr='#FFEEF2F5')\\\";*filter:progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFFAFBFC', endColorstr='#FFEEF2F5')}.btn:active{background-color:#e9ecef;background-image:none;border-color:#a5a9ac;border-color:rgba(27,31,35,0.35);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn:focus,.btn:hover{background-color:#e6ebf1;background-image:-webkit-linear-gradient(top, #f0f3f6, #e6ebf1 90%);background-image:-moz-linear-gradient(top, #f0f3f6, #e6ebf1 90%);background-image:linear-gradient(180deg, #f0f3f6, #e6ebf1 90%);border-color:#a5a9ac;border-color:rgba(27,31,35,0.35);-ms-filter:\\\"progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFF0F3F6', endColorstr='#FFE5EAF0')\\\";*filter:progid:DXImageTransform.Microsoft.Gradient(startColorstr='#FFF0F3F6', endColorstr='#FFE5EAF0')}.social-count{position:relative;margin-left:5px;background-color:#fff}.social-count:focus,.social-count:hover{color:#0366d6}.social-count b,.social-count i{position:absolute;top:50%;left:0;display:block;width:0;height:0;margin:-4px 0 0 -4px;border:solid transparent;border-width:4px 4px 4px 0;_line-height:0;_border-top-color:red !important;_border-bottom-color:red !important;_border-left-color:red !important;_filter:chroma(color=red)}.social-count b{border-right-color:#c5c9cc}.social-count i{margin-left:-3px;border-right-color:#fff}.lg .btn,.lg .social-count{height:16px;padding:5px 10px;font-size:12px;line-height:16px}.lg .social-count{margin-left:6px}.lg .social-count b,.lg .social-count i{margin:-5px 0 0 -5px;border-width:5px 5px 5px 0}.lg .social-count i{margin-left:-4px}\\n\",v={\"mark-github\":{width:16,height:16,path:'<path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z\"/>'},eye:{width:16,height:16,path:'<path fill-rule=\"evenodd\" d=\"M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z\"/>'},star:{width:14,height:16,path:'<path fill-rule=\"evenodd\" d=\"M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z\"/>'},\"repo-forked\":{width:10,height:16,path:'<path fill-rule=\"evenodd\" d=\"M8 1a1.993 1.993 0 0 0-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 0 0 2 1a1.993 1.993 0 0 0-1 3.72V6.5l3 3v1.78A1.993 1.993 0 0 0 5 15a1.993 1.993 0 0 0 1-3.72V9.5l3-3V4.72A1.993 1.993 0 0 0 8 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"/>'},\"issue-opened\":{width:14,height:16,path:'<path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"/>'},\"cloud-download\":{width:16,height:16,path:'<path fill-rule=\"evenodd\" d=\"M9 12h2l-3 3-3-3h2V7h2v5zm3-8c0-.44-.91-3-4.5-3C5.08 1 3 2.92 3 5 1.02 5 0 6.52 0 8c0 1.53 1 3 3 3h3V9.7H3C1.38 9.7 1.3 8.28 1.3 8c0-.17.05-1.7 1.7-1.7h1.3V5c0-1.39 1.56-2.7 3.2-2.7 2.55 0 3.13 1.55 3.2 1.8v1.2H12c.81 0 2.7.22 2.7 2.2 0 2.09-2.25 2.2-2.7 2.2h-2V11h2c2.08 0 4-1.16 4-3.5C16 5.06 14.08 4 12 4z\"/>'}},w={},x=function(e,t,o){var r=p(e.ownerDocument),n=e.appendChild(r(\"style\",{type:\"text/css\"}));n.styleSheet?n.styleSheet.cssText=m:n.appendChild(e.ownerDocument.createTextNode(m));var a,l,d=r(\"a\",{className:\"btn\",href:t.href,target:\"_blank\",innerHTML:(a=t[\"data-icon\"],l=/^large$/i.test(t[\"data-size\"])?16:14,a=(\"\"+a).toLowerCase().replace(/^octicon-/,\"\"),{}.hasOwnProperty.call(v,a)||(a=\"mark-github\"),'<svg version=\"1.1\" width=\"'+l*v[a].width/v[a].height+'\" height=\"'+l+'\" viewBox=\"0 0 '+v[a].width+\" \"+v[a].height+'\" class=\"octicon octicon-'+a+'\" aria-hidden=\"true\">'+v[a].path+\"</svg>\"),\"aria-label\":t[\"aria-label\"]||void 0},[\" \",r(\"span\",{},[t[\"data-text\"]||\"\"])]);/\\.github\\.com$/.test(\".\"+d.hostname)?/^https?:\\/\\/((gist\\.)?github\\.com\\/[^\\/?#]+\\/[^\\/?#]+\\/archive\\/|github\\.com\\/[^\\/?#]+\\/[^\\/?#]+\\/releases\\/download\\/|codeload\\.github\\.com\\/)/.test(d.href)&&(d.target=\"_top\"):(d.href=\"#\",d.target=\"_self\");var u,h,g,x,y=e.appendChild(r(\"div\",{className:\"widget\"+(/^large$/i.test(t[\"data-size\"])?\" lg\":\"\")},[d]));/^(true|1)$/i.test(t[\"data-show-count\"])&&\"github.com\"===d.hostname&&(u=d.pathname.replace(/^(?!\\/)/,\"/\").match(/^\\/([^\\/?#]+)(?:\\/([^\\/?#]+)(?:\\/(?:(subscription)|(fork)|(issues)|([^\\/?#]+)))?)?(?:[\\/?#]|$)/))&&!u[6]?(u[2]?(h=\"/repos/\"+u[1]+\"/\"+u[2],u[3]?(x=\"subscribers_count\",g=\"watchers\"):u[4]?(x=\"forks_count\",g=\"network\"):u[5]?(x=\"open_issues_count\",g=\"issues\"):(x=\"stargazers_count\",g=\"stargazers\")):(h=\"/users/\"+u[1],g=x=\"followers\"),function(e,t){var o=w[e]||(w[e]=[]);if(!(o.push(t)>1)){var r=b(function(){for(delete w[e];t=o.shift();)t.apply(null,arguments)});if(c){var n=new i;s(n,\"abort\",r),s(n,\"error\",r),s(n,\"load\",function(){var e;try{e=JSON.parse(n.responseText)}catch(e){return void r(e)}r(200!==n.status,e)}),n.open(\"GET\",e),n.send()}else{var a=this||window;a._=function(e){a._=null,r(200!==e.meta.status,e.data)};var l=p(a.document)(\"script\",{async:!0,src:e+(/\\?/.test(e)?\"&\":\"?\")+\"callback=_\"}),d=function(){a._&&a._({meta:{}})};s(l,\"load\",d),s(l,\"error\",d),l.readyState&&f(l,/de|m/,d),a.document.getElementsByTagName(\"head\")[0].appendChild(l)}}}.call(this,\"https://api.github.com\"+h,function(e,t){if(!e){var n=t[x];y.appendChild(r(\"a\",{className:\"social-count\",href:t.html_url+\"/\"+g,target:\"_blank\",\"aria-label\":n+\" \"+x.replace(/_count$/,\"\").replace(\"_\",\" \").slice(0,n<2?-1:void 0)+\" on GitHub\"},[r(\"b\"),r(\"i\"),r(\"span\",{},[(\"\"+n).replace(/\\B(?=(\\d{3})+(?!\\d))/g,\",\")])]))}o&&o(y)})):o&&o(y)},y=window.devicePixelRatio||1,C=function(e){return(y>1?n.ceil(n.round(e*y)/y*2)/2:n.ceil(e))||0},F=function(e,t){e.style.width=t[0]+\"px\",e.style.height=t[1]+\"px\"},k=function(t,r){if(null!=t&&null!=r)if(t.getAttribute&&(t=function(e){for(var t={href:e.href,title:e.title,\"aria-label\":e.getAttribute(\"aria-label\")},o=[\"icon\",\"text\",\"size\",\"show-count\"],r=0,n=o.length;r<n;r++){var a=\"data-\"+o[r];t[a]=e.getAttribute(a)}return null==t[\"data-text\"]&&(t[\"data-text\"]=e.textContent||e.innerText),t}(t)),d){var a=g(\"span\",{title:t.title||void 0});x(a.attachShadow({mode:\"closed\"}),t,function(){r(a)})}else{var i=g(\"iframe\",{src:\"javascript:0\",title:t.title||void 0,allowtransparency:!0,scrolling:\"no\",frameBorder:0});F(i,[0,0]),i.style.border=\"none\";var c=function(){var a,d=i.contentWindow;try{a=d.document.body}catch(t){return void e.body.appendChild(i.parentNode.removeChild(i))}u(i,\"load\",c),x.call(d,a,t,function(e){var a=function(e){var t=e.offsetWidth,o=e.offsetHeight;if(e.getBoundingClientRect){var r=e.getBoundingClientRect();t=n.max(t,C(r.width)),o=n.max(o,C(r.height))}return[t,o]}(e);i.parentNode.removeChild(i),h(i,\"load\",function(){F(i,a)}),i.src=l+\"#\"+(i.name=function(e){var t=[];for(var r in e){var n=e[r];null!=n&&t.push(o(r)+\"=\"+o(n))}return t.join(\"&\")}(t)),r(i)})};s(i,\"load\",c),e.body.appendChild(i)}};t.protocol+\"//\"+t.host+t.pathname===l?x(e.body,function(e){for(var t={},o=e.split(\"&\"),n=0,a=o.length;n<a;n++){var i=o[n];if(\"\"!==i){var l=i.split(\"=\");t[r(l[0])]=null!=l[1]?r(l.slice(1).join(\"=\")):void 0}}return t}(window.name||t.hash.replace(/^#/,\"\"))):function(t){if(/m/.test(e.readyState)||!/g/.test(e.readyState)&&!e.documentElement.doScroll)setTimeout(t);else if(e.addEventListener){var o=b(t);h(e,\"DOMContentLoaded\",o),h(window,\"load\",o)}else f(e,/m/,t)}(function(){for(var t=e.querySelectorAll?e.querySelectorAll(\"a.github-button\"):function(){for(var t=[],o=e.getElementsByTagName(\"a\"),r=0,n=o.length;r<n;r++)~(\" \"+o[r].className+\" \").replace(/[ \\t\\n\\f\\r]+/g,\" \").indexOf(\" github-button \")&&t.push(o[r]);return t}(),o=0,r=t.length;o<r;o++)!function(e){k(e,function(t){e.parentNode.replaceChild(t,e)})}(t[o])})};\n\n\nfunction onLoad() {\n    addIcon();\n    addVersionControl();\n    addCustomFooter();\n    addGithubButton();\n    parseGithubButtons();\n    addHfMenu();\n}\n\nwindow.addEventListener(\"load\", onLoad);\n"
  },
  {
    "path": "docs/source/api/node.inc",
    "content": "Documentation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe node API has not been documented yet.\n"
  },
  {
    "path": "docs/source/api/python.inc",
    "content": "Input sequences\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThese types represent all the different kinds of sequence that can be used as input of a Tokenizer.\nGlobally, any sequence can be either a string or a list of strings, according to the operating\nmode of the tokenizer: ``raw text`` vs ``pre-tokenized``.\n\n.. autodata:: tokenizers.TextInputSequence\n\n.. autodata:: tokenizers.PreTokenizedInputSequence\n\n.. autodata:: tokenizers.InputSequence\n\n\nEncode inputs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThese types represent all the different kinds of input that a :class:`~tokenizers.Tokenizer` accepts\nwhen using :meth:`~tokenizers.Tokenizer.encode_batch`.\n\n.. autodata:: tokenizers.TextEncodeInput\n\n.. autodata:: tokenizers.PreTokenizedEncodeInput\n\n.. autodata:: tokenizers.EncodeInput\n\n\nTokenizer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. autoclass:: tokenizers.Tokenizer\n    :members:\n\n\nEncoding\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. autoclass:: tokenizers.Encoding\n    :members:\n\n\nAdded Tokens\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. autoclass:: tokenizers.AddedToken\n    :members:\n\n\nModels\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. automodule:: tokenizers.models\n    :members:\n\nNormalizers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. automodule:: tokenizers.normalizers\n    :members:\n\n\nPre-tokenizers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. automodule:: tokenizers.pre_tokenizers\n    :members:\n\n\nPost-processor\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. automodule:: tokenizers.processors\n    :members:\n\n\nTrainers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. automodule:: tokenizers.trainers\n    :members:\n\nDecoders\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. automodule:: tokenizers.decoders\n    :members:\n\nVisualizer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. autoclass:: tokenizers.tools.Annotation\n    :members:\n\n.. autoclass:: tokenizers.tools.EncodingVisualizer\n    :members: __call__\n"
  },
  {
    "path": "docs/source/api/reference.rst",
    "content": ".. only:: python\n\n    .. include:: python.inc\n\n.. only:: rust\n\n    .. include:: rust.inc\n\n.. only:: node\n\n    .. include:: node.inc\n"
  },
  {
    "path": "docs/source/api/rust.inc",
    "content": "Documentation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Rust API Reference is available directly on the `Docs.rs <https://docs.rs/tokenizers>`__\nwebsite.\n"
  },
  {
    "path": "docs/source/components.rst",
    "content": "Components\n====================================================================================================\n\nWhen building a Tokenizer, you can attach various types of components to this Tokenizer in order\nto customize its behavior. This page lists most provided components.\n\n.. _normalizers:\n\n\n.. entities:: python\n\n    BertNormalizer.clean_text\n        clean_text\n    BertNormalizer.handle_chinese_chars\n        handle_chinese_chars\n    BertNormalizer.strip_accents\n        strip_accents\n    BertNormalizer.lowercase\n        lowercase\n    Normalizer.Sequence\n        ``Sequence([NFKC(), Lowercase()])``\n    PreTokenizer.Sequence\n        ``Sequence([Punctuation(), WhitespaceSplit()])``\n    SplitDelimiterBehavior.removed\n        :obj:`removed`\n    SplitDelimiterBehavior.isolated\n        :obj:`isolated`\n    SplitDelimiterBehavior.merged_with_previous\n        :obj:`merged_with_previous`\n    SplitDelimiterBehavior.merged_with_next\n        :obj:`merged_with_next`\n    SplitDelimiterBehavior.contiguous\n        :obj:`contiguous`\n\n.. entities:: rust\n\n    BertNormalizer.clean_text\n        clean_text\n    BertNormalizer.handle_chinese_chars\n        handle_chinese_chars\n    BertNormalizer.strip_accents\n        strip_accents\n    BertNormalizer.lowercase\n        lowercase\n    Normalizer.Sequence\n        ``Sequence::new(vec![NFKC, Lowercase])``\n    PreTokenizer.Sequence\n        ``Sequence::new(vec![Punctuation, WhitespaceSplit])``\n    SplitDelimiterBehavior.removed\n        :obj:`Removed`\n    SplitDelimiterBehavior.isolated\n        :obj:`Isolated`\n    SplitDelimiterBehavior.merged_with_previous\n        :obj:`MergedWithPrevious`\n    SplitDelimiterBehavior.merged_with_next\n        :obj:`MergedWithNext`\n    SplitDelimiterBehavior.contiguous\n        :obj:`Contiguous`\n\n.. entities:: node\n\n    BertNormalizer.clean_text\n        cleanText\n    BertNormalizer.handle_chinese_chars\n        handleChineseChars\n    BertNormalizer.strip_accents\n        stripAccents\n    BertNormalizer.lowercase\n        lowercase\n    Normalizer.Sequence\n        ..\n    PreTokenizer.Sequence\n        ..\n    SplitDelimiterBehavior.removed\n        :obj:`removed`\n    SplitDelimiterBehavior.isolated\n        :obj:`isolated`\n    SplitDelimiterBehavior.merged_with_previous\n        :obj:`mergedWithPrevious`\n    SplitDelimiterBehavior.merged_with_next\n        :obj:`mergedWithNext`\n    SplitDelimiterBehavior.contiguous\n        :obj:`contiguous`\n\nNormalizers\n----------------------------------------------------------------------------------------------------\n\nA ``Normalizer`` is in charge of pre-processing the input string in order to normalize it as\nrelevant for a given use case. Some common examples of normalization are the Unicode normalization\nalgorithms (NFD, NFKD, NFC & NFKC), lowercasing etc...\nThe specificity of ``tokenizers`` is that we keep track of the alignment while normalizing. This\nis essential to allow mapping from the generated tokens back to the input text.\n\nThe ``Normalizer`` is optional.\n\n.. list-table::\n   :header-rows: 1\n\n   * - Name\n     - Description\n     - Example\n\n   * - NFD\n     - NFD unicode normalization\n     -\n\n   * - NFKD\n     - NFKD unicode normalization\n     -\n\n   * - NFC\n     - NFC unicode normalization\n     -\n\n   * - NFKC\n     - NFKC unicode normalization\n     -\n\n   * - Lowercase\n     - Replaces all uppercase to lowercase\n     - Input: ``HELLO ὈΔΥΣΣΕΎΣ``\n\n       Output: ``hello ὀδυσσεύς``\n\n   * - Strip\n     - Removes all whitespace characters on the specified sides (left, right or both) of the input\n     - Input: ``\" hi \"``\n\n       Output: ``\"hi\"``\n\n   * - StripAccents\n     - Removes all accent symbols in unicode (to be used with NFD for consistency)\n     - Input: ``é``\n\n       Output: ``e``\n\n   * - Replace\n     - Replaces a custom string or regexp and changes it with given content\n     - ``Replace(\"a\", \"e\")`` will behave like this:\n\n       Input: ``\"banana\"``\n       Output: ``\"benene\"``\n\n   * - BertNormalizer\n     - Provides an implementation of the Normalizer used in the original BERT. Options\n       that can be set are:\n\n            - :entity:`BertNormalizer.clean_text`\n            - :entity:`BertNormalizer.handle_chinese_chars`\n            - :entity:`BertNormalizer.strip_accents`\n            - :entity:`BertNormalizer.lowercase`\n\n     -\n\n   * - Sequence\n     - Composes multiple normalizers that will run in the provided order\n     - :entity:`Normalizer.Sequence`\n\n\n.. _pre-tokenizers:\n\nPre tokenizers\n----------------------------------------------------------------------------------------------------\n\nThe ``PreTokenizer`` takes care of splitting the input according to a set of rules. This\npre-processing lets you ensure that the underlying ``Model`` does not build tokens across multiple\n\"splits\".\nFor example if you don't want to have whitespaces inside a token, then you can have a\n``PreTokenizer`` that splits on these whitespaces.\n\nYou can easily combine multiple ``PreTokenizer`` together using a ``Sequence`` (see below).\nThe ``PreTokenizer`` is also allowed to modify the string, just like a ``Normalizer`` does. This\nis necessary to allow some complicated algorithms that require to split before normalizing (e.g.\nthe ByteLevel)\n\n.. list-table::\n   :header-rows: 1\n\n   * - Name\n     - Description\n     - Example\n\n   * - ByteLevel\n     - Splits on whitespaces while remapping all the bytes to a set of visible characters. This\n       technique as been introduced by OpenAI with GPT-2 and has some more or less nice properties:\n\n        - Since it maps on bytes, a tokenizer using this only requires **256** characters as initial\n          alphabet (the number of values a byte can have), as opposed to the 130,000+ Unicode\n          characters.\n        - A consequence of the previous point is that it is absolutely unnecessary to have an\n          unknown token using this since we can represent anything with 256 tokens (Youhou!! 🎉🎉)\n        - For non ascii characters, it gets completely unreadable, but it works nonetheless!\n\n     - Input: ``\"Hello my friend, how are you?\"``\n\n       Output: ``\"Hello\", \"Ġmy\", Ġfriend\", \",\", \"Ġhow\", \"Ġare\", \"Ġyou\", \"?\"``\n\n   * - Whitespace\n     - Splits on word boundaries (using the following regular expression: ``\\w+|[^\\w\\s]+``\n     - Input: ``\"Hello there!\"``\n\n       Output: ``\"Hello\", \"there\", \"!\"``\n\n   * - WhitespaceSplit\n     - Splits on any whitespace character\n     - Input: ``\"Hello there!\"``\n\n       Output: ``\"Hello\", \"there!\"``\n\n   * - Punctuation\n     - Will isolate all punctuation characters\n     - Input: ``\"Hello?\"``\n\n       Output: ``\"Hello\", \"?\"``\n\n   * - Metaspace\n     - Splits on whitespaces and replaces them with a special char \"▁\" (U+2581)\n     - Input: ``\"Hello there\"``\n\n       Output: ``\"Hello\", \"▁there\"``\n\n   * - CharDelimiterSplit\n     - Splits on a given character\n     - Example with ``x``:\n\n       Input: ``\"Helloxthere\"``\n\n       Output: ``\"Hello\", \"there\"``\n\n   * - Digits\n     - Splits the numbers from any other characters.\n     - Input: ``\"Hello123there\"``\n\n       Output: ```\"Hello\", \"123\", \"there\"```\n\n   * - Split\n     - Versatile pre-tokenizer that splits on provided pattern and according to provided behavior.\n       The pattern can be inverted if necessary.\n\n         - pattern should be either a custom string or regexp.\n         - behavior should be one of:\n\n            * :entity:`SplitDelimiterBehavior.removed`\n            * :entity:`SplitDelimiterBehavior.isolated`\n            * :entity:`SplitDelimiterBehavior.merged_with_previous`\n            * :entity:`SplitDelimiterBehavior.merged_with_next`\n            * :entity:`SplitDelimiterBehavior.contiguous`\n\n         - invert should be a boolean flag.\n\n     - Example with `pattern` = :obj:`\" \"`, `behavior` = :obj:`\"isolated\"`, `invert` = :obj:`False`:\n\n        Input: ``\"Hello, how are you?\"``\n\n        Output: ```\"Hello,\", \" \", \"how\", \" \", \"are\", \" \", \"you?\"```\n\n   * - Sequence\n     - Lets you compose multiple ``PreTokenizer`` that will be run in the given order\n     - :entity:`PreTokenizer.Sequence`\n\n\n.. _models:\n\nModels\n----------------------------------------------------------------------------------------------------\n\nModels are the core algorithms used to actually tokenize, and therefore, they are the only mandatory\ncomponent of a Tokenizer.\n\n.. list-table::\n   :header-rows: 1\n\n   * - Name\n     - Description\n\n   * - WordLevel\n     - This is the \"classic\" tokenization algorithm. It let's you simply map words to IDs\n       without anything fancy. This has the advantage of being really simple to use and\n       understand, but it requires extremely large vocabularies for a good coverage.\n\n\n       *Using this* ``Model`` *requires the use of a* ``PreTokenizer``. *No choice will be made by\n       this model directly, it simply maps input tokens to IDs*\n\n   * - BPE\n     - One of the most popular subword tokenization algorithm. The Byte-Pair-Encoding works by\n       starting with characters, while merging those that are the most frequently seen together,\n       thus creating new tokens. It then works iteratively to build new tokens out of the most\n       frequent pairs it sees in a corpus.\n\n       BPE is able to build words it has never seen by using multiple subword tokens, and thus\n       requires smaller vocabularies, with less chances of having \"unk\" (unknown) tokens.\n\n   * - WordPiece\n     - This is a subword tokenization algorithm quite similar to BPE, used mainly by Google in\n       models like BERT. It uses a greedy algorithm, that tries to build long words first, splitting\n       in multiple tokens when entire words don't exist in the vocabulary. This is different from\n       BPE that starts from characters, building bigger tokens as possible.\n\n       It uses the famous ``##`` prefix to identify tokens that are part of a word (ie not starting\n       a word).\n\n   * - Unigram\n     - Unigram is also a subword tokenization algorithm, and works by trying to identify the best\n       set of subword tokens to maximize the probability for a given sentence. This is different\n       from BPE in the way that this is not deterministic based on a set of rules applied\n       sequentially. Instead Unigram will be able to compute multiple ways of tokenizing, while\n       choosing the most probable one.\n\n\n.. _post-processors:\n\nPostProcessor\n----------------------------------------------------------------------------------------------------\n\nAfter the whole pipeline, we sometimes want to insert some special tokens before feed\na tokenized string into a model like \"[CLS] My horse is amazing [SEP]\". The ``PostProcessor``\nis the component doing just that.\n\n.. list-table::\n   :header-rows: 1\n\n   * - Name\n     - Description\n     - Example\n   * - TemplateProcessing\n     - Let's you easily template the post processing, adding special tokens, and specifying\n       the ``type_id`` for each sequence/special token. The template is given two strings\n       representing the single sequence and the pair of sequences, as well as a set of\n       special tokens to use.\n     - Example, when specifying a template with these values:\n\n            - single: ``\"[CLS] $A [SEP]\"``\n            - pair: ``\"[CLS] $A [SEP] $B [SEP]\"``\n            - special tokens:\n\n                - ``\"[CLS]\"``\n                - ``\"[SEP]\"``\n\n       Input: ``(\"I like this\", \"but not this\")``\n\n       Output: ``\"[CLS] I like this [SEP] but not this [SEP]\"``\n\n\n.. _decoders:\n\nDecoders\n----------------------------------------------------------------------------------------------------\n\nThe Decoder knows how to go from the IDs used by the Tokenizer, back to a readable piece of text.\nSome ``Normalizer`` and ``PreTokenizer`` use special characters or identifiers that need to be\nreverted for example.\n\n.. list-table::\n   :header-rows: 1\n\n   * - Name\n     - Description\n   * - ByteLevel\n     - Reverts the ByteLevel PreTokenizer. This PreTokenizer encodes at the byte-level, using\n       a set of visible Unicode characters to represent each byte, so we need a Decoder to\n       revert this process and get something readable again.\n   * - Metaspace\n     - Reverts the Metaspace PreTokenizer. This PreTokenizer uses a special identifier ``▁`` to\n       identify whitespaces, and so this Decoder helps with decoding these.\n   * - WordPiece\n     - Reverts the WordPiece Model. This model uses a special identifier ``##`` for continuing\n       subwords, and so this Decoder helps with decoding these.\n\n\n"
  },
  {
    "path": "docs/source/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\nimport os\nimport sys\n\nsys.path.insert(0, os.path.abspath(\"./_ext\"))\nsys.path.insert(0, os.path.abspath(\".\"))\n\n\n# -- Project information -----------------------------------------------------\n\nproject = \"tokenizers\"\ncopyright = \"2020, huggingface\"\nauthor = \"huggingface\"\n\n# The full version, including alpha/beta/rc tags\nrelease = \"\"\n\n# -- Custom information ------------------------------------------------------\n\n# The possible values for languages (used by `_ext/entities`)\nlanguages = [\"node\", \"rust\", \"python\"]\n\n# This defines the version used to generate links to docs.rs\nrust_version = \"latest\"\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\"sphinx.ext.autodoc\", \"sphinx.ext.napoleon\", \"entities\", \"rust_doc\", \"toctree_tags\"]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = []\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = \"sphinx_rtd_theme\"\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\nhtml_theme_options = {\"analytics_id\": \"UA-83738774-2\"}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n\ndef setup(app):\n    for language in languages:\n        if not tags.has(language):\n            exclude_patterns.append(f\"tutorials/{language}/*\")\n\n    app.add_css_file(\"css/huggingface.css\")\n    app.add_css_file(\"css/code-snippets.css\")\n    app.add_js_file(\"js/custom.js\")\n"
  },
  {
    "path": "docs/source/entities.inc",
    "content": ".. entities:: python\n\n    :global:\n\n    class\n        class\n    classmethod\n        class method\n    Tokenizer\n        :class:`~tokenizers.Tokenizer`\n    Tokenizer.train\n        :meth:`~tokenizers.Tokenizer.train`\n    Tokenizer.save\n        :meth:`~tokenizers.Tokenizer.save`\n    Tokenizer.from_file\n        :meth:`~tokenizers.Tokenizer.from_file`\n    Tokenizer.encode\n        :meth:`~tokenizers.Tokenizer.encode`\n    Tokenizer.encode_batch\n        :meth:`~tokenizers.Tokenizer.encode_batch`\n    Tokenizer.decode\n        :meth:`~tokenizers.Tokenizer.decode`\n    Tokenizer.decode_batch\n        :meth:`~tokenizers.Tokenizer.decode_batch`\n    Tokenizer.token_to_id\n        :meth:`~tokenizers.Tokenizer.token_to_id`\n    Tokenizer.enable_padding\n        :meth:`~tokenizers.Tokenizer.enable_padding`\n    Encoding\n        :class:`~tokenizers.Encoding`\n    TemplateProcessing\n        :class:`~tokenizers.processors.TemplateProcessing`\n    Normalizer\n        :class:`~tokenizers.normalizers.Normalizer`\n    normalizers.Sequence\n        :class:`~tokenizers.normalizers.Sequence`\n    pre_tokenizers.Whitespace\n        :class:`~tokenizers.pre_tokenizers.Whitespace`\n    PreTokenizer\n        :class:`~tokenizers.pre_tokenizers.PreTokenizer`\n    models.BPE\n        :class:`~tokenizers.models.BPE`\n    models.Unigram\n        :class:`~tokenizers.models.Unigram`\n    models.WordLevel\n        :class:`~tokenizers.models.WordLevel`\n    models.WordPiece\n        :class:`~tokenizers.models.WordPiece`\n    Decoder\n        :class:`~tokenizers.decoders.Decoder`\n\n.. entities:: rust\n\n    :global:\n\n    class\n        struct\n    classmethod\n        static method\n    Tokenizer\n        :rust_struct:`~tokenizers::tokenizer::Tokenizer`\n    Tokenizer.train\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::train`\n    Tokenizer.save\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::save`\n    Tokenizer.from_file\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::from_file`\n    Tokenizer.encode\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::encode`\n    Tokenizer.encode_batch\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::encode_batch`\n    Tokenizer.decode\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::decode`\n    Tokenizer.decode_batch\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::decode_batch`\n    Tokenizer.token_to_id\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::token_to_id`\n    Tokenizer.enable_padding\n        :rust_meth:`~tokenizers::tokenizer::Tokenizer::enable_padding`\n    Encoding\n        :rust_struct:`~tokenizers::tokenizer::Encoding`\n    TemplateProcessing\n        :rust_struct:`~tokenizers::processors::template::TemplateProcessing`\n    Normalizer\n        :rust_trait:`~tokenizers::tokenizer::Normalizer`\n    normalizers.Sequence\n        :rust_struct:`~tokenizers::normalizers::utils::Sequence`\n    pre_tokenizers.Whitespace\n        :rust_struct:`~tokenizers::normalizers::whitespace::Whitespace`\n    PreTokenizer\n        :rust_trait:`~tokenizers::tokenizer::PreTokenizer`\n    models.BPE\n        :rust_struct:`~tokenizers::models::bpe::BPE`\n    models.Unigram\n        :rust_struct:`~tokenizers::models::unigram::Unigram`\n    models.WordLevel\n        :rust_struct:`~tokenizers::models::wordlevel::WordLevel`\n    models.WordPiece\n        :rust_struct:`~tokenizers::models::wordpiece::WordPiece`\n    Decoder\n        :rust_trait:`~tokenizers::tokenizer::Decoder`\n\n.. entities:: node\n\n    :global:\n\n    class\n        class\n    classmethod\n        static method\n    Tokenizer\n        :obj:`Tokenizer`\n    Tokenizer.train\n        :obj:`Tokenizer.train()`\n    Tokenizer.save\n        :obj:`Tokenizer.save()`\n    Tokenizer.from_file\n        :obj:`Tokenizer.fromFile()`\n    Tokenizer.encode\n        :obj:`Tokenizer.encode()`\n    Tokenizer.encode_batch\n        :obj:`Tokenizer.encodeBatch()`\n    Tokenizer.decode\n        :obj:`Tokenizer.decode()`\n    Tokenizer.decode_batch\n        :obj:`Tokenizer.decodeBatch()`\n    Tokenizer.token_to_id\n        :obj:`Tokenizer.tokenToId()`\n    Tokenizer.enable_padding\n        :obj:`Tokenizer.setPadding()`\n    Encoding\n        :obj:`Encoding`\n    TemplateProcessing\n        :obj:`TemplateProcessing`\n    Normalizer\n        :obj:`Normalizer`\n    normalizers.Sequence\n        :obj:`Sequence`\n    pre_tokenizers.Whitespace\n        :obj:`Whitespace`\n    PreTokenizer\n        :obj:`PreTokenizer`\n    models.BPE\n        :obj:`BPE`\n    models.Unigram\n        :obj:`Unigram`\n    models.WordLevel\n        :obj:`WordLevel`\n    models.WordPiece\n        :obj:`WordPiece`\n    Decoder\n        :obj:`Decoder`\n"
  },
  {
    "path": "docs/source/index.rst",
    "content": "Tokenizers\n====================================================================================================\n\nFast State-of-the-art tokenizers, optimized for both research and production\n\n`🤗 Tokenizers`_ provides an implementation of today's most used tokenizers, with\na focus on performance and versatility. These tokenizers are also used in\n`🤗 Transformers`_.\n\n.. _🤗 Tokenizers: https://github.com/huggingface/tokenizers\n.. _🤗 Transformers: https://github.com/huggingface/transformers\n\nMain features:\n----------------------------------------------------------------------------------------------------\n\n - Train new vocabularies and tokenize, using today's most used tokenizers.\n - Extremely fast (both training and tokenization), thanks to the Rust implementation. Takes\n   less than 20 seconds to tokenize a GB of text on a server's CPU.\n - Easy to use, but also extremely versatile.\n - Designed for both research and production.\n - Full alignment tracking. Even with destructive normalization, it's always possible to get\n   the part of the original sentence that corresponds to any token.\n - Does all the pre-processing: Truncation, Padding, add the special tokens your model needs.\n\n\n.. toctree::\n    :maxdepth: 2\n    :caption: Getting Started\n\n    quicktour\n    installation/main\n    pipeline\n    components\n\n.. toctree-tags::\n    :maxdepth: 3\n    :caption: Using 🤗 Tokenizers\n    :glob:\n\n    :python:tutorials/python/*\n\n.. toctree::\n    :maxdepth: 3\n    :caption: API Reference\n\n    api/reference\n\n.. include:: entities.inc\n"
  },
  {
    "path": "docs/source/installation/main.rst",
    "content": "Installation\n====================================================================================================\n\n.. only:: python\n\n    .. include:: python.inc\n\n.. only:: rust\n\n    .. include:: rust.inc\n\n.. only:: node\n\n    .. include:: node.inc\n\n"
  },
  {
    "path": "docs/source/installation/node.inc",
    "content": "Installation with npm\n----------------------------------------------------------------------------------------------------\n\nYou can simply install 🤗 Tokenizers with npm using::\n\n    npm install tokenizers\n"
  },
  {
    "path": "docs/source/installation/python.inc",
    "content": "🤗 Tokenizers is tested on Python 3.5+.\n\nYou should install 🤗 Tokenizers in a\n`virtual environment <https://docs.python.org/3/library/venv.html>`_. If you're unfamiliar with\nPython virtual environments, check out the\n`user guide <https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/>`__.\nCreate a virtual environment with the version of Python you're going to use and activate it.\n\nInstallation with pip\n----------------------------------------------------------------------------------------------------\n\n🤗 Tokenizers can be installed using pip as follows::\n\n    pip install tokenizers\n\n\nInstallation from sources\n----------------------------------------------------------------------------------------------------\n\nTo use this method, you need to have the Rust language installed. You can follow\n`the official guide <https://www.rust-lang.org/learn/get-started>`__ for more information.\n\nIf you are using a unix based OS, the installation should be as simple as running::\n\n    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\nOr you can easily update it with the following command::\n\n    rustup update\n\nOnce rust is installed, we can start retrieving the sources for 🤗 Tokenizers::\n\n    git clone https://github.com/huggingface/tokenizers\n\nThen we go into the python bindings folder::\n\n    cd tokenizers/bindings/python\n\nAt this point you should have your `virtual environment`_ already activated. In order to\ncompile 🤗 Tokenizers, you need to::\n\n    pip install -e .\n"
  },
  {
    "path": "docs/source/installation/rust.inc",
    "content": "Crates.io\n----------------------------------------------------------------------------------------------------\n\n🤗 Tokenizers is available on `crates.io <https://crates.io/crates/tokenizers>`__.\n\nYou just need to add it to your :obj:`Cargo.toml`::\n\n    tokenizers = \"0.10\"\n"
  },
  {
    "path": "docs/source/pipeline.rst",
    "content": "The tokenization pipeline\n====================================================================================================\n\nWhen calling :entity:`Tokenizer.encode` or :entity:`Tokenizer.encode_batch`, the input text(s) go\nthrough the following pipeline:\n\n- :ref:`normalization`\n- :ref:`pre-tokenization`\n- :ref:`model`\n- :ref:`post-processing`\n\nWe'll see in details what happens during each of those steps in detail, as well as when you want to\n:ref:`decode <decoding>` some token ids, and how the 🤗 Tokenizers library allows you to customize\neach of those steps to your needs. If you're already familiar with those steps and want to learn by\nseeing some code, jump to :ref:`our BERT from scratch example <example>`.\n\nFor the examples that require a :entity:`Tokenizer`, we will use the tokenizer we trained\nin the :doc:`quicktour`, which you can load with:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START reload_tokenizer\n        :end-before: END reload_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_reload_tokenizer\n        :end-before: END pipeline_reload_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START reload_tokenizer\n        :end-before: END reload_tokenizer\n        :dedent: 8\n\n\n.. _normalization:\n\nNormalization\n----------------------------------------------------------------------------------------------------\n\nNormalization is, in a nutshell, a set of operations you apply to a raw string to make it less\nrandom or \"cleaner\". Common operations include stripping whitespace, removing accented characters\nor lowercasing all text. If you're familiar with `Unicode normalization\n<https://unicode.org/reports/tr15>`__, it is also a very common normalization operation applied\nin most tokenizers.\n\nEach normalization operation is represented in the 🤗 Tokenizers library by a\n:entity:`Normalizer`, and you can combine several of those by using a\n:entity:`normalizers.Sequence`. Here is a normalizer applying NFD Unicode normalization\nand removing accents as an example:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START setup_normalizer\n        :end-before: END setup_normalizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_setup_normalizer\n        :end-before: END pipeline_setup_normalizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START setup_normalizer\n        :end-before: END setup_normalizer\n        :dedent: 8\n\n\nYou can manually test that normalizer by applying it to any string:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START test_normalizer\n        :end-before: END test_normalizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_test_normalizer\n        :end-before: END pipeline_test_normalizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START test_normalizer\n        :end-before: END test_normalizer\n        :dedent: 8\n\n\nWhen building a :entity:`Tokenizer`, you can customize its normalizer by just changing\nthe corresponding attribute:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START replace_normalizer\n        :end-before: END replace_normalizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_replace_normalizer\n        :end-before: END pipeline_replace_normalizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START replace_normalizer\n        :end-before: END replace_normalizer\n        :dedent: 8\n\nOf course, if you change the way a tokenizer applies normalization, you should probably retrain it\nfrom scratch afterward.\n\n\n.. _pre-tokenization:\n\nPre-Tokenization\n----------------------------------------------------------------------------------------------------\n\nPre-tokenization is the act of splitting a text into smaller objects that give an upper bound to\nwhat your tokens will be at the end of training. A good way to think of this is that the\npre-tokenizer will split your text into \"words\" and then, your final tokens will be parts of those\nwords.\n\nAn easy way to pre-tokenize inputs is to split on spaces and punctuations, which is done by the\n:entity:`pre_tokenizers.Whitespace` pre-tokenizer:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START setup_pre_tokenizer\n        :end-before: END setup_pre_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_setup_pre_tokenizer\n        :end-before: END pipeline_setup_pre_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START setup_pre_tokenizer\n        :end-before: END setup_pre_tokenizer\n        :dedent: 8\n\nThe output is a list of tuples, with each tuple containing one word and its span in the original\nsentence (which is used to determine the final :obj:`offsets` of our :entity:`Encoding`).\nNote that splitting on punctuation will split contractions like :obj:`\"I'm\"` in this example.\n\nYou can combine together any :entity:`PreTokenizer` together. For\ninstance, here is a pre-tokenizer that will split on space, punctuation and digits, separating\nnumbers in their individual digits:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START combine_pre_tokenizer\n        :end-before: END combine_pre_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_combine_pre_tokenizer\n        :end-before: END pipeline_combine_pre_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START combine_pre_tokenizer\n        :end-before: END combine_pre_tokenizer\n        :dedent: 8\n\nAs we saw in the :doc:`quicktour`, you can customize the pre-tokenizer of a\n:entity:`Tokenizer` by just changing the corresponding attribute:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START replace_pre_tokenizer\n        :end-before: END replace_pre_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_replace_pre_tokenizer\n        :end-before: END pipeline_replace_pre_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START replace_pre_tokenizer\n        :end-before: END replace_pre_tokenizer\n        :dedent: 8\n\nOf course, if you change the way the pre-tokenizer, you should probably retrain your tokenizer from\nscratch afterward.\n\n\n.. _model:\n\nThe Model\n----------------------------------------------------------------------------------------------------\n\nOnce the input texts are normalized and pre-tokenized, the :entity:`Tokenizer` applies the model on\nthe pre-tokens.  This is the part of the pipeline that needs training on your corpus (or that has\nbeen trained if you are using a pretrained tokenizer).\n\nThe role of the model is to split your \"words\" into tokens, using the rules it has learned. It's\nalso responsible for mapping those tokens to their corresponding IDs in the vocabulary of the model.\n\nThis model is passed along when initializing the :entity:`Tokenizer` so you already know\nhow to customize this part. Currently, the 🤗 Tokenizers library supports:\n\n- :entity:`models.BPE`\n- :entity:`models.Unigram`\n- :entity:`models.WordLevel`\n- :entity:`models.WordPiece`\n\nFor more details about each model and its behavior, you can check `here <components#models>`__\n\n\n.. _post-processing:\n\nPost-Processing\n----------------------------------------------------------------------------------------------------\n\nPost-processing is the last step of the tokenization pipeline, to perform any additional\ntransformation to the :entity:`Encoding` before it's returned, like adding potential\nspecial tokens.\n\nAs we saw in the quick tour, we can customize the post processor of a :entity:`Tokenizer`\nby setting the corresponding attribute. For instance, here is how we can post-process to make the\ninputs suitable for the BERT model:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START setup_processor\n        :end-before: END setup_processor\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_setup_processor\n        :end-before: END pipeline_setup_processor\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START setup_processor\n        :end-before: END setup_processor\n        :dedent: 8\n\nNote that contrarily to the pre-tokenizer or the normalizer, you don't need to retrain a tokenizer\nafter changing its post-processor.\n\n.. _example:\n\nAll together: a BERT tokenizer from scratch\n----------------------------------------------------------------------------------------------------\n\nLet's put all those pieces together to build a BERT tokenizer. First, BERT relies on WordPiece, so\nwe instantiate a new :entity:`Tokenizer` with this model:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_setup_tokenizer\n        :end-before: END bert_setup_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_setup_tokenizer\n        :end-before: END bert_setup_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_setup_tokenizer\n        :end-before: END bert_setup_tokenizer\n        :dedent: 8\n\nThen we know that BERT preprocesses texts by removing accents and lowercasing. We also use a unicode\nnormalizer:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_setup_normalizer\n        :end-before: END bert_setup_normalizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_setup_normalizer\n        :end-before: END bert_setup_normalizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_setup_normalizer\n        :end-before: END bert_setup_normalizer\n        :dedent: 8\n\nThe pre-tokenizer is just splitting on whitespace and punctuation:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_setup_pre_tokenizer\n        :end-before: END bert_setup_pre_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_setup_pre_tokenizer\n        :end-before: END bert_setup_pre_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_setup_pre_tokenizer\n        :end-before: END bert_setup_pre_tokenizer\n        :dedent: 8\n\nAnd the post-processing uses the template we saw in the previous section:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_setup_processor\n        :end-before: END bert_setup_processor\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_setup_processor\n        :end-before: END bert_setup_processor\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_setup_processor\n        :end-before: END bert_setup_processor\n        :dedent: 8\n\nWe can use this tokenizer and train on it on wikitext like in the :doc:`quicktour`:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_train_tokenizer\n        :end-before: END bert_train_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_train_tokenizer\n        :end-before: END bert_train_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_train_tokenizer\n        :end-before: END bert_train_tokenizer\n        :dedent: 8\n\n\n.. _decoding:\n\nDecoding\n----------------------------------------------------------------------------------------------------\n\n.. entities:: python\n\n    bert_tokenizer\n        :obj:`bert_tokenizer`\n\n.. entities:: rust\n\n    bert_tokenizer\n        :obj:`bert_tokenizer`\n\n.. entities:: node\n\n    bert_tokenizer\n        :obj:`bertTokenizer`\n\n\nOn top of encoding the input texts, a :entity:`Tokenizer` also has an API for decoding,\nthat is converting IDs generated by your model back to a text. This is done by the methods\n:entity:`Tokenizer.decode` (for one predicted text) and :entity:`Tokenizer.decode_batch` (for a\nbatch of predictions).\n\nThe `decoder` will first convert the IDs back to tokens (using the tokenizer's vocabulary) and\nremove all special tokens, then join those tokens with spaces:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START test_decoding\n        :end-before: END test_decoding\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START pipeline_test_decoding\n        :end-before: END pipeline_test_decoding\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START test_decoding\n        :end-before: END test_decoding\n        :dedent: 8\n\nIf you used a model that added special characters to represent subtokens of a given \"word\" (like\nthe :obj:`\"##\"` in WordPiece) you will need to customize the `decoder` to treat them properly. If we\ntake our previous :entity:`bert_tokenizer` for instance the default decoding will give:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_test_decoding\n        :end-before: END bert_test_decoding\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_test_decoding\n        :end-before: END bert_test_decoding\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_test_decoding\n        :end-before: END bert_test_decoding\n        :dedent: 8\n\nBut by changing it to a proper decoder, we get:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_pipeline.py\n        :language: python\n        :start-after: START bert_proper_decoding\n        :end-before: END bert_proper_decoding\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START bert_proper_decoding\n        :end-before: END bert_proper_decoding\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/pipeline.test.ts\n        :language: javascript\n        :start-after: START bert_proper_decoding\n        :end-before: END bert_proper_decoding\n        :dedent: 8\n"
  },
  {
    "path": "docs/source/quicktour.rst",
    "content": "Quicktour\n====================================================================================================\n\nLet's have a quick look at the 🤗 Tokenizers library features. The library provides an\nimplementation of today's most used tokenizers that is both easy to use and blazing fast.\n\n.. only:: python\n\n    It can be used to instantiate a :ref:`pretrained tokenizer <pretrained>` but we will start our\n    quicktour by building one from scratch and see how we can train it.\n\n\nBuild a tokenizer from scratch\n----------------------------------------------------------------------------------------------------\n\nTo illustrate how fast the 🤗 Tokenizers library is, let's train a new tokenizer on `wikitext-103\n<https://blog.einstein.ai/the-wikitext-long-term-dependency-language-modeling-dataset/>`__ (516M of\ntext) in just a few seconds. First things first, you will need to download this dataset and unzip it\nwith:\n\n.. code-block:: bash\n\n    wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip\n    unzip wikitext-103-raw-v1.zip\n\nTraining the tokenizer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. entities:: python\n\n    BpeTrainer\n        :class:`~tokenizers.trainers.BpeTrainer`\n    vocab_size\n        :obj:`vocab_size`\n    min_frequency\n        :obj:`min_frequency`\n    special_tokens\n        :obj:`special_tokens`\n    unk_token\n        :obj:`unk_token`\n    pad_token\n        :obj:`pad_token`\n\n.. entities:: rust\n\n    BpeTrainer\n        :rust_struct:`~tokenizers::models::bpe::BpeTrainer`\n    vocab_size\n        :obj:`vocab_size`\n    min_frequency\n        :obj:`min_frequency`\n    special_tokens\n        :obj:`special_tokens`\n    unk_token\n        :obj:`unk_token`\n    pad_token\n        :obj:`pad_token`\n\n.. entities:: node\n\n    BpeTrainer\n        BpeTrainer\n    vocab_size\n        :obj:`vocabSize`\n    min_frequency\n        :obj:`minFrequency`\n    special_tokens\n        :obj:`specialTokens`\n    unk_token\n        :obj:`unkToken`\n    pad_token\n        :obj:`padToken`\n\nIn this tour, we will build and train a Byte-Pair Encoding (BPE) tokenizer. For more information\nabout the different type of tokenizers, check out this `guide\n<https://huggingface.co/docs/transformers/main/en/tokenizer_summary#summary-of-the-tokenizers>`__ in the 🤗 Transformers\ndocumentation. Here, training the tokenizer means it will learn merge rules by:\n\n- Start with all the characters present in the training corpus as tokens.\n- Identify the most common pair of tokens and merge it into one token.\n- Repeat until the vocabulary (e.g., the number of tokens) has reached the size we want.\n\nThe main API of the library is the :entity:`class` :entity:`Tokenizer`, here is how we instantiate\none with a BPE model:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START init_tokenizer\n        :end-before: END init_tokenizer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_init_tokenizer\n        :end-before: END quicktour_init_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START init_tokenizer\n        :end-before: END init_tokenizer\n        :dedent: 4\n\nTo train our tokenizer on the wikitext files, we will need to instantiate a `trainer`, in this case\na :entity:`BpeTrainer`\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START init_trainer\n        :end-before: END init_trainer\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_init_trainer\n        :end-before: END quicktour_init_trainer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START init_trainer\n        :end-before: END init_trainer\n        :dedent: 4\n\nWe can set the training arguments like :entity:`vocab_size` or :entity:`min_frequency` (here left at\ntheir default values of 30,000 and 0) but the most important part is to give the\n:entity:`special_tokens` we plan to use later on (they are not used at all during training) so that\nthey get inserted in the vocabulary.\n\n.. note::\n\n    The order in which you write the special tokens list matters: here :obj:`\"[UNK]\"` will get the\n    ID 0, :obj:`\"[CLS]\"` will get the ID 1 and so forth.\n\nWe could train our tokenizer right now, but it wouldn't be optimal. Without a pre-tokenizer that\nwill split our inputs into words, we might get tokens that overlap several words: for instance we\ncould get an :obj:`\"it is\"` token since those two words often appear next to each other. Using a\npre-tokenizer will ensure no token is bigger than a word returned by the pre-tokenizer. Here we want\nto train a subword BPE tokenizer, and we will use the easiest pre-tokenizer possible by splitting\non whitespace.\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START init_pretok\n        :end-before: END init_pretok\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_init_pretok\n        :end-before: END quicktour_init_pretok\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START init_pretok\n        :end-before: END init_pretok\n        :dedent: 4\n\nNow, we can just call the :entity:`Tokenizer.train` method with any list of files we want\nto use:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START train\n        :end-before: END train\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_train\n        :end-before: END quicktour_train\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START train\n        :end-before: END train\n        :dedent: 4\n\nThis should only take a few seconds to train our tokenizer on the full wikitext dataset!\nTo save the tokenizer in one file that contains all its configuration and vocabulary, just use the\n:entity:`Tokenizer.save` method:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START save\n        :end-before: END save\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_save\n        :end-before: END quicktour_save\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START save\n        :end-before: END save\n        :dedent: 4\n\nand you can reload your tokenizer from that file with the :entity:`Tokenizer.from_file`\n:entity:`classmethod`:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START reload_tokenizer\n        :end-before: END reload_tokenizer\n        :dedent: 12\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_reload_tokenizer\n        :end-before: END quicktour_reload_tokenizer\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START reload_tokenizer\n        :end-before: END reload_tokenizer\n        :dedent: 4\n\nUsing the tokenizer\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNow that we have trained a tokenizer, we can use it on any text we want with the\n:entity:`Tokenizer.encode` method:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START encode\n        :end-before: END encode\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_encode\n        :end-before: END quicktour_encode\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START encode\n        :end-before: END encode\n        :dedent: 4\n\nThis applied the full pipeline of the tokenizer on the text, returning an\n:entity:`Encoding` object. To learn more about this pipeline, and how to apply (or\ncustomize) parts of it, check out :doc:`this page <pipeline>`.\n\nThis :entity:`Encoding` object then has all the attributes you need for your deep\nlearning model (or other). The :obj:`tokens` attribute contains the segmentation of your text in\ntokens:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_tokens\n        :end-before: END print_tokens\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_tokens\n        :end-before: END quicktour_print_tokens\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_tokens\n        :end-before: END print_tokens\n        :dedent: 4\n\nSimilarly, the :obj:`ids` attribute will contain the index of each of those tokens in the\ntokenizer's vocabulary:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_ids\n        :end-before: END print_ids\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_ids\n        :end-before: END quicktour_print_ids\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_ids\n        :end-before: END print_ids\n        :dedent: 4\n\nAn important feature of the 🤗 Tokenizers library is that it comes with full alignment tracking,\nmeaning you can always get the part of your original sentence that corresponds to a given token.\nThose are stored in the :obj:`offsets` attribute of our :entity:`Encoding` object. For\ninstance, let's assume we would want to find back what caused the :obj:`\"[UNK]\"` token to appear,\nwhich is the token at index 9 in the list, we can just ask for the offset at the index:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_offsets\n        :end-before: END print_offsets\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_offsets\n        :end-before: END quicktour_print_offsets\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_offsets\n        :end-before: END print_offsets\n        :dedent: 4\n\nand those are the indices that correspond to the emoji in the original sentence:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START use_offsets\n        :end-before: END use_offsets\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_use_offsets\n        :end-before: END quicktour_use_offsets\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START use_offsets\n        :end-before: END use_offsets\n        :dedent: 4\n\nPost-processing\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWe might want our tokenizer to automatically add special tokens, like :obj:`\"[CLS]\"` or\n:obj:`\"[SEP]\"`. To do this, we use a post-processor. :entity:`TemplateProcessing` is the\nmost commonly used, you just have to specify a template for the processing of single sentences and\npairs of sentences, along with the special tokens and their IDs.\n\nWhen we built our tokenizer, we set :obj:`\"[CLS]\"` and :obj:`\"[SEP]\"` in positions 1 and 2 of our\nlist of special tokens, so this should be their IDs. To double-check, we can use the\n:entity:`Tokenizer.token_to_id` method:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START check_sep\n        :end-before: END check_sep\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_check_sep\n        :end-before: END quicktour_check_sep\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START check_sep\n        :end-before: END check_sep\n        :dedent: 4\n\nHere is how we can set the post-processing to give us the traditional BERT inputs:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START init_template_processing\n        :end-before: END init_template_processing\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_init_template_processing\n        :end-before: END quicktour_init_template_processing\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START init_template_processing\n        :end-before: END init_template_processing\n        :dedent: 4\n\nLet's go over this snippet of code in more details. First we specify the template for single\nsentences: those should have the form :obj:`\"[CLS] $A [SEP]\"` where :obj:`$A` represents our\nsentence.\n\nThen, we specify the template for sentence pairs, which should have the form\n:obj:`\"[CLS] $A [SEP] $B [SEP]\"` where :obj:`$A` represents the first sentence and :obj:`$B` the\nsecond one. The :obj:`:1` added in the template represent the `type IDs` we want for each part of\nour input: it defaults to 0 for everything (which is why we don't have :obj:`$A:0`) and here we set\nit to 1 for the tokens of the second sentence and the last :obj:`\"[SEP]\"` token.\n\nLastly, we specify the special tokens we used and their IDs in our tokenizer's vocabulary.\n\nTo check out this worked properly, let's try to encode the same sentence as before:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_special_tokens\n        :end-before: END print_special_tokens\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_special_tokens\n        :end-before: END quicktour_print_special_tokens\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_special_tokens\n        :end-before: END print_special_tokens\n        :dedent: 4\n\nTo check the results on a pair of sentences, we just pass the two sentences to\n:entity:`Tokenizer.encode`:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_special_tokens_pair\n        :end-before: END print_special_tokens_pair\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_special_tokens_pair\n        :end-before: END quicktour_print_special_tokens_pair\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_special_tokens_pair\n        :end-before: END print_special_tokens_pair\n        :dedent: 4\n\nYou can then check the type IDs attributed to each token is correct with\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_type_ids\n        :end-before: END print_type_ids\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_type_ids\n        :end-before: END quicktour_print_type_ids\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_type_ids\n        :end-before: END print_type_ids\n        :dedent: 4\n\nIf you save your tokenizer with :entity:`Tokenizer.save`, the post-processor will be saved along.\n\nEncoding multiple sentences in a batch\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo get the full speed of the 🤗 Tokenizers library, it's best to process your texts by batches by\nusing the :entity:`Tokenizer.encode_batch` method:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START encode_batch\n        :end-before: END encode_batch\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_encode_batch\n        :end-before: END quicktour_encode_batch\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START encode_batch\n        :end-before: END encode_batch\n        :dedent: 4\n\nThe output is then a list of :entity:`Encoding` objects like the ones we saw before. You\ncan process together as many texts as you like, as long as it fits in memory.\n\nTo process a batch of sentences pairs, pass two lists to the\n:entity:`Tokenizer.encode_batch` method: the list of sentences A and the list of sentences\nB:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START encode_batch_pair\n        :end-before: END encode_batch_pair\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_encode_batch_pair\n        :end-before: END quicktour_encode_batch_pair\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START encode_batch_pair\n        :end-before: END encode_batch_pair\n        :dedent: 4\n\nWhen encoding multiple sentences, you can automatically pad the outputs to the longest sentence\npresent by using :entity:`Tokenizer.enable_padding`, with the :entity:`pad_token` and its ID\n(which we can double-check the id for the padding token with\n:entity:`Tokenizer.token_to_id` like before):\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START enable_padding\n        :end-before: END enable_padding\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_enable_padding\n        :end-before: END quicktour_enable_padding\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START enable_padding\n        :end-before: END enable_padding\n        :dedent: 4\n\nWe can set the :obj:`direction` of the padding (defaults to the right) or a given :obj:`length` if\nwe want to pad every sample to that specific number (here we leave it unset to pad to the size of\nthe longest text).\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_batch_tokens\n        :end-before: END print_batch_tokens\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_batch_tokens\n        :end-before: END quicktour_print_batch_tokens\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_batch_tokens\n        :end-before: END print_batch_tokens\n        :dedent: 4\n\nIn this case, the `attention mask` generated by the tokenizer takes the padding into account:\n\n.. only:: python\n\n    .. literalinclude:: ../../bindings/python/tests/documentation/test_quicktour.py\n        :language: python\n        :start-after: START print_attention_mask\n        :end-before: END print_attention_mask\n        :dedent: 8\n\n.. only:: rust\n\n    .. literalinclude:: ../../tokenizers/tests/documentation.rs\n        :language: rust\n        :start-after: START quicktour_print_attention_mask\n        :end-before: END quicktour_print_attention_mask\n        :dedent: 4\n\n.. only:: node\n\n    .. literalinclude:: ../../bindings/node/examples/documentation/quicktour.test.ts\n        :language: javascript\n        :start-after: START print_attention_mask\n        :end-before: END print_attention_mask\n        :dedent: 4\n\n.. _pretrained:\n\n.. only:: python\n\n    Using a pretrained tokenizer\n    ------------------------------------------------------------------------------------------------\n\n    You can load any tokenizer from the Hugging Face Hub as long as a `tokenizer.json` file is\n    available in the repository.\n\n    .. code-block:: python\n\n        from tokenizers import Tokenizer\n\n        tokenizer = Tokenizer.from_pretrained(\"bert-base-uncased\")\n\n    Importing a pretrained tokenizer from legacy vocabulary files\n    ------------------------------------------------------------------------------------------------\n\n    You can also import a pretrained tokenizer directly in, as long as you have its vocabulary file.\n    For instance, here is how to import the classic pretrained BERT tokenizer:\n\n    .. code-block:: python\n\n        from tokenizers import BertWordPieceTokenizer\n\n        tokenizer = BertWordPieceTokenizer(\"bert-base-uncased-vocab.txt\", lowercase=True)\n\n    as long as you have downloaded the file `bert-base-uncased-vocab.txt` with\n\n    .. code-block:: bash\n\n        wget https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt\n"
  },
  {
    "path": "docs/source/tutorials/python/training_from_memory.rst",
    "content": "Training from memory\n----------------------------------------------------------------------------------------------------\n\nIn the `Quicktour <quicktour>`__, we saw how to build and train a tokenizer using text files,\nbut we can actually use any Python Iterator. In this section we'll see a few different ways of\ntraining our tokenizer.\n\nFor all the examples listed below, we'll use the same :class:`~tokenizers.Tokenizer` and\n:class:`~tokenizers.trainers.Trainer`, built as following:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START init_tokenizer_trainer\n    :end-before: END init_tokenizer_trainer\n    :dedent: 8\n\nThis tokenizer is based on the :class:`~tokenizers.models.Unigram` model. It takes care of\nnormalizing the input using the NFKC Unicode normalization method, and uses a\n:class:`~tokenizers.pre_tokenizers.ByteLevel` pre-tokenizer with the corresponding decoder.\n\nFor more information on the components used here, you can check `here <components>`__\n\nThe most basic way\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs you probably guessed already, the easiest way to train our tokenizer is by using a :obj:`List`:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START train_basic\n    :end-before: END train_basic\n    :dedent: 8\n\nEasy, right? You can use anything working as an iterator here, be it a :obj:`List`, :obj:`Tuple`,\nor a :obj:`np.Array`. Anything works as long as it provides strings.\n\nUsing the 🤗 Datasets library\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAn awesome way to access one of the many datasets that exist out there is by using the 🤗 Datasets\nlibrary. For more information about it, you should check\n`the official documentation here <https://huggingface.co/docs/datasets/>`__.\n\nLet's start by loading our dataset:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START load_dataset\n    :end-before: END load_dataset\n    :dedent: 8\n\nThe next step is to build an iterator over this dataset. The easiest way to do this is probably by\nusing a generator:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START def_batch_iterator\n    :end-before: END def_batch_iterator\n    :dedent: 8\n\nAs you can see here, for improved efficiency we can actually provide a batch of examples used\nto train, instead of iterating over them one by one. By doing so, we can expect performances very\nsimilar to those we got while training directly from files.\n\nWith our iterator ready, we just need to launch the training. In order to improve the look of our\nprogress bars, we can specify the total length of the dataset:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START train_datasets\n    :end-before: END train_datasets\n    :dedent: 8\n\nAnd that's it!\n\nUsing gzip files\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSince gzip files in Python can be used as iterators, it is extremely simple to train on such files:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START single_gzip\n    :end-before: END single_gzip\n    :dedent: 8\n\nNow if we wanted to train from multiple gzip files, it wouldn't be much harder:\n\n.. literalinclude:: ../../../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\n    :language: python\n    :start-after: START multi_gzip\n    :end-before: END multi_gzip\n    :dedent: 8\n\nAnd voilà!\n"
  },
  {
    "path": "docs/source-doc-builder/_toctree.yml",
    "content": "- sections: \n  - local: index\n    title: 🤗 Tokenizers\n  - local: quicktour\n    title: Quicktour\n  - local: installation\n    title: Installation\n  - local: pipeline\n    title: The tokenization pipeline\n  - local: components\n    title: Components\n  - local: training_from_memory\n    title: Training from memory\n  title: Getting started\n- sections:\n  - local: api/input-sequences\n    title: Input Sequences\n  - local: api/encode-inputs\n    title: Encode Inputs\n  - local: api/tokenizer\n    title: Tokenizer\n  - local: api/encoding\n    title: Encoding\n  - local: api/added-tokens\n    title: Added Tokens\n  - local: api/models\n    title: Models\n  - local: api/normalizers\n    title: Normalizers\n  - local: api/pre-tokenizers\n    title: Pre-tokenizers\n  - local: api/post-processors\n    title: Post-processors\n  - local: api/trainers\n    title: Trainers\n  - local: api/decoders\n    title: Decoders\n  - local: api/visualizer\n    title: Visualizer\n  title: API\n"
  },
  {
    "path": "docs/source-doc-builder/api/added-tokens.mdx",
    "content": "# Added Tokens\n\n<tokenizerslangcontent>\n<python>\n## AddedToken\n\n[[autodoc]] tokenizers.AddedToken\n    - content\n    - lstrip\n    - normalized\n    - rstrip\n    - single_word\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/decoders.mdx",
    "content": "# Decoders\n\n<tokenizerslangcontent>\n<python>\n## DecodeStream\n[[autodoc]] tokenizers.decoders.DecodeStream\n\n## BPEDecoder\n\n[[autodoc]] tokenizers.decoders.BPEDecoder\n\n## ByteFallback\n\n[[autodoc]] tokenizers.decoders.ByteFallback\n\n## ByteLevel\n\n[[autodoc]] tokenizers.decoders.ByteLevel\n\n## CTC\n\n[[autodoc]] tokenizers.decoders.CTC\n\n## Fuse\n\n[[autodoc]] tokenizers.decoders.Fuse\n\n## Metaspace\n\n[[autodoc]] tokenizers.decoders.Metaspace\n\n## Replace\n\n[[autodoc]] tokenizers.decoders.Replace\n\n## Sequence\n\n[[autodoc]] tokenizers.decoders.Sequence\n\n## Strip\n\n[[autodoc]] tokenizers.decoders.Strip\n\n## WordPiece\n\n[[autodoc]] tokenizers.decoders.WordPiece\n\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>\n"
  },
  {
    "path": "docs/source-doc-builder/api/encode-inputs.mdx",
    "content": "# Encode Inputs\n\n<tokenizerslangcontent>\n<python>\nThese types represent all the different kinds of input that a [`~tokenizers.Tokenizer`] accepts\nwhen using [`~tokenizers.Tokenizer.encode_batch`].\n\n## TextEncodeInput[[[[tokenizers.TextEncodeInput]]]]\n\n<code>tokenizers.TextEncodeInput</code>\n\nRepresents a textual input for encoding. Can be either:\n- A single sequence: [TextInputSequence](/docs/tokenizers/api/input-sequences#tokenizers.TextInputSequence)\n- A pair of sequences:\n  - A Tuple of [TextInputSequence](/docs/tokenizers/api/input-sequences#tokenizers.TextInputSequence)\n  - Or a List of [TextInputSequence](/docs/tokenizers/api/input-sequences#tokenizers.TextInputSequence) of size 2\n\nalias of `Union[str, Tuple[str, str], List[str]]`.\n\n## PreTokenizedEncodeInput[[[[tokenizers.PreTokenizedEncodeInput]]]]\n\n<code>tokenizers.PreTokenizedEncodeInput</code>\n\nRepresents a pre-tokenized input for encoding. Can be either:\n- A single sequence: [PreTokenizedInputSequence](/docs/tokenizers/api/input-sequences#tokenizers.PreTokenizedInputSequence)\n- A pair of sequences:\n  - A Tuple of [PreTokenizedInputSequence](/docs/tokenizers/api/input-sequences#tokenizers.PreTokenizedInputSequence)\n  - Or a List of [PreTokenizedInputSequence](/docs/tokenizers/api/input-sequences#tokenizers.PreTokenizedInputSequence) of size 2\n\nalias of `Union[List[str], Tuple[str], Tuple[Union[List[str], Tuple[str]], Union[List[str], Tuple[str]]], List[Union[List[str], Tuple[str]]]]`.\n\n## EncodeInput[[[[tokenizers.EncodeInput]]]]\n\n<code>tokenizers.EncodeInput</code>\n\nRepresents all the possible types of input for encoding. Can be:\n- When `is_pretokenized=False`: [TextEncodeInput](#tokenizers.TextEncodeInput)\n- When `is_pretokenized=True`: [PreTokenizedEncodeInput](#tokenizers.PreTokenizedEncodeInput)\n\nalias of `Union[str, Tuple[str, str], List[str], Tuple[str], Tuple[Union[List[str], Tuple[str]], Union[List[str], Tuple[str]]], List[Union[List[str], Tuple[str]]]]`.\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/encoding.mdx",
    "content": "# Encoding\n\n<tokenizerslangcontent>\n<python>\n## Encoding\n\n[[autodoc]] tokenizers.Encoding\n    - all\n    - attention_mask\n    - ids\n    - n_sequences\n    - offsets\n    - overflowing\n    - sequence_ids\n    - special_tokens_mask\n    - tokens\n    - type_ids\n    - word_ids\n    - words\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/input-sequences.mdx",
    "content": "# Input Sequences\n\n<tokenizerslangcontent>\n<python>\nThese types represent all the different kinds of sequence that can be used as input of a Tokenizer.\nGlobally, any sequence can be either a string or a list of strings, according to the operating\nmode of the tokenizer: `raw text` vs `pre-tokenized`.\n\n## TextInputSequence[[tokenizers.TextInputSequence]]\n\n<code>tokenizers.TextInputSequence</code>\n\nA `str` that represents an input sequence\n\n## PreTokenizedInputSequence[[tokenizers.PreTokenizedInputSequence]]\n\n<code>tokenizers.PreTokenizedInputSequence</code>\n\nA pre-tokenized input sequence. Can be one of:\n- A `List` of `str`\n- A `Tuple` of `str`\n\nalias of `Union[List[str], Tuple[str]]`.\n\n## InputSequence[[tokenizers.InputSequence]]\n\n<code>tokenizers.InputSequence</code>\n\nRepresents all the possible types of input sequences for encoding. Can be:\n- When `is_pretokenized=False`: [TextInputSequence](#tokenizers.TextInputSequence)\n- When `is_pretokenized=True`: [PreTokenizedInputSequence](#tokenizers.PreTokenizedInputSequence)\n\nalias of `Union[str, List[str], Tuple[str]]`.\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/models.mdx",
    "content": "# Models\n\n<tokenizerslangcontent>\n<python>\n## BPE\n\n[[autodoc]] tokenizers.models.BPE\n\n## Model\n\n[[autodoc]] tokenizers.models.Model\n\n## Unigram\n\n[[autodoc]] tokenizers.models.Unigram\n\n## WordLevel\n\n[[autodoc]] tokenizers.models.WordLevel\n\n## WordPiece\n\n[[autodoc]] tokenizers.models.WordPiece\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/normalizers.mdx",
    "content": "# Normalizers\n\n<tokenizerslangcontent>\n<python>\n\n## ByteLevel\n\n[[autodoc]] tokenizers.normalizers.ByteLevel\n\n## Lowercase\n\n[[autodoc]] tokenizers.normalizers.Lowercase\n\n## NFC\n\n[[autodoc]] tokenizers.normalizers.NFC\n\n## NFD\n\n[[autodoc]] tokenizers.normalizers.NFD\n\n## NFKC\n\n[[autodoc]] tokenizers.normalizers.NFKC\n\n## NFKD\n\n[[autodoc]] tokenizers.normalizers.NFKD\n\n## Nmt\n\n[[autodoc]] tokenizers.normalizers.Nmt\n\n## Normalizer\n\n[[autodoc]] tokenizers.normalizers.Normalizer\n\n## Precompiled\n\n[[autodoc]] tokenizers.normalizers.Precompiled\n\n## Replace\n\n[[autodoc]] tokenizers.normalizers.Replace\n\n## Sequence\n\n[[autodoc]] tokenizers.normalizers.Sequence\n\n## Strip\n\n[[autodoc]] tokenizers.normalizers.Strip\n\n## StripAccents\n\n[[autodoc]] tokenizers.normalizers.StripAccents\n\n## BertNormalizer\n\n[[autodoc]] tokenizers.normalizers.BertNormalizer\n\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>\n"
  },
  {
    "path": "docs/source-doc-builder/api/post-processors.mdx",
    "content": "# Post-processors\n\n<tokenizerslangcontent>\n<python>\n## BertProcessing\n\n[[autodoc]] tokenizers.processors.BertProcessing\n\n## ByteLevel\n\n[[autodoc]] tokenizers.processors.ByteLevel\n\n## RobertaProcessing\n\n[[autodoc]] tokenizers.processors.RobertaProcessing\n\n## TemplateProcessing\n\n[[autodoc]] tokenizers.processors.TemplateProcessing\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/pre-tokenizers.mdx",
    "content": "# Pre-tokenizers\n\n<tokenizerslangcontent>\n<python>\n## BertPreTokenizer\n\n[[autodoc]] tokenizers.pre_tokenizers.BertPreTokenizer\n\n## ByteLevel\n\n[[autodoc]] tokenizers.pre_tokenizers.ByteLevel\n\n## CharDelimiterSplit\n\n[[autodoc]] tokenizers.pre_tokenizers.CharDelimiterSplit\n\n## Digits\n\n[[autodoc]] tokenizers.pre_tokenizers.Digits\n\n## Metaspace\n\n[[autodoc]] tokenizers.pre_tokenizers.Metaspace\n\n## PreTokenizer\n\n[[autodoc]] tokenizers.pre_tokenizers.PreTokenizer\n\n## Punctuation\n\n[[autodoc]] tokenizers.pre_tokenizers.Punctuation\n\n## Sequence\n\n[[autodoc]] tokenizers.pre_tokenizers.Sequence\n\n## Split\n\n[[autodoc]] tokenizers.pre_tokenizers.Split\n\n## UnicodeScripts\n\n[[autodoc]] tokenizers.pre_tokenizers.UnicodeScripts\n\n## Whitespace\n\n[[autodoc]] tokenizers.pre_tokenizers.Whitespace\n\n## WhitespaceSplit\n\n[[autodoc]] tokenizers.pre_tokenizers.WhitespaceSplit\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/tokenizer.mdx",
    "content": "# Tokenizer\n\n<tokenizerslangcontent>\n<python>\n## Tokenizer\n\n[[autodoc]] tokenizers.Tokenizer\n    - all\n    - decoder\n    - model\n    - normalizer\n    - padding\n    - post_processor\n    - pre_tokenizer\n    - truncation\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/trainers.mdx",
    "content": "# Trainers\n\n<tokenizerslangcontent>\n<python>\n## BpeTrainer\n\n[[autodoc]] tokenizers.trainers.BpeTrainer\n\n## UnigramTrainer\n\n[[autodoc]] tokenizers.trainers.UnigramTrainer\n\n## WordLevelTrainer\n\n[[autodoc]] tokenizers.trainers.WordLevelTrainer\n\n## WordPieceTrainer\n\n[[autodoc]] tokenizers.trainers.WordPieceTrainer\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/api/visualizer.mdx",
    "content": "# Visualizer\n\n<tokenizerslangcontent>\n<python>\n## Annotation\n\n[[autodoc]] tokenizers.tools.Annotation\n\n## EncodingVisualizer\n\n[[autodoc]] tokenizers.tools.EncodingVisualizer\n    -  __call__\n</python>\n<rust>\nThe Rust API Reference is available directly on the [Docs.rs](https://docs.rs/tokenizers/latest/tokenizers/) website.\n</rust>\n<node>\nThe node API has not been documented yet.\n</node>\n</tokenizerslangcontent>"
  },
  {
    "path": "docs/source-doc-builder/components.mdx",
    "content": "# Components\n\nWhen building a Tokenizer, you can attach various types of components to\nthis Tokenizer in order to customize its behavior. This page lists most\nprovided components.\n\n## Normalizers\n\nA `Normalizer` is in charge of pre-processing the input string in order\nto normalize it as relevant for a given use case. Some common examples\nof normalization are the Unicode normalization algorithms (NFD, NFKD,\nNFC & NFKC), lowercasing etc... The specificity of `tokenizers` is that\nwe keep track of the alignment while normalizing. This is essential to\nallow mapping from the generated tokens back to the input text.\n\nThe `Normalizer` is optional.\n\n<tokenizerslangcontent>\n<python>\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| NFD | NFD unicode normalization |  |\n| NFKD | NFKD unicode normalization |  |\n| NFC | NFC unicode normalization |  |\n| NFKC | NFKC unicode normalization |  |\n| Lowercase | Replaces all uppercase to lowercase | Input: `HELLO ὈΔΥΣΣΕΎΣ` <br> Output: `hello`ὀδυσσεύς`  |\n| Strip | Removes all whitespace characters on the specified sides (left, right or both) of the input | Input: `\"`hi`\"` <br> Output: `\"hi\"`  |\n| StripAccents | Removes all accent symbols in unicode (to be used with NFD for consistency) | Input: `é` <br> Output: `e`  |\n| Replace | Replaces a custom string or regexp and changes it with given content | `Replace(\"a\", \"e\")` will behave like this: <br> Input: `\"banana\"` <br> Output: `\"benene\"`  |\n| BertNormalizer | Provides an implementation of the Normalizer used in the original BERT. Options that can be set are: <ul> <li>clean_text</li> <li>handle_chinese_chars</li> <li>strip_accents</li> <li>lowercase</li> </ul>  |  |\n| Sequence | Composes multiple normalizers that will run in the provided order | `Sequence([NFKC(), Lowercase()])` |\n</python>\n<rust>\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| NFD | NFD unicode normalization |  |\n| NFKD | NFKD unicode normalization |  |\n| NFC | NFC unicode normalization |  |\n| NFKC | NFKC unicode normalization |  |\n| Lowercase | Replaces all uppercase to lowercase | Input: `HELLO ὈΔΥΣΣΕΎΣ` <br> Output: `hello`ὀδυσσεύς`  |\n| Strip | Removes all whitespace characters on the specified sides (left, right or both) of the input | Input: `\"`hi`\"` <br> Output: `\"hi\"`  |\n| StripAccents | Removes all accent symbols in unicode (to be used with NFD for consistency) | Input: `é` <br> Output: `e`  |\n| Replace | Replaces a custom string or regexp and changes it with given content | `Replace(\"a\", \"e\")` will behave like this: <br> Input: `\"banana\"` <br> Output: `\"benene\"`  |\n| BertNormalizer | Provides an implementation of the Normalizer used in the original BERT. Options that can be set are: <ul> <li>clean_text</li> <li>handle_chinese_chars</li> <li>strip_accents</li> <li>lowercase</li> </ul>  |  |\n| Sequence | Composes multiple normalizers that will run in the provided order | `Sequence::new(vec![NFKC, Lowercase])` |\n</rust>\n<node>\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| NFD | NFD unicode normalization |  |\n| NFKD | NFKD unicode normalization |  |\n| NFC | NFC unicode normalization |  |\n| NFKC | NFKC unicode normalization |  |\n| Lowercase | Replaces all uppercase to lowercase | Input: `HELLO ὈΔΥΣΣΕΎΣ` <br> Output: `hello`ὀδυσσεύς`  |\n| Strip | Removes all whitespace characters on the specified sides (left, right or both) of the input | Input: `\"`hi`\"` <br> Output: `\"hi\"`  |\n| StripAccents | Removes all accent symbols in unicode (to be used with NFD for consistency) | Input: `é` <br> Output: `e`  |\n| Replace | Replaces a custom string or regexp and changes it with given content | `Replace(\"a\", \"e\")` will behave like this: <br> Input: `\"banana\"` <br> Output: `\"benene\"`  |\n| BertNormalizer | Provides an implementation of the Normalizer used in the original BERT. Options that can be set are: <ul> <li>cleanText</li> <li>handleChineseChars</li> <li>stripAccents</li> <li>lowercase</li> </ul>  |  |\n| Sequence | Composes multiple normalizers that will run in the provided order | |\n</node>\n</tokenizerslangcontent>\n\n## Pre-tokenizers\n\nThe `PreTokenizer` takes care of splitting the input according to a set\nof rules. This pre-processing lets you ensure that the underlying\n`Model` does not build tokens across multiple \"splits\". For example if\nyou don't want to have whitespaces inside a token, then you can have a\n`PreTokenizer` that splits on these whitespaces.\n\nYou can easily combine multiple `PreTokenizer` together using a\n`Sequence` (see below). The `PreTokenizer` is also allowed to modify the\nstring, just like a `Normalizer` does. This is necessary to allow some\ncomplicated algorithms that require to split before normalizing (e.g.\nthe ByteLevel)\n\n<tokenizerslangcontent>\n<python>\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| ByteLevel | Splits on whitespaces while remapping all the bytes to a set of visible characters. This technique as been introduced by OpenAI with GPT-2 and has some more or less nice properties: <ul> <li>Since it maps on bytes, a tokenizer using this only requires **256** characters as initial alphabet (the number of values a byte can have), as opposed to the 130,000+ Unicode characters.</li> <li>A consequence of the previous point is that it is absolutely unnecessary to have an unknown token using this since we can represent anything with 256 tokens (Youhou!! 🎉🎉)</li> <li>For non ascii characters, it gets completely unreadable, but it works nonetheless!</li> </ul> | Input: `\"Hello my friend, how are you?\"` <br> Output: `\"Hello\", \"Ġmy\", Ġfriend\", \",\", \"Ġhow\", \"Ġare\", \"Ġyou\", \"?\"`  |\n| Whitespace | Splits on word boundaries (using the following regular expression: `\\w+&#124;[^\\w\\s]+` | Input: `\"Hello there!\"` <br> Output: `\"Hello\", \"there\", \"!\"`  |\n| WhitespaceSplit | Splits on any whitespace character | Input: `\"Hello there!\"` <br> Output: `\"Hello\", \"there!\"`  |\n| Punctuation | Will isolate all punctuation characters | Input: `\"Hello?\"` <br> Output: `\"Hello\", \"?\"`  |\n| Metaspace | Splits on whitespaces and replaces them with a special char “▁” (U+2581) | Input: `\"Hello there\"` <br> Output: `\"Hello\", \"▁there\"`  |\n| CharDelimiterSplit | Splits on a given character | Example with `x`: <br> Input: `\"Helloxthere\"` <br> Output: `\"Hello\", \"there\"`  |\n| Digits | Splits the numbers from any other characters. | Input: `\"Hello123there\"` <br>  Output: ``\"Hello\", \"123\", \"there\"``  |\n| Split | Versatile pre-tokenizer that splits on provided pattern and according to provided behavior. The pattern can be inverted if necessary. <ul> <li>pattern should be either a custom string or regexp.</li> <li>behavior should be one of: <ul><li>removed</li><li>isolated</li><li>merged_with_previous</li><li>merged_with_next</li><li>contiguous</li></ul></li> <li>invert should be a boolean flag.</li> </ul> | Example with pattern = ` `, behavior = `\"isolated\"`, invert = `False`: <br> Input: `\"Hello, how are you?\"` <br> Output: `\"Hello,\", \" \", \"how\", \" \", \"are\", \" \", \"you?\"` |\n| Sequence | Lets you compose multiple `PreTokenizer` that will be run in the given order | `Sequence([Punctuation(), WhitespaceSplit()])` |\n</python>\n<rust>\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| ByteLevel | Splits on whitespaces while remapping all the bytes to a set of visible characters. This technique as been introduced by OpenAI with GPT-2 and has some more or less nice properties: <ul> <li>Since it maps on bytes, a tokenizer using this only requires **256** characters as initial alphabet (the number of values a byte can have), as opposed to the 130,000+ Unicode characters.</li> <li>A consequence of the previous point is that it is absolutely unnecessary to have an unknown token using this since we can represent anything with 256 tokens (Youhou!! 🎉🎉)</li> <li>For non ascii characters, it gets completely unreadable, but it works nonetheless!</li> </ul> | Input: `\"Hello my friend, how are you?\"` <br> Output: `\"Hello\", \"Ġmy\", Ġfriend\", \",\", \"Ġhow\", \"Ġare\", \"Ġyou\", \"?\"`  |\n| Whitespace | Splits on word boundaries (using the following regular expression: `\\w+&#124;[^\\w\\s]+` | Input: `\"Hello there!\"` <br> Output: `\"Hello\", \"there\", \"!\"`  |\n| WhitespaceSplit | Splits on any whitespace character | Input: `\"Hello there!\"` <br> Output: `\"Hello\", \"there!\"`  |\n| Punctuation | Will isolate all punctuation characters | Input: `\"Hello?\"` <br> Output: `\"Hello\", \"?\"`  |\n| Metaspace | Splits on whitespaces and replaces them with a special char “▁” (U+2581) | Input: `\"Hello there\"` <br> Output: `\"Hello\", \"▁there\"`  |\n| CharDelimiterSplit | Splits on a given character | Example with `x`: <br> Input: `\"Helloxthere\"` <br> Output: `\"Hello\", \"there\"`  |\n| Digits | Splits the numbers from any other characters. | Input: `\"Hello123there\"` <br>  Output: ``\"Hello\", \"123\", \"there\"``  |\n| Split | Versatile pre-tokenizer that splits on provided pattern and according to provided behavior. The pattern can be inverted if necessary. <ul> <li>pattern should be either a custom string or regexp.</li> <li>behavior should be one of: <ul><li>Removed</li><li>Isolated</li><li>MergedWithPrevious</li><li>MergedWithNext</li><li>Contiguous</li></ul></li> <li>invert should be a boolean flag.</li> </ul> | Example with pattern = ` `, behavior = `\"isolated\"`, invert = `False`: <br> Input: `\"Hello, how are you?\"` <br> Output: `\"Hello,\", \" \", \"how\", \" \", \"are\", \" \", \"you?\"` |\n| Sequence | Lets you compose multiple `PreTokenizer` that will be run in the given order | `Sequence::new(vec![Punctuation, WhitespaceSplit])` |\n</rust>\n<node>\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| ByteLevel | Splits on whitespaces while remapping all the bytes to a set of visible characters. This technique as been introduced by OpenAI with GPT-2 and has some more or less nice properties: <ul> <li>Since it maps on bytes, a tokenizer using this only requires **256** characters as initial alphabet (the number of values a byte can have), as opposed to the 130,000+ Unicode characters.</li> <li>A consequence of the previous point is that it is absolutely unnecessary to have an unknown token using this since we can represent anything with 256 tokens (Youhou!! 🎉🎉)</li> <li>For non ascii characters, it gets completely unreadable, but it works nonetheless!</li> </ul> | Input: `\"Hello my friend, how are you?\"` <br> Output: `\"Hello\", \"Ġmy\", Ġfriend\", \",\", \"Ġhow\", \"Ġare\", \"Ġyou\", \"?\"`  |\n| Whitespace | Splits on word boundaries (using the following regular expression: `\\w+&#124;[^\\w\\s]+` | Input: `\"Hello there!\"` <br> Output: `\"Hello\", \"there\", \"!\"`  |\n| WhitespaceSplit | Splits on any whitespace character | Input: `\"Hello there!\"` <br> Output: `\"Hello\", \"there!\"`  |\n| Punctuation | Will isolate all punctuation characters | Input: `\"Hello?\"` <br> Output: `\"Hello\", \"?\"`  |\n| Metaspace | Splits on whitespaces and replaces them with a special char “▁” (U+2581) | Input: `\"Hello there\"` <br> Output: `\"Hello\", \"▁there\"`  |\n| CharDelimiterSplit | Splits on a given character | Example with `x`: <br> Input: `\"Helloxthere\"` <br> Output: `\"Hello\", \"there\"`  |\n| Digits | Splits the numbers from any other characters. | Input: `\"Hello123there\"` <br>  Output: ``\"Hello\", \"123\", \"there\"``  |\n| Split | Versatile pre-tokenizer that splits on provided pattern and according to provided behavior. The pattern can be inverted if necessary. <ul> <li>pattern should be either a custom string or regexp.</li> <li>behavior should be one of: <ul><li>removed</li><li>isolated</li><li>mergedWithPrevious</li><li>mergedWithNext</li><li>contiguous</li></ul></li> <li>invert should be a boolean flag.</li> </ul> | Example with pattern = ` `, behavior = `\"isolated\"`, invert = `False`: <br> Input: `\"Hello, how are you?\"` <br> Output: `\"Hello,\", \" \", \"how\", \" \", \"are\", \" \", \"you?\"` |\n| Sequence | Lets you compose multiple `PreTokenizer` that will be run in the given order | |\n</node>\n</tokenizerslangcontent>\n\n## Models\n\nModels are the core algorithms used to actually tokenize, and therefore,\nthey are the only mandatory component of a Tokenizer.\n\n| Name | Description |\n| :--- | :--- |\n| WordLevel | This is the “classic” tokenization algorithm. It let’s you simply map words to IDs without anything fancy. This has the advantage of being really simple to use and understand, but it requires extremely large vocabularies for a good coverage. Using this `Model` requires the use of a `PreTokenizer`. No choice will be made by this model directly, it simply maps input tokens to IDs.  |\n| BPE | One of the most popular subword tokenization algorithm. The Byte-Pair-Encoding works by starting with characters, while merging those that are the most frequently seen together, thus creating new tokens. It then works iteratively to build new tokens out of the most frequent pairs it sees in a corpus. BPE is able to build words it has never seen by using multiple subword tokens, and thus requires smaller vocabularies, with less chances of having “unk” (unknown) tokens.  |\n| WordPiece | This is a subword tokenization algorithm quite similar to BPE, used mainly by Google in models like BERT. It uses a greedy algorithm, that tries to build long words first, splitting in multiple tokens when entire words don’t exist in the vocabulary. This is different from BPE that starts from characters, building bigger tokens as possible. It uses the famous `##` prefix to identify tokens that are part of a word (ie not starting a word).  |\n| Unigram | Unigram is also a subword tokenization algorithm, and works by trying to identify the best set of subword tokens to maximize the probability for a given sentence. This is different from BPE in the way that this is not deterministic based on a set of rules applied sequentially. Instead Unigram will be able to compute multiple ways of tokenizing, while choosing the most probable one. |\n\n## Post-Processors\n\nAfter the whole pipeline, we sometimes want to insert some special\ntokens before feed a tokenized string into a model like \"[CLS] My\nhorse is amazing [SEP]\". The `PostProcessor` is the component doing\njust that.\n\n| Name | Description | Example |\n| :--- | :--- | :--- |\n| TemplateProcessing | Let’s you easily template the post processing, adding special tokens, and specifying the `type_id` for each sequence/special token. The template is given two strings representing the single sequence and the pair of sequences, as well as a set of special tokens to use. | Example, when specifying a template with these values:<br> <ul> <li> single: `\"[CLS] $A [SEP]\"` </li> <li> pair: `\"[CLS] $A [SEP] $B [SEP]\"` </li> <li> special tokens: <ul> <li>`\"[CLS]\"`</li> <li>`\"[SEP]\"`</li> </ul> </li> </ul> <br> Input: `(\"I like this\", \"but not this\")` <br> Output: `\"[CLS] I like this [SEP] but not this [SEP]\"` |\n\n## Decoders\n\nThe Decoder knows how to go from the IDs used by the Tokenizer, back to\na readable piece of text. Some `Normalizer` and `PreTokenizer` use\nspecial characters or identifiers that need to be reverted for example.\n\n| Name | Description |\n| :--- | :--- |\n| ByteLevel | Reverts the ByteLevel PreTokenizer. This PreTokenizer encodes at the byte-level, using a set of visible Unicode characters to represent each byte, so we need a Decoder to revert this process and get something readable again. |\n| Metaspace | Reverts the Metaspace PreTokenizer. This PreTokenizer uses a special identifier `▁` to identify whitespaces, and so this Decoder helps with decoding these. |\n| WordPiece | Reverts the WordPiece Model. This model uses a special identifier `##` for continuing subwords, and so this Decoder helps with decoding these. |\n"
  },
  {
    "path": "docs/source-doc-builder/index.mdx",
    "content": "<!-- DISABLE-FRONTMATTER-SECTIONS -->\n\n# Tokenizers\n\nFast State-of-the-art tokenizers, optimized for both research and\nproduction\n\n[🤗 Tokenizers](https://github.com/huggingface/tokenizers) provides an\nimplementation of today's most used tokenizers, with a focus on\nperformance and versatility. These tokenizers are also used in [🤗 Transformers](https://github.com/huggingface/transformers).\n\n# Main features:\n\n- Train new vocabularies and tokenize, using today's most used tokenizers.\n- Extremely fast (both training and tokenization), thanks to the Rust implementation. Takes less than 20 seconds to tokenize a GB of text on a server's CPU.\n- Easy to use, but also extremely versatile.\n- Designed for both research and production.\n- Full alignment tracking. Even with destructive normalization, it's always possible to get the part of the original sentence that corresponds to any token.\n- Does all the pre-processing: Truncation, Padding, add the special tokens your model needs.\n"
  },
  {
    "path": "docs/source-doc-builder/installation.mdx",
    "content": "# Installation\n\n<tokenizerslangcontent>\n<python>\n🤗 Tokenizers is tested on Python 3.5+.\n\nYou should install 🤗 Tokenizers in a [virtual environment](https://docs.python.org/3/library/venv.html). If you're\nunfamiliar with Python virtual environments, check out the [user\nguide](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/).\nCreate a virtual environment with the version of Python you're going to\nuse and activate it.\n\n## Installation with pip\n\n🤗 Tokenizers can be installed using pip as follows:\n\n```bash\npip install tokenizers\n```\n\n## Installation from sources\n\nTo use this method, you need to have the Rust language installed. You\ncan follow [the official\nguide](https://www.rust-lang.org/learn/get-started) for more\ninformation.\n\nIf you are using a unix based OS, the installation should be as simple\nas running:\n\n```bash\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n```\n\nOr you can easily update it with the following command:\n\n```bash\nrustup update\n```\n\nOnce rust is installed, we can start retrieving the sources for 🤗\nTokenizers:\n\n```bash\ngit clone https://github.com/huggingface/tokenizers\n```\n\nThen we go into the python bindings folder:\n\n```bash\ncd tokenizers/bindings/python\n```\n\nAt this point you should have your [virtual environment]() already\nactivated. In order to compile 🤗 Tokenizers, you need to:\n\n```bash\npip install -e .\n```\n\n</python>\n<rust>\n## Crates.io\n\n🤗 Tokenizers is available on [crates.io](https://crates.io/crates/tokenizers).\n\nYou just need to add it to your `Cargo.toml`:\n\n```bash\ncargo add tokenizers\n```\n</rust>\n<node>\n## Installation with npm\n\nYou can simply install 🤗 Tokenizers with npm using:\n\n```bash\nnpm install tokenizers\n```\n</node>\n</tokenizerslangcontent>\n"
  },
  {
    "path": "docs/source-doc-builder/pipeline.mdx",
    "content": "# The tokenization pipeline\n\nWhen calling `Tokenizer.encode` or\n`Tokenizer.encode_batch`, the input\ntext(s) go through the following pipeline:\n\n-   `normalization`\n-   `pre-tokenization`\n-   `model`\n-   `post-processing`\n\nWe'll see in details what happens during each of those steps in detail,\nas well as when you want to `decode <decoding>` some token ids, and how the 🤗 Tokenizers library allows you\nto customize each of those steps to your needs. If you're already\nfamiliar with those steps and want to learn by seeing some code, jump to\n`our BERT from scratch example <example>`.\n\nFor the examples that require a `Tokenizer` we will use the tokenizer we trained in the\n`quicktour`, which you can load with:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START reload_tokenizer\",\n\"end-before\": \"END reload_tokenizer\",\n\"dedent\": 12}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_reload_tokenizer\",\n\"end-before\": \"END pipeline_reload_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START reload_tokenizer\",\n\"end-before\": \"END reload_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\n## Normalization\n\nNormalization is, in a nutshell, a set of operations you apply to a raw\nstring to make it less random or \"cleaner\". Common operations include\nstripping whitespace, removing accented characters or lowercasing all\ntext. If you're familiar with [Unicode\nnormalization](https://unicode.org/reports/tr15), it is also a very\ncommon normalization operation applied in most tokenizers.\n\nEach normalization operation is represented in the 🤗 Tokenizers library\nby a `Normalizer`, and you can combine\nseveral of those by using a `normalizers.Sequence`. Here is a normalizer applying NFD Unicode normalization\nand removing accents as an example:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START setup_normalizer\",\n\"end-before\": \"END setup_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_setup_normalizer\",\n\"end-before\": \"END pipeline_setup_normalizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START setup_normalizer\",\n\"end-before\": \"END setup_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nYou can manually test that normalizer by applying it to any string:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START test_normalizer\",\n\"end-before\": \"END test_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_test_normalizer\",\n\"end-before\": \"END pipeline_test_normalizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START test_normalizer\",\n\"end-before\": \"END test_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nWhen building a `Tokenizer`, you can\ncustomize its normalizer by just changing the corresponding attribute:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START replace_normalizer\",\n\"end-before\": \"END replace_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_replace_normalizer\",\n\"end-before\": \"END pipeline_replace_normalizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START replace_normalizer\",\n\"end-before\": \"END replace_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nOf course, if you change the way a tokenizer applies normalization, you\nshould probably retrain it from scratch afterward.\n\n## Pre-Tokenization\n\nPre-tokenization is the act of splitting a text into smaller objects\nthat give an upper bound to what your tokens will be at the end of\ntraining. A good way to think of this is that the pre-tokenizer will\nsplit your text into \"words\" and then, your final tokens will be parts\nof those words.\n\nAn easy way to pre-tokenize inputs is to split on spaces and\npunctuations, which is done by the\n`pre_tokenizers.Whitespace`\npre-tokenizer:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START setup_pre_tokenizer\",\n\"end-before\": \"END setup_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_setup_pre_tokenizer\",\n\"end-before\": \"END pipeline_setup_pre_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START setup_pre_tokenizer\",\n\"end-before\": \"END setup_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nThe output is a list of tuples, with each tuple containing one word and\nits span in the original sentence (which is used to determine the final\n`offsets` of our `Encoding`). Note that splitting on\npunctuation will split contractions like `\"I'm\"` in this example.\n\nYou can combine together any `PreTokenizer` together. For instance, here is a pre-tokenizer that will\nsplit on space, punctuation and digits, separating numbers in their\nindividual digits:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START combine_pre_tokenizer\",\n\"end-before\": \"END combine_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_combine_pre_tokenizer\",\n\"end-before\": \"END pipeline_combine_pre_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START combine_pre_tokenizer\",\n\"end-before\": \"END combine_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nAs we saw in the `quicktour`, you can\ncustomize the pre-tokenizer of a `Tokenizer` by just changing the corresponding attribute:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START replace_pre_tokenizer\",\n\"end-before\": \"END replace_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_replace_pre_tokenizer\",\n\"end-before\": \"END pipeline_replace_pre_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START replace_pre_tokenizer\",\n\"end-before\": \"END replace_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nOf course, if you change the way the pre-tokenizer, you should probably\nretrain your tokenizer from scratch afterward.\n\n## Model\n\nOnce the input texts are normalized and pre-tokenized, the\n`Tokenizer` applies the model on the\npre-tokens. This is the part of the pipeline that needs training on your\ncorpus (or that has been trained if you are using a pretrained\ntokenizer).\n\nThe role of the model is to split your \"words\" into tokens, using the\nrules it has learned. It's also responsible for mapping those tokens to\ntheir corresponding IDs in the vocabulary of the model.\n\nThis model is passed along when initializing the\n`Tokenizer` so you already know how to\ncustomize this part. Currently, the 🤗 Tokenizers library supports:\n\n-   `models.BPE`\n-   `models.Unigram`\n-   `models.WordLevel`\n-   `models.WordPiece`\n\nFor more details about each model and its behavior, you can check\n[here](components#models)\n\n## Post-Processing\n\nPost-processing is the last step of the tokenization pipeline, to\nperform any additional transformation to the\n`Encoding` before it's returned, like\nadding potential special tokens.\n\nAs we saw in the quick tour, we can customize the post processor of a\n`Tokenizer` by setting the\ncorresponding attribute. For instance, here is how we can post-process\nto make the inputs suitable for the BERT model:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START setup_processor\",\n\"end-before\": \"END setup_processor\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_setup_processor\",\n\"end-before\": \"END pipeline_setup_processor\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START setup_processor\",\n\"end-before\": \"END setup_processor\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nNote that contrarily to the pre-tokenizer or the normalizer, you don't\nneed to retrain a tokenizer after changing its post-processor.\n\n## All together: a BERT tokenizer from scratch\n\nLet's put all those pieces together to build a BERT tokenizer. First,\nBERT relies on WordPiece, so we instantiate a new\n`Tokenizer` with this model:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_setup_tokenizer\",\n\"end-before\": \"END bert_setup_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_setup_tokenizer\",\n\"end-before\": \"END bert_setup_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_setup_tokenizer\",\n\"end-before\": \"END bert_setup_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nThen we know that BERT preprocesses texts by removing accents and\nlowercasing. We also use a unicode normalizer:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_setup_normalizer\",\n\"end-before\": \"END bert_setup_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_setup_normalizer\",\n\"end-before\": \"END bert_setup_normalizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_setup_normalizer\",\n\"end-before\": \"END bert_setup_normalizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nThe pre-tokenizer is just splitting on whitespace and punctuation:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_setup_pre_tokenizer\",\n\"end-before\": \"END bert_setup_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_setup_pre_tokenizer\",\n\"end-before\": \"END bert_setup_pre_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_setup_pre_tokenizer\",\n\"end-before\": \"END bert_setup_pre_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nAnd the post-processing uses the template we saw in the previous\nsection:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_setup_processor\",\n\"end-before\": \"END bert_setup_processor\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_setup_processor\",\n\"end-before\": \"END bert_setup_processor\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_setup_processor\",\n\"end-before\": \"END bert_setup_processor\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nWe can use this tokenizer and train on it on wikitext like in the\n`quicktour`:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_train_tokenizer\",\n\"end-before\": \"END bert_train_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_train_tokenizer\",\n\"end-before\": \"END bert_train_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_train_tokenizer\",\n\"end-before\": \"END bert_train_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\n## Decoding\n\nOn top of encoding the input texts, a `Tokenizer` also has an API for decoding, that is converting IDs\ngenerated by your model back to a text. This is done by the methods\n`Tokenizer.decode` (for one predicted text) and `Tokenizer.decode_batch` (for a batch of predictions).\n\nThe `decoder` will first convert the IDs back to tokens\n(using the tokenizer's vocabulary) and remove all special tokens, then\njoin those tokens with spaces:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START test_decoding\",\n\"end-before\": \"END test_decoding\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START pipeline_test_decoding\",\n\"end-before\": \"END pipeline_test_decoding\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START test_decoding\",\n\"end-before\": \"END test_decoding\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nIf you used a model that added special characters to represent subtokens\nof a given \"word\" (like the `\"##\"` in\nWordPiece) you will need to customize the `decoder` to treat\nthem properly. If we take our previous `bert_tokenizer` for instance the\ndefault decoding will give:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_test_decoding\",\n\"end-before\": \"END bert_test_decoding\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_test_decoding\",\n\"end-before\": \"END bert_test_decoding\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_test_decoding\",\n\"end-before\": \"END bert_test_decoding\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nBut by changing it to a proper decoder, we get:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_pipeline.py\",\n\"language\": \"python\",\n\"start-after\": \"START bert_proper_decoding\",\n\"end-before\": \"END bert_proper_decoding\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START bert_proper_decoding\",\n\"end-before\": \"END bert_proper_decoding\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/pipeline.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START bert_proper_decoding\",\n\"end-before\": \"END bert_proper_decoding\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n"
  },
  {
    "path": "docs/source-doc-builder/quicktour.mdx",
    "content": "# Quicktour\n\nLet's have a quick look at the 🤗 Tokenizers library features. The\nlibrary provides an implementation of today's most used tokenizers that\nis both easy to use and blazing fast.\n\n## Build a tokenizer from scratch\n\nTo illustrate how fast the 🤗 Tokenizers library is, let's train a new\ntokenizer on [wikitext-103](https://www.salesforce.com/blog/the-wikitext-long-term-dependency-language-modeling-dataset/)\n(516M of text) in just a few seconds. First things first, you will need\nto download this dataset and unzip it with:\n\n``` bash\nwget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip\nunzip wikitext-103-raw-v1.zip\n```\n\n### Training the tokenizer\n\nIn this tour, we will build and train a Byte-Pair Encoding (BPE)\ntokenizer. For more information about the different type of tokenizers,\ncheck out this [guide](https://huggingface.co/transformers/tokenizer_summary.html) in\nthe 🤗 Transformers documentation. Here, training the tokenizer means it\nwill learn merge rules by:\n\n-   Start with all the characters present in the training corpus as\n    tokens.\n-   Identify the most common pair of tokens and merge it into one token.\n-   Repeat until the vocabulary (e.g., the number of tokens) has reached\n    the size we want.\n\nThe main API of the library is the `class` `Tokenizer`, here is how\nwe instantiate one with a BPE model:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START init_tokenizer\",\n\"end-before\": \"END init_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_init_tokenizer\",\n\"end-before\": \"END quicktour_init_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START init_tokenizer\",\n\"end-before\": \"END init_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nTo train our tokenizer on the wikitext files, we will need to\ninstantiate a [trainer]{.title-ref}, in this case a\n`BpeTrainer`\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START init_trainer\",\n\"end-before\": \"END init_trainer\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_init_trainer\",\n\"end-before\": \"END quicktour_init_trainer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START init_trainer\",\n\"end-before\": \"END init_trainer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nWe can set the training arguments like `vocab_size` or `min_frequency` (here\nleft at their default values of 30,000 and 0) but the most important\npart is to give the `special_tokens` we\nplan to use later on (they are not used at all during training) so that\nthey get inserted in the vocabulary.\n\n<Tip>\n\nThe order in which you write the special tokens list matters: here `\"[UNK]\"` will get the ID 0,\n`\"[CLS]\"` will get the ID 1 and so forth.\n\n</Tip>\n\nWe could train our tokenizer right now, but it wouldn't be optimal.\nWithout a pre-tokenizer that will split our inputs into words, we might\nget tokens that overlap several words: for instance we could get an\n`\"it is\"` token since those two words\noften appear next to each other. Using a pre-tokenizer will ensure no\ntoken is bigger than a word returned by the pre-tokenizer. Here we want\nto train a subword BPE tokenizer, and we will use the easiest\npre-tokenizer possible by splitting on whitespace.\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START init_pretok\",\n\"end-before\": \"END init_pretok\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_init_pretok\",\n\"end-before\": \"END quicktour_init_pretok\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START init_pretok\",\n\"end-before\": \"END init_pretok\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nNow, we can just call the `Tokenizer.train` method with any list of files we want to use:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START train\",\n\"end-before\": \"END train\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_train\",\n\"end-before\": \"END quicktour_train\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START train\",\n\"end-before\": \"END train\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nThis should only take a few seconds to train our tokenizer on the full\nwikitext dataset! To save the tokenizer in one file that contains all\nits configuration and vocabulary, just use the\n`Tokenizer.save` method:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START save\",\n\"end-before\": \"END save\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_save\",\n\"end-before\": \"END quicktour_save\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START save\",\n\"end-before\": \"END save\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nand you can reload your tokenizer from that file with the\n`Tokenizer.from_file`\n`classmethod`:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START reload_tokenizer\",\n\"end-before\": \"END reload_tokenizer\",\n\"dedent\": 12}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_reload_tokenizer\",\n\"end-before\": \"END quicktour_reload_tokenizer\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START reload_tokenizer\",\n\"end-before\": \"END reload_tokenizer\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\n### Using the tokenizer\n\nNow that we have trained a tokenizer, we can use it on any text we want\nwith the `Tokenizer.encode` method:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START encode\",\n\"end-before\": \"END encode\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_encode\",\n\"end-before\": \"END quicktour_encode\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START encode\",\n\"end-before\": \"END encode\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nThis applied the full pipeline of the tokenizer on the text, returning\nan `Encoding` object. To learn more\nabout this pipeline, and how to apply (or customize) parts of it, check out [this page](https://github.com/huggingface/tokenizers/blob/main/docs/source-doc-builder/pipeline.mdx).\n\nThis `Encoding` object then has all the\nattributes you need for your deep learning model (or other). The\n`tokens` attribute contains the\nsegmentation of your text in tokens:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_tokens\",\n\"end-before\": \"END print_tokens\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_tokens\",\n\"end-before\": \"END quicktour_print_tokens\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_tokens\",\n\"end-before\": \"END print_tokens\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nSimilarly, the `ids` attribute will\ncontain the index of each of those tokens in the tokenizer's\nvocabulary:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_ids\",\n\"end-before\": \"END print_ids\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_ids\",\n\"end-before\": \"END quicktour_print_ids\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_ids\",\n\"end-before\": \"END print_ids\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nAn important feature of the 🤗 Tokenizers library is that it comes with\nfull alignment tracking, meaning you can always get the part of your\noriginal sentence that corresponds to a given token. Those are stored in\nthe `offsets` attribute of our\n`Encoding` object. For instance, let's\nassume we would want to find back what caused the\n`\"[UNK]\"` token to appear, which is the\ntoken at index 9 in the list, we can just ask for the offset at the\nindex:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_offsets\",\n\"end-before\": \"END print_offsets\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_offsets\",\n\"end-before\": \"END quicktour_print_offsets\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_offsets\",\n\"end-before\": \"END print_offsets\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nand those are the indices that correspond to the emoji in the original\nsentence:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START use_offsets\",\n\"end-before\": \"END use_offsets\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_use_offsets\",\n\"end-before\": \"END quicktour_use_offsets\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START use_offsets\",\n\"end-before\": \"END use_offsets\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\n### Post-processing\n\nWe might want our tokenizer to automatically add special tokens, like\n`\"[CLS]\"` or `\"[SEP]\"`. To do this, we use a post-processor.\n`TemplateProcessing` is the most\ncommonly used, you just have to specify a template for the processing of\nsingle sentences and pairs of sentences, along with the special tokens\nand their IDs.\n\nWhen we built our tokenizer, we set `\"[CLS]\"` and `\"[SEP]\"` in positions 1\nand 2 of our list of special tokens, so this should be their IDs. To\ndouble-check, we can use the `Tokenizer.token_to_id` method:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START check_sep\",\n\"end-before\": \"END check_sep\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_check_sep\",\n\"end-before\": \"END quicktour_check_sep\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START check_sep\",\n\"end-before\": \"END check_sep\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nHere is how we can set the post-processing to give us the traditional\nBERT inputs:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START init_template_processing\",\n\"end-before\": \"END init_template_processing\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_init_template_processing\",\n\"end-before\": \"END quicktour_init_template_processing\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START init_template_processing\",\n\"end-before\": \"END init_template_processing\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nLet's go over this snippet of code in more details. First we specify\nthe template for single sentences: those should have the form\n`\"[CLS] $A [SEP]\"` where\n`$A` represents our sentence.\n\nThen, we specify the template for sentence pairs, which should have the\nform `\"[CLS] $A [SEP] $B [SEP]\"` where\n`$A` represents the first sentence and\n`$B` the second one. The\n`:1` added in the template represent the `type IDs` we want for each part of our input: it defaults\nto 0 for everything (which is why we don't have\n`$A:0`) and here we set it to 1 for the\ntokens of the second sentence and the last `\"[SEP]\"` token.\n\nLastly, we specify the special tokens we used and their IDs in our\ntokenizer's vocabulary.\n\nTo check out this worked properly, let's try to encode the same\nsentence as before:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_special_tokens\",\n\"end-before\": \"END print_special_tokens\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_special_tokens\",\n\"end-before\": \"END quicktour_print_special_tokens\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_special_tokens\",\n\"end-before\": \"END print_special_tokens\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nTo check the results on a pair of sentences, we just pass the two\nsentences to `Tokenizer.encode`:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_special_tokens_pair\",\n\"end-before\": \"END print_special_tokens_pair\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_special_tokens_pair\",\n\"end-before\": \"END quicktour_print_special_tokens_pair\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_special_tokens_pair\",\n\"end-before\": \"END print_special_tokens_pair\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nYou can then check the type IDs attributed to each token is correct with\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_type_ids\",\n\"end-before\": \"END print_type_ids\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_type_ids\",\n\"end-before\": \"END quicktour_print_type_ids\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_type_ids\",\n\"end-before\": \"END print_type_ids\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nIf you save your tokenizer with `Tokenizer.save`, the post-processor will be saved along.\n\n### Encoding multiple sentences in a batch\n\nTo get the full speed of the 🤗 Tokenizers library, it's best to\nprocess your texts by batches by using the\n`Tokenizer.encode_batch` method:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START encode_batch\",\n\"end-before\": \"END encode_batch\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_encode_batch\",\n\"end-before\": \"END quicktour_encode_batch\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START encode_batch\",\n\"end-before\": \"END encode_batch\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nThe output is then a list of `Encoding`\nobjects like the ones we saw before. You can process together as many\ntexts as you like, as long as it fits in memory.\n\nTo process a batch of sentences pairs, pass two lists to the\n`Tokenizer.encode_batch` method: the\nlist of sentences A and the list of sentences B:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START encode_batch_pair\",\n\"end-before\": \"END encode_batch_pair\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_encode_batch_pair\",\n\"end-before\": \"END quicktour_encode_batch_pair\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START encode_batch_pair\",\n\"end-before\": \"END encode_batch_pair\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nWhen encoding multiple sentences, you can automatically pad the outputs\nto the longest sentence present by using\n`Tokenizer.enable_padding`, with the\n`pad_token` and its ID (which we can\ndouble-check the id for the padding token with\n`Tokenizer.token_to_id` like before):\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START enable_padding\",\n\"end-before\": \"END enable_padding\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_enable_padding\",\n\"end-before\": \"END quicktour_enable_padding\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START enable_padding\",\n\"end-before\": \"END enable_padding\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nWe can set the `direction` of the padding\n(defaults to the right) or a given `length` if we want to pad every sample to that specific number (here\nwe leave it unset to pad to the size of the longest text).\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_batch_tokens\",\n\"end-before\": \"END print_batch_tokens\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_batch_tokens\",\n\"end-before\": \"END quicktour_print_batch_tokens\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_batch_tokens\",\n\"end-before\": \"END print_batch_tokens\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\nIn this case, the `attention mask` generated by the\ntokenizer takes the padding into account:\n\n<tokenizerslangcontent>\n<python>\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_quicktour.py\",\n\"language\": \"python\",\n\"start-after\": \"START print_attention_mask\",\n\"end-before\": \"END print_attention_mask\",\n\"dedent\": 8}\n</literalinclude>\n</python>\n<rust>\n<literalinclude>\n{\"path\": \"../../tokenizers/tests/documentation.rs\",\n\"language\": \"rust\",\n\"start-after\": \"START quicktour_print_attention_mask\",\n\"end-before\": \"END quicktour_print_attention_mask\",\n\"dedent\": 4}\n</literalinclude>\n</rust>\n<node>\n<literalinclude>\n{\"path\": \"../../bindings/node/examples/documentation/quicktour.test.ts\",\n\"language\": \"js\",\n\"start-after\": \"START print_attention_mask\",\n\"end-before\": \"END print_attention_mask\",\n\"dedent\": 8}\n</literalinclude>\n</node>\n</tokenizerslangcontent>\n\n## Pretrained\n\n<tokenizerslangcontent>\n<python>\n### Using a pretrained tokenizer\n\nYou can load any tokenizer from the Hugging Face Hub as long as a\n`tokenizer.json` file is available in the repository.\n\n```python\nfrom tokenizers import Tokenizer\n\ntokenizer = Tokenizer.from_pretrained(\"bert-base-uncased\")\n```\n\n### Importing a pretrained tokenizer from legacy vocabulary files\n\nYou can also import a pretrained tokenizer directly in, as long as you\nhave its vocabulary file. For instance, here is how to import the\nclassic pretrained BERT tokenizer:\n\n```python\nfrom tokenizers import BertWordPieceTokenizer\n\ntokenizer = BertWordPieceTokenizer(\"bert-base-uncased-vocab.txt\", lowercase=True)\n```\n\nas long as you have downloaded the file `bert-base-uncased-vocab.txt` with\n\n```bash\nwget https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt\n```\n</python>\n</tokenizerslangcontent>\n"
  },
  {
    "path": "docs/source-doc-builder/training_from_memory.mdx",
    "content": "# Training from memory\n\nIn the [Quicktour](quicktour), we saw how to build and train a\ntokenizer using text files, but we can actually use any Python Iterator.\nIn this section we'll see a few different ways of training our\ntokenizer.\n\nFor all the examples listed below, we'll use the same [`~tokenizers.Tokenizer`] and\n[`~tokenizers.trainers.Trainer`], built as\nfollowing:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START init_tokenizer_trainer\",\n\"end-before\": \"END init_tokenizer_trainer\",\n\"dedent\": 8}\n</literalinclude>\n\nThis tokenizer is based on the [`~tokenizers.models.Unigram`] model. It\ntakes care of normalizing the input using the NFKC Unicode normalization\nmethod, and uses a [`~tokenizers.pre_tokenizers.ByteLevel`] pre-tokenizer with the corresponding decoder.\n\nFor more information on the components used here, you can check\n[here](components).\n\n## The most basic way\n\nAs you probably guessed already, the easiest way to train our tokenizer\nis by using a `List`{.interpreted-text role=\"obj\"}:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START train_basic\",\n\"end-before\": \"END train_basic\",\n\"dedent\": 8}\n</literalinclude>\n\nEasy, right? You can use anything working as an iterator here, be it a\n`List`{.interpreted-text role=\"obj\"}, `Tuple`{.interpreted-text\nrole=\"obj\"}, or a `np.Array`{.interpreted-text role=\"obj\"}. Anything\nworks as long as it provides strings.\n\n## Using the 🤗 Datasets library\n\nAn awesome way to access one of the many datasets that exist out there\nis by using the 🤗 Datasets library. For more information about it, you\nshould check [the official documentation\nhere](https://huggingface.co/docs/datasets/).\n\nLet's start by loading our dataset:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START load_dataset\",\n\"end-before\": \"END load_dataset\",\n\"dedent\": 8}\n</literalinclude>\n\nThe next step is to build an iterator over this dataset. The easiest way\nto do this is probably by using a generator:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START def_batch_iterator\",\n\"end-before\": \"END def_batch_iterator\",\n\"dedent\": 8}\n</literalinclude>\n\nAs you can see here, for improved efficiency we can actually provide a\nbatch of examples used to train, instead of iterating over them one by\none. By doing so, we can expect performances very similar to those we\ngot while training directly from files.\n\nWith our iterator ready, we just need to launch the training. In order\nto improve the look of our progress bars, we can specify the total\nlength of the dataset:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START train_datasets\",\n\"end-before\": \"END train_datasets\",\n\"dedent\": 8}\n</literalinclude>\n\nAnd that's it!\n\n## Using gzip files\n\nSince gzip files in Python can be used as iterators, it is extremely\nsimple to train on such files:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START single_gzip\",\n\"end-before\": \"END single_gzip\",\n\"dedent\": 8}\n</literalinclude>\n\nNow if we wanted to train from multiple gzip files, it wouldn't be much\nharder:\n\n<literalinclude>\n{\"path\": \"../../bindings/python/tests/documentation/test_tutorial_train_from_iterators.py\",\n\"language\": \"python\",\n\"start-after\": \"START multi_gzip\",\n\"end-before\": \"END multi_gzip\",\n\"dedent\": 8}\n</literalinclude>\n\nAnd voilà!\n"
  },
  {
    "path": "tokenizers/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [0.13.2] \n\n- Python only changes\n\n## [0.13.1] \n\n- [#1072] Fixing Roberta type ids.\n\n## [0.13.0] \n\n- [#1009] `unstable_wasm` feature to support building on Wasm (it's unstable !)\n- [#1008] `Decoder` is now a composable trait, but without being backward incompatible\n- [#1047, #1051, #1052] `Processor` is now a composable trait, but without being backward incompatible\n\nBoth trait changes warrant a \"major\" number since, despite best efforts to not break backward\n  compatibility, the code is different enough that we cannot be exactly sure.\n\n## [0.12.1] \n\n- [#938] **Reverted breaking change**. https://github.com/huggingface/transformers/issues/16520\n\n## [0.12.0] YANKED\n\nBump minor version because of a breaking change.\n\n- [#938] [REVERTED IN 0.12.1] **Breaking change**. Decoder trait is modified to be composable. This is only breaking if you are using decoders on their own. tokenizers should be error free.\n- [#939] Making the regex in `ByteLevel` pre_tokenizer optional (necessary for BigScience)\n\n- [#952] Fixed the vocabulary size of UnigramTrainer output (to respect added tokens)\n- [#954] Fixed not being able to save vocabularies with holes in vocab (ConvBert). Yell warnings instead, but stop panicking.\n- [#961] Added link for Ruby port of `tokenizers`\n- [#960] Feature gate for `cli` and its `clap` dependency\n\n## [0.11.3]\n\n- [#919] Fixing single_word AddedToken. (regression from 0.11.2)\n- [#916] Deserializing faster `added_tokens` by loading them in batch.\n\n## [0.11.2]\n\n- [#884] Fixing bad deserialization following inclusion of a default for Punctuation\n\n## [0.11.1]\n\n- [#882] Fixing Punctuation deserialize without argument.\n- [#868] Fixing missing direction in TruncationParams\n- [#860] Adding TruncationSide to TruncationParams\n\n## [0.11.0]\n\n### Fixed\n- [#236]: Fix a bug with offsets being shifted when there are sub-sequences (Usually with\nspecial tokens and/or added tokens in the sequence).\n- [#286]: Fix various crash when training a BPE model\n- [#309]: Fixed a few bugs related to additional vocabulary/tokens\n- [#363]: Fix panic from unwrapping `File::open` in `count_words`\n\n### Changed\n- [#234]: Completely changed the alignment mappings available on `Encoding`. Previous mappings\nwere misleading and only providing offsets. New ones provide methods to easily convert between\n`char` or `word` (input space) and `token` (output space)\n- [#236]: `AddedToken` with special options like `rstrip` will keep the matched whitespaces\nin the textual representation of the token, exposed in `tokens` on the `Encoding`. The ID stays\nthe same as usual. This fixes the offsets for said tokens.\n- [#236]: Offsets are now converted back to the original referential before we merge the\nsub-sequences together and then do the post-processing. This also fixes some offsets bugs.\n- [#236]: ByteLevel PostProcessor now uses the `add_prefix_space` attribute to determine how to\ntrim offsets.\n- Improved `TruncationError` to handle cases where provided max length is too low.\n- [#249]: `encode` and `encode_batch` input has been greatly improved, and it now also accept\npre-tokenized inputs.\n- Improved `TruncationError` to handle cases where provided max length is too low.\n- [#276]: Improve BPE training speeds, by reading files sequentially, but parallelizing the\nprocessing of each file\n- [#280]: Use `onig` for byte-level pre-tokenization to remove all the differences with the original\nimplementation from GPT-2\n- [#309]: Improved the management of the additional vocabulary. This introduces an option\n`normalized`, controlling whether a token should be extracted from the normalized version of the\ninput text.\n- [#330]: BertNormalizer now keeps the same behavior than the original implementation when\n`strip_accents` is not specified.\n- [#355]: Tokenizer does not use any dynamic dispatch anymore.\n- [#377]: Use byte offsets everywhere (instead of the char offsets)\n\n### Added\n- [#236]: RobertaProcessing is now also taking care of trimming offsets, and works just as ByteLevel\non this front.\n- [#272]: Serialization of the `Tokenizer` and all the parts (`PreTokenizer`, `Normalizer`, ...)\nusing serde. It is now easy to save/load an entire tokenizer.\n- [#289]: Ability to pad to a multiple of a specified value. This is especially useful to ensure\nactivation of the Tensor Cores, while ensuring padding to a multiple of 8.\n- [#298]: Ability to get the currently set truncation/padding params\n- [#311]: Ability to enable/disable the parallelism using the `TOKENIZERS_PARALLELISM` environment\nvariable.\n- [#403]: Add `TemplateProcessing` `PostProcessor`.\n\n### How to migrate\n- Replace any `XXX_to_YYY_offsets()` method call by any of the new ones.\n- Specify the `add_prefix_space` and `trim_offsets` options on `RobertaProcessing` if you don't\nwant the offsets trimmed out.\n- Any custom `PostProcessor` now handles offsets relative to the original string (as opposed to the\nnormalized one).\n\n## [0.10.1]\n\n### Fixed\n- [#226]: Fix the word indexes when there are special tokens\n\n## [0.10.0]\n\n### Changed\n- [#222]: All Tokenizer's subparts must now be `Send + Sync`\n\n### Added\n- [#208]: Ability to retrieve the vocabulary from the `Tokenizer` & `Model`\n\n### Fixed\n- [#205]: Trim the decoded string in `BPEDecoder`\n- [b770f36]: Fix a bug with added tokens generated IDs\n\n## [0.9.0]\n\n### Changed\n- Only one progress bar while reading files during training. This is better for use-cases with\na high number of files as it avoids having too many progress bars on screen. Also avoids reading the\nsize of each file before starting to actually read these files, as this process could take really\nlong.\n- [#190]: Improved BPE and WordPiece builders\n- [#193]: `encode` and `encode_batch` now take a new argument, specifying whether we should add the\nspecial tokens\n- [#197]: The `NormalizedString` has been removed from the `Encoding`. It is now possible to\nretrieve it by calling `normalize` on the `Tokenizer`. This brings a reduction of 70% of the memory\nfootprint\n- [#197]: The `NormalizedString` API has been improved. It is now possible to retrieve parts of both\nstrings using both \"normalized\" or \"original\" offsets\n- [#197]: The offsets provided on `Encoding` are now relative to the original string, and not the\nnormalized one anymore\n- `AddedToken` are now used for both `add_special_tokens` and `add_tokens`. Also, these AddedToken\nhave more options to allow various behaviors.\n\n### Added\n- [#188]: `impl PostProcessor for ByteLevel`: Handles trimming the offsets if activated. This avoids\nthe unintuitive inclusion of the whitespaces in the produced offsets, even if these whitespaces are\npart of the actual token\n- More alignment mappings on the `Encoding`.\n- `post_process` can be called on the `Tokenizer`\n\n### Fixed\n- [#193]: Fix some issues with the offsets being wrong with the `ByteLevel` BPE:\n\t- when `add_prefix_space` is activated\n\t- [#156]: when a Unicode character gets split-up in multiple byte-level characters\n- Fix a bug where offsets were wrong when there was any added tokens in the sequence being encoded.\n- [#175]: Fix a bug that prevented the addition of more than a certain amount of tokens (even if not\nadvised, but that's not the question)\n\n### How to migrate\n- Add the `ByteLevel` `PostProcessor` to your byte-level BPE tokenizers if relevant.\n\n## [0.8.0]\n\n### Changed\n- [#165]: Big improvements in speed for BPE (Both training and tokenization)\n\n### Fixed\n- [#163]: Do not open all files directly while training\n- [#156]: There was a bug in ByteLevel PreTokenizer that caused offsets to be wrong if a char got\nsplit up in multiple bytes\n- [#174]: The `LongestFirst` truncation strategy had a bug\n\n\n[#1072]: https://github.com/huggingface/tokenizers/pull/1072\n[#956]: https://github.com/huggingface/tokenizers/pull/956\n[#1008]: https://github.com/huggingface/tokenizers/pull/1008\n[#1009]: https://github.com/huggingface/tokenizers/pull/1009\n[#1047]: https://github.com/huggingface/tokenizers/pull/1047\n[#1055]: https://github.com/huggingface/tokenizers/pull/1055\n[#1051]: https://github.com/huggingface/tokenizers/pull/1051\n[#1052]: https://github.com/huggingface/tokenizers/pull/1052\n[#938]: https://github.com/huggingface/tokenizers/pull/938\n[#939]: https://github.com/huggingface/tokenizers/pull/939\n[#952]: https://github.com/huggingface/tokenizers/pull/952\n[#954]: https://github.com/huggingface/tokenizers/pull/954\n[#961]: https://github.com/huggingface/tokenizers/pull/961\n[#960]: https://github.com/huggingface/tokenizers/pull/960\n[#919]: https://github.com/huggingface/tokenizers/pull/919\n[#916]: https://github.com/huggingface/tokenizers/pull/916\n[#884]: https://github.com/huggingface/tokenizers/pull/884\n[#882]: https://github.com/huggingface/tokenizers/pull/882\n[#868]: https://github.com/huggingface/tokenizers/pull/868\n[#860]: https://github.com/huggingface/tokenizers/pull/860\n[#403]: https://github.com/huggingface/tokenizers/pull/403\n[#377]: https://github.com/huggingface/tokenizers/pull/377\n[#355]: https://github.com/huggingface/tokenizers/pull/355\n[#363]: https://github.com/huggingface/tokenizers/pull/363\n[#330]: https://github.com/huggingface/tokenizers/pull/330\n[#311]: https://github.com/huggingface/tokenizers/pull/311\n[#309]: https://github.com/huggingface/tokenizers/pull/309\n[#298]: https://github.com/huggingface/tokenizers/pull/298\n[#289]: https://github.com/huggingface/tokenizers/pull/289\n[#286]: https://github.com/huggingface/tokenizers/pull/286\n[#280]: https://github.com/huggingface/tokenizers/pull/280\n[#276]: https://github.com/huggingface/tokenizers/pull/276\n[#272]: https://github.com/huggingface/tokenizers/pull/272\n[#249]: https://github.com/huggingface/tokenizers/pull/249\n[b770f36]: https://github.com/huggingface/tokenizers/commit/b770f364280af33efeffea8f0003102cda8cf1b7\n[#236]: https://github.com/huggingface/tokenizers/pull/236\n[#234]: https://github.com/huggingface/tokenizers/pull/234\n[#226]: https://github.com/huggingface/tokenizers/pull/226\n[#222]: https://github.com/huggingface/tokenizers/pull/222\n[#208]: https://github.com/huggingface/tokenizers/pull/208\n[#205]: https://github.com/huggingface/tokenizers/issues/205\n[#197]: https://github.com/huggingface/tokenizers/pull/197\n[#193]: https://github.com/huggingface/tokenizers/pull/193\n[#190]: https://github.com/huggingface/tokenizers/pull/190\n[#188]: https://github.com/huggingface/tokenizers/pull/188\n[#175]: https://github.com/huggingface/tokenizers/issues/175\n[#174]: https://github.com/huggingface/tokenizers/issues/174\n[#165]: https://github.com/huggingface/tokenizers/pull/165\n[#163]: https://github.com/huggingface/tokenizers/issues/163\n[#156]: https://github.com/huggingface/tokenizers/pull/156\n"
  },
  {
    "path": "tokenizers/Cargo.toml",
    "content": "[package]\nauthors = [\"Anthony MOI <m.anthony.moi@gmail.com>\", \"Nicolas Patry <patry.nicolas@protonmail.com>\"]\nedition = \"2018\"\nname = \"tokenizers\"\nversion = \"0.22.3-dev.0\"\nhomepage = \"https://github.com/huggingface/tokenizers\"\nrepository = \"https://github.com/huggingface/tokenizers\"\ndocumentation = \"https://docs.rs/tokenizers/\"\nlicense = \"Apache-2.0\"\nkeywords = [\"tokenizer\", \"NLP\", \"huggingface\", \"BPE\", \"WordPiece\"]\nreadme = \"./README.md\"\ndescription = \"\"\"\nProvides an implementation of today's most used tokenizers,\nwith a focus on performances and versatility.\n\"\"\"\nexclude = [ \"rust-toolchain\", \"target/*\", \"Cargo.lock\", \"benches/*.txt\", \"benches/*.json\", \"data/*\" ]\n\n[package.metadata.docs.rs]\nall-features = true\n\n[lib]\nname = \"tokenizers\"\npath = \"src/lib.rs\"\nbench = false\n\n[[bench]]\nname = \"bpe_benchmark\"\nharness = false\n\n[[bench]]\nname = \"bert_benchmark\"\nharness = false\n\n[[bench]]\nname = \"layout_benchmark\"\nharness = false\n\n[[bench]]\nname = \"unigram_benchmark\"\nharness = false\n\n[[bench]]\nname = \"llama3_benchmark\"\nharness = false\n\n[[bench]]\nname = \"added_vocab_deserialize\"\nrequired-features = [\"http\"]\nharness = false\n\n[dependencies]\nrand = \"0.9\"\nonig = { version = \"6.5.1\", default-features = false, optional = true }\nregex = \"1.10\"\nregex-syntax = \"0.8\"\nrayon = \"1.10\"\nrayon-cond = \"0.4\"\nserde = { version = \"1.0\", features = [ \"derive\" ] }\nserde_json = \"1.0\"\nunicode-normalization-alignments = \"0.1\"\nunicode_categories = \"0.1\"\nunicode-segmentation = \"1.11\"\nindicatif = {version = \"0.18\", optional = true}\nitertools = \"0.14\"\nlog = \"0.4\"\nderive_builder = \"0.20\"\nspm_precompiled = \"0.1.3\"\nhf-hub = { version = \"0.4.1\", features = [\"ureq\"], default-features = false, optional = true }\naho-corasick = \"1.1\"\npaste = \"1.0.14\"\nmacro_rules_attribute = \"0.2.0\"\nthiserror = \"2\"\nfancy-regex = { version = \"0.17\", optional = true}\ngetrandom = { version = \"0.3\" }\nesaxx-rs = { version = \"0.1.10\", default-features = false, features=[]}\nmonostate = \"0.1.12\"\nahash = { version = \"0.8.11\", features = [\"serde\"] }\ndary_heap = { version = \"0.3.6\", features = [\"serde\"] }\ncompact_str = { version = \"0.9\", features = [\"serde\"] }\n\n[features]\ndefault = [\"progressbar\", \"onig\", \"esaxx_fast\"]\nesaxx_fast = [\"esaxx-rs/cpp\"]\nprogressbar = [\"indicatif\"]\nhttp = [\"hf-hub\"]\nunstable_wasm = [\"fancy-regex\", \"getrandom/wasm_js\"]\nrustls-tls = [\"hf-hub?/rustls-tls\"]\n\n[dev-dependencies]\ncriterion = \"0.6\"\ntempfile = \"3.10\"\nassert_approx_eq = \"1.1\"\ntracing = \"0.1\"\ntracing-subscriber = \"0.3.18\"\n\n[profile.release]\nlto = \"fat\"\n\n[[example]]\nname = \"encode_batch\"\nrequired-features = [\"http\"]\n\n"
  },
  {
    "path": "tokenizers/Makefile",
    "content": "DATA_DIR = data\nBENCHMARK_DIR = benches\nTESTS_DIR = tests\n\ndir_guard=@mkdir -p $(@D)\n\nSHARED_RESOURCES = $(DATA_DIR)/gpt2-vocab.json $(DATA_DIR)/gpt2-merges.txt $(DATA_DIR)/bert-base-uncased-vocab.txt $(DATA_DIR)/big.txt $(DATA_DIR)/small.txt $(DATA_DIR)/albert-base-v1-tokenizer.json  $(DATA_DIR)/llama-3-tokenizer.json\nBENCHMARK_RESOURCES = $(SHARED_RESOURCES)\nTESTS_RESOURCES = $(SHARED_RESOURCES) $(DATA_DIR)/unigram.json $(DATA_DIR)/unigram_wagahaiwa_nekodearu.txt $(DATA_DIR)/roberta.json $(DATA_DIR)/tokenizer-wiki.json $(DATA_DIR)/bert-wiki.json\n\n.PHONY : build\nbuild :\n\tcargo build --all-targets\n\n.PHONY : release\nrelease :\n\tcargo build --release\n\n.PHONY : format\nformat :\n\tcargo fmt --\n\n.PHONY : lint\nlint :\n\tcargo fmt -- --check\n\tcargo fmt -- $(BENCHMARK_DIR)/*.rs --check\n\tcargo clippy --all-targets --all-features -- -D warnings\n\n.PHONY : test\ntest : $(TESTS_RESOURCES)\n\tcargo test\n\n.PHONY : doc\ndoc :\n\tcargo doc\n\n.PHONY : publish\npublish :\n\tcargo publish\n\n.PHONY : all-checks\nall-checks : lint test doc\n\n.PHONY : bench\nbench : $(BENCHMARK_RESOURCES)\n\tcargo bench -- --verbose\n\n$(DATA_DIR)/gpt2-% :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-$* -O $@\n\n$(DATA_DIR)/bert-% :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/bert-$* -O $@\n\n$(DATA_DIR)/unigram% :\n\t$(dir_guard)\n\twget https://huggingface.co/Narsil/small/raw/main/unigram$* -O $@\n\n$(DATA_DIR)/albert-base-v1-tokenizer.json :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/albert-base-v1-tokenizer.json -O $@\n\n$(DATA_DIR)/tokenizer-llama3.json :\n\t$(dir_guard)\n\twget https://huggingface.co/Narsil/llama-tokenizer/resolve/main/tokenizer.json -O $@\n\n$(DATA_DIR)/big.txt :\n\t$(dir_guard)\n\twget https://norvig.com/big.txt -O $@\n\n$(DATA_DIR)/small.txt : $(DATA_DIR)/big.txt\n\thead -100 $(DATA_DIR)/big.txt > $@\n\n$(DATA_DIR)/roberta.json :\n\t$(dir_guard)\n\twget https://huggingface.co/Narsil/small/raw/main/roberta.json -O $@\n\n$(DATA_DIR)/tokenizer-wiki.json :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-quicktour/tokenizer.json -O $@\n\n$(DATA_DIR)/bert-wiki.json :\n\t$(dir_guard)\n\twget https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-pipeline/tokenizer.json -O $@\n\n$(DATA_DIR)/llama-3-tokenizer.json :\n\t$(dir_guard)\n\twget https://huggingface.co/hf-internal-testing/llama3-tokenizer/resolve/main/tokenizer.json -O $@\n"
  },
  {
    "path": "tokenizers/README.md",
    "content": "<p align=\"center\">\n    <br>\n    <img src=\"https://huggingface.co/landing/assets/tokenizers/tokenizers-logo.png\" width=\"600\"/>\n    <br>\n<p>\n<p align=\"center\">\n    <img alt=\"Build\" src=\"https://github.com/huggingface/tokenizers/workflows/Rust/badge.svg\">\n    <a href=\"https://github.com/huggingface/tokenizers/blob/master/LICENSE\">\n        <img alt=\"GitHub\" src=\"https://img.shields.io/github/license/huggingface/tokenizers.svg?color=blue\">\n    </a>\n    <a href=\"https://docs.rs/tokenizers/\">\n        <img alt=\"Doc\" src=\"https://docs.rs/tokenizers/badge.svg\">\n    </a>\n</p>\n<br>\n\n\nThe core of `tokenizers`, written in Rust.\nProvides an implementation of today's most used tokenizers, with a focus on performance and\nversatility.\n\n## What is a Tokenizer\n\nA Tokenizer works as a pipeline, it processes some raw text as input and outputs an `Encoding`.\nThe various steps of the pipeline are:\n\n1. The `Normalizer`: in charge of normalizing the text. Common examples of normalization are\n   the [unicode normalization standards](https://unicode.org/reports/tr15/#Norm_Forms), such as `NFD` or `NFKC`.\n   More details about how to use the `Normalizers` are available on the\n   [Hugging Face blog](https://huggingface.co/docs/tokenizers/components#normalizers)\n2. The `PreTokenizer`: in charge of creating initial words splits in the text. The most common way of\n   splitting text is simply on whitespace.\n3. The `Model`: in charge of doing the actual tokenization. An example of a `Model` would be\n   `BPE` or `WordPiece`.\n4. The `PostProcessor`: in charge of post-processing the `Encoding` to add anything relevant\n   that, for example, a language model would need, such as special tokens.\n\n### Loading a pretrained tokenizer from the Hub\n```rust\nuse tokenizers::tokenizer::{Result, Tokenizer};\n\nfn main() -> Result<()> {\n    # #[cfg(feature = \"http\")]\n    # {\n    // needs http feature enabled\n    let tokenizer = Tokenizer::from_pretrained(\"bert-base-cased\", None)?;\n\n    let encoding = tokenizer.encode(\"Hey there!\", false)?;\n    println!(\"{:?}\", encoding.get_tokens());\n    # }\n    Ok(())\n}\n```\n\n### Deserialization and tokenization example\n\n```rust\nuse tokenizers::tokenizer::{Result, Tokenizer, EncodeInput};\nuse tokenizers::models::bpe::BPE;\n\nfn main() -> Result<()> {\n    let bpe_builder = BPE::from_file(\"./path/to/vocab.json\", \"./path/to/merges.txt\");\n    let bpe = bpe_builder\n        .dropout(0.1)\n        .unk_token(\"[UNK]\".into())\n        .build()?;\n\n    let mut tokenizer = Tokenizer::new(bpe);\n\n    let encoding = tokenizer.encode(\"Hey there!\", false)?;\n    println!(\"{:?}\", encoding.get_tokens());\n\n    Ok(())\n}\n```\n\n### Training and serialization example\n\n```rust\nuse tokenizers::decoders::DecoderWrapper;\nuse tokenizers::models::bpe::{BpeTrainerBuilder, BPE};\nuse tokenizers::normalizers::{strip::Strip, unicode::NFC, utils::Sequence, NormalizerWrapper};\nuse tokenizers::pre_tokenizers::byte_level::ByteLevel;\nuse tokenizers::pre_tokenizers::PreTokenizerWrapper;\nuse tokenizers::processors::PostProcessorWrapper;\nuse tokenizers::{AddedToken, Model, Result, TokenizerBuilder};\n\nuse std::path::Path;\n\nfn main() -> Result<()> {\n    let vocab_size: usize = 100;\n\n    let mut trainer = BpeTrainerBuilder::new()\n        .show_progress(true)\n        .vocab_size(vocab_size)\n        .min_frequency(0)\n        .special_tokens(vec![\n            AddedToken::from(String::from(\"<s>\"), true),\n            AddedToken::from(String::from(\"<pad>\"), true),\n            AddedToken::from(String::from(\"</s>\"), true),\n            AddedToken::from(String::from(\"<unk>\"), true),\n            AddedToken::from(String::from(\"<mask>\"), true),\n        ])\n        .build();\n\n    let mut tokenizer = TokenizerBuilder::new()\n        .with_model(BPE::default())\n        .with_normalizer(Some(Sequence::new(vec![\n            Strip::new(true, true).into(),\n            NFC.into(),\n        ])))\n        .with_pre_tokenizer(Some(ByteLevel::default()))\n        .with_post_processor(Some(ByteLevel::default()))\n        .with_decoder(Some(ByteLevel::default()))\n        .build()?;\n\n    let pretty = false;\n    tokenizer\n        .train_from_files(\n            &mut trainer,\n            vec![\"path/to/vocab.txt\".to_string()],\n        )?\n        .save(\"tokenizer.json\", pretty)?;\n\n    Ok(())\n}\n```\n\n## Additional information\n\n- tokenizers is designed to leverage CPU parallelism when possible. The level of parallelism is determined\n  by the total number of core/threads your CPU provides but this can be tuned by setting the `RAYON_RS_NUM_THREADS`\n  environment variable. As an example setting `RAYON_RS_NUM_THREADS=4` will allocate a maximum of 4 threads.\n  **_Please note this behavior may evolve in the future_**\n\n## Features\n\n- **progressbar**: The progress bar visualization is enabled by default. It might be disabled if\n  compilation for certain targets is not supported by the [termios](https://crates.io/crates/termios)\n  dependency of the [indicatif](https://crates.io/crates/indicatif) progress bar.\n\n- **http**: This feature enables downloading the tokenizer via HTTP. It is disabled by default.\n  With this feature enabled, `Tokenizer::from_pretrained` becomes accessible.\n"
  },
  {
    "path": "tokenizers/README.tpl",
    "content": "<p align=\"center\">\n    <br>\n    <img src=\"https://huggingface.co/landing/assets/tokenizers/tokenizers-logo.png\" width=\"600\"/>\n    <br>\n<p>\n<p align=\"center\">\n    <img alt=\"Build\" src=\"https://github.com/huggingface/tokenizers/workflows/Rust/badge.svg\">\n    <a href=\"https://github.com/huggingface/tokenizers/blob/master/LICENSE\">\n        <img alt=\"GitHub\" src=\"https://img.shields.io/github/license/huggingface/tokenizers.svg?color=blue\">\n    </a>\n    <a href=\"https://docs.rs/tokenizers/\">\n        <img alt=\"Doc\" src=\"https://docs.rs/tokenizers/badge.svg\">\n    </a>\n</p>\n<br>\n\n\n{{readme}}"
  },
  {
    "path": "tokenizers/benches/added_vocab_deserialize.rs",
    "content": "#[macro_use]\nextern crate criterion;\nuse criterion::Criterion;\nuse std::hint::black_box;\nuse std::str::FromStr;\nuse tokenizers::{normalizers::*, AddedToken, Normalizer, Tokenizer};\n\nfn serialized_tokenizer<N: Normalizer + Into<NormalizerWrapper>>(\n    size: i64,\n    normalizer: Option<N>,\n    special_tokens: bool,\n) -> String {\n    let mut tokenizer = Tokenizer::from_pretrained(\"t5-small\", None).unwrap();\n\n    if let Some(norm) = normalizer {\n        tokenizer.with_normalizer(Some(norm));\n    }\n\n    let tokens: Vec<_> = (0..size)\n        .map(|i| AddedToken::from(format!(\"tok{i}\"), special_tokens))\n        .collect();\n    tokenizer.add_tokens(&tokens);\n\n    serde_json::to_string(&tokenizer).unwrap()\n}\n\n#[allow(clippy::type_complexity)]\nfn bench_deserialize(c: &mut Criterion) {\n    let normalizers: Vec<(&str, Option<fn() -> NormalizerWrapper>)> = vec![\n        (\"none\", None),\n        (\"byte_level\", Some(|| ByteLevel.into())),\n        (\"lowercase\", Some(|| Lowercase.into())),\n        (\"nfc\", Some(|| NFC.into())),\n        (\"nfd\", Some(|| NFD.into())),\n        (\"nfkc\", Some(|| NFKC.into())),\n        (\"nfkd\", Some(|| NFKD.into())),\n        (\"nmt\", Some(|| Nmt.into())),\n        (\"strip\", Some(|| Strip::new(true, true).into())),\n        (\"replace\", Some(|| Replace::new(\"a\", \"b\").unwrap().into())),\n        (\"prepend\", Some(|| Prepend::new(\"pre_\".to_string()).into())),\n        (\"bert\", Some(|| BertNormalizer::default().into())),\n    ];\n\n    for &size in &[100_000, 400_000] {\n        for (norm_name, maybe_factory) in &normalizers {\n            let label = format!(\n                \"special tokens deserialize_added_vocab_{}_norm_{}\",\n                size, norm_name\n            );\n\n            let json = match maybe_factory {\n                Some(factory) => serialized_tokenizer(size, Some(factory()), true),\n                None => serialized_tokenizer::<NormalizerWrapper>(size, None, true),\n            };\n            c.bench_function(&label, |b| {\n                b.iter(|| {\n                    let tok: Tokenizer = black_box(Tokenizer::from_str(&json).unwrap());\n                    black_box(tok);\n                })\n            });\n\n            let label = format!(\n                \"non special deserialize_added_vocab_{}_norm_{}\",\n                size, norm_name\n            );\n\n            let json = match maybe_factory {\n                Some(factory) => serialized_tokenizer(size, Some(factory()), false),\n                None => serialized_tokenizer::<NormalizerWrapper>(size, None, false),\n            };\n            c.bench_function(&label, |b| {\n                b.iter(|| {\n                    let tok: Tokenizer = black_box(Tokenizer::from_str(&json).unwrap());\n                    black_box(tok);\n                })\n            });\n        }\n    }\n}\n\ncriterion_group! {\n    name = benches;\n    config = Criterion::default().significance_level(0.1).sample_size(10);\n    targets = bench_deserialize\n}\ncriterion_main!(benches);\n"
  },
  {
    "path": "tokenizers/benches/bert_benchmark.rs",
    "content": "#[macro_use]\nextern crate criterion;\n\nmod common;\n\nuse std::fs::File;\nuse std::io::{BufRead, BufReader};\nuse std::path::Path;\n\nuse criterion::{Criterion, Throughput};\nuse tokenizers::models::wordpiece::{WordPiece, WordPieceTrainerBuilder};\nuse tokenizers::normalizers::{BertNormalizer, NormalizerWrapper};\nuse tokenizers::pre_tokenizers::bert::BertPreTokenizer;\nuse tokenizers::processors::bert::BertProcessing;\nuse tokenizers::{decoders, EncodeInput, Model, TokenizerImpl};\n\nuse common::{iter_bench_encode, iter_bench_encode_batch, iter_bench_train};\nuse tokenizers::decoders::DecoderWrapper;\nuse tokenizers::pre_tokenizers::whitespace::Whitespace;\nuse tokenizers::processors::PostProcessorWrapper;\n\nstatic BATCH_SIZE: usize = 1_000;\n\ntype BertTokenizer = TokenizerImpl<\n    WordPiece,\n    BertNormalizer,\n    BertPreTokenizer,\n    BertProcessing,\n    decoders::wordpiece::WordPiece,\n>;\n\n/// Resembling the BertTokenizer implementation from the Python bindings.\nfn create_bert_tokenizer(wp: WordPiece) -> BertTokenizer {\n    let sep_id = *wp.get_vocab().get(\"[SEP]\").unwrap();\n    let cls_id = *wp.get_vocab().get(\"[CLS]\").unwrap();\n    let mut tokenizer = TokenizerImpl::new(wp);\n    tokenizer.with_pre_tokenizer(Some(BertPreTokenizer));\n    tokenizer.with_normalizer(Some(BertNormalizer::default()));\n    tokenizer.with_decoder(Some(decoders::wordpiece::WordPiece::default()));\n    tokenizer.with_post_processor(Some(BertProcessing::new(\n        (\"[SEP]\".to_string(), sep_id),\n        (\"[CLS]\".to_string(), cls_id),\n    )));\n    tokenizer\n}\n\npub fn bench_bert(c: &mut Criterion) {\n    let wp = WordPiece::from_file(\"data/bert-base-uncased-vocab.txt\")\n        .build()\n        .unwrap();\n    let tokenizer = create_bert_tokenizer(wp);\n    let mut group = c.benchmark_group(\"bert-encode\");\n    let data = std::fs::read_to_string(\"data/big.txt\").unwrap();\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    let mut lines: Vec<EncodeInput> = vec![];\n    let mut batches: Vec<Vec<EncodeInput>> = vec![vec![]];\n    for line in BufReader::new(File::open(Path::new(\"data/big.txt\")).unwrap()).lines() {\n        let line: EncodeInput = line.unwrap().into();\n        lines.push(line.clone());\n        if batches.last().unwrap().len() >= BATCH_SIZE {\n            batches.push(vec![]);\n        }\n        batches.last_mut().unwrap().push(line);\n    }\n\n    group.bench_function(\"WordPiece BERT encode\", |b| {\n        b.iter_custom(|iters| iter_bench_encode(iters, &tokenizer, &lines))\n    });\n\n    group.bench_function(\"WordPiece BERT encode batch\", |b| {\n        b.iter_custom(|iters| iter_bench_encode_batch(iters, &tokenizer, &batches))\n    });\n}\n\nfn bench_train_small(c: &mut Criterion) {\n    let mut trainer = WordPieceTrainerBuilder::default()\n        .show_progress(false)\n        .build();\n    type Tok = TokenizerImpl<\n        WordPiece,\n        NormalizerWrapper,\n        Whitespace,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    >;\n    let mut tokenizer = Tok::new(WordPiece::default());\n    tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    let mut group = c.benchmark_group(\"bert-train-small\");\n    let data = std::fs::read_to_string(\"data/small.txt\").unwrap();\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    group.bench_function(\"WordPiece Train vocabulary (small)\", |b| {\n        b.iter_custom(|iters| {\n            iter_bench_train(\n                iters,\n                &mut tokenizer,\n                &mut trainer,\n                vec![\"data/small.txt\".to_string()],\n            )\n        })\n    });\n}\n\nfn bench_train_big(c: &mut Criterion) {\n    let mut trainer = WordPieceTrainerBuilder::default()\n        .show_progress(false)\n        .build();\n    type Tok = TokenizerImpl<\n        WordPiece,\n        NormalizerWrapper,\n        Whitespace,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    >;\n    let mut tokenizer = Tok::new(WordPiece::default());\n    tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    let mut group = c.benchmark_group(\"bert-train-big\");\n    let data = std::fs::read_to_string(\"data/big.txt\").unwrap();\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    group.bench_function(\"WordPiece Train vocabulary (big)\", |b| {\n        b.iter_custom(|iters| {\n            iter_bench_train(\n                iters,\n                &mut tokenizer,\n                &mut trainer,\n                vec![\"data/big.txt\".to_string()],\n            )\n        })\n    });\n}\n\ncriterion_group! {\n    name = bert_benches;\n    config = Criterion::default().sample_size(20);\n    targets = bench_bert\n}\n\ncriterion_group! {\n    name = benches_train_small;\n    config = Criterion::default().sample_size(10);\n    targets = bench_train_small\n}\n\ncriterion_group! {\n    name = benches_train_big;\n    config = Criterion::default().sample_size(10);\n    targets = bench_train_big\n}\n\ncriterion_main!(bert_benches, benches_train_small, benches_train_big);\n"
  },
  {
    "path": "tokenizers/benches/bpe_benchmark.rs",
    "content": "#[macro_use]\nextern crate criterion;\n\nmod common;\n\nuse criterion::{Criterion, Throughput};\nuse tokenizers::models::bpe::{BpeTrainerBuilder, BPE};\nuse tokenizers::models::TrainerWrapper;\nuse tokenizers::pre_tokenizers::byte_level::ByteLevel;\nuse tokenizers::pre_tokenizers::whitespace::Whitespace;\nuse tokenizers::tokenizer::{AddedToken, EncodeInput};\nuse tokenizers::Tokenizer;\n\nuse common::{iter_bench_encode, iter_bench_encode_batch, iter_bench_train};\nuse std::ops::Deref;\n\nstatic BATCH_SIZE: usize = 1_000;\n\nfn create_gpt2_tokenizer(bpe: BPE) -> Tokenizer {\n    let mut tokenizer = Tokenizer::new(bpe);\n    tokenizer.with_pre_tokenizer(Some(ByteLevel::default()));\n    tokenizer.with_decoder(Some(ByteLevel::default()));\n    tokenizer.add_tokens(&[AddedToken::from(\"ing\", false).single_word(false)]);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"[ENT]\", true).single_word(true)]);\n    tokenizer\n}\n\nfn bench_gpt2(c: &mut Criterion) {\n    let bpe = BPE::from_file(\"data/gpt2-vocab.json\", \"data/gpt2-merges.txt\")\n        .build()\n        .unwrap();\n    let tokenizer = create_gpt2_tokenizer(bpe);\n    let mut lines: Vec<EncodeInput> = vec![];\n    let mut batches: Vec<Vec<EncodeInput>> = vec![vec![]];\n    let data = std::fs::read_to_string(\"data/big.txt\").unwrap();\n    for line in data.lines() {\n        let line: EncodeInput = line.into();\n        lines.push(line.clone());\n        if batches.last().unwrap().len() >= BATCH_SIZE {\n            batches.push(vec![]);\n        }\n        batches.last_mut().unwrap().push(line);\n    }\n\n    let mut group = c.benchmark_group(\"bpe-encode\");\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    group.bench_function(\"BPE GPT2 encode\", |b| {\n        b.iter_custom(|iters| iter_bench_encode(iters, tokenizer.deref(), &lines))\n    });\n\n    group.bench_function(\"BPE GPT2 encode batch\", |b| {\n        b.iter_custom(|iters| iter_bench_encode_batch(iters, tokenizer.deref(), &batches))\n    });\n\n    let bpe = BPE::from_file(\"data/gpt2-vocab.json\", \"data/gpt2-merges.txt\")\n        .cache_capacity(0)\n        .build()\n        .unwrap();\n    let tokenizer = create_gpt2_tokenizer(bpe);\n\n    group.bench_function(\"BPE GPT2 encode, no cache\", |b| {\n        b.iter_custom(|iters| iter_bench_encode(iters, &tokenizer, &lines))\n    });\n\n    group.bench_function(\"BPE GPT2 encode batch, no cache\", |b| {\n        b.iter_custom(|iters| iter_bench_encode_batch(iters, &tokenizer, &batches))\n    });\n}\n\nfn bench_train_small(c: &mut Criterion) {\n    let mut trainer: TrainerWrapper = BpeTrainerBuilder::default()\n        .show_progress(false)\n        .build()\n        .into();\n    let mut tokenizer = Tokenizer::new(BPE::default()).into_inner();\n    let mut group = c.benchmark_group(\"bpe-train-small\");\n    let data = std::fs::read_to_string(\"data/small.txt\").unwrap();\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    group.bench_function(\"BPE Train vocabulary (small)\", |b| {\n        b.iter_custom(|iters| {\n            iter_bench_train(\n                iters,\n                &mut tokenizer,\n                &mut trainer,\n                vec![\"data/small.txt\".to_string()],\n            )\n        })\n    });\n}\n\nfn bench_train_big(c: &mut Criterion) {\n    let mut trainer: TrainerWrapper = BpeTrainerBuilder::default()\n        .show_progress(false)\n        .build()\n        .into();\n    let mut tokenizer = Tokenizer::new(BPE::default()).into_inner();\n    tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    let mut group = c.benchmark_group(\"bpe-train-large\");\n    let data = std::fs::read_to_string(\"data/big.txt\").unwrap();\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    group.bench_function(\"BPE Train vocabulary (big)\", |b| {\n        b.iter_custom(|iters| {\n            iter_bench_train(\n                iters,\n                &mut tokenizer,\n                &mut trainer,\n                vec![\"data/big.txt\".to_string()],\n            )\n        })\n    });\n}\n\ncriterion_group! {\n    name = benches;\n    config = Criterion::default().sample_size(20);\n    targets = bench_gpt2\n}\ncriterion_group! {\n    name = benches_train_small;\n    config = Criterion::default().sample_size(10);\n    targets = bench_train_small\n}\ncriterion_group! {\n    name = benches_train_big;\n    config = Criterion::default().sample_size(10);\n    targets = bench_train_big\n}\ncriterion_main!(benches, benches_train_small, benches_train_big);\n"
  },
  {
    "path": "tokenizers/benches/common/mod.rs",
    "content": "use std::time::{Duration, Instant};\n\nuse std::hint::black_box;\n\nuse tokenizers::{\n    Decoder, EncodeInput, Model, Normalizer, PostProcessor, PreTokenizer, TokenizerImpl, Trainer,\n};\n\n#[allow(dead_code)]\npub fn iter_bench_encode<M, N, PT, PP, D>(\n    iters: u64,\n    tokenizer: &TokenizerImpl<M, N, PT, PP, D>,\n    lines: &[EncodeInput],\n) -> Duration\nwhere\n    M: Model,\n    N: Normalizer,\n    PT: PreTokenizer,\n    PP: PostProcessor,\n    D: Decoder,\n{\n    let mut duration = Duration::new(0, 0);\n    for _i in 0..iters {\n        for line in lines {\n            let input = line.clone();\n            let start = Instant::now();\n            let _ = black_box(tokenizer.encode(input, false));\n            duration = duration.checked_add(start.elapsed()).unwrap();\n        }\n    }\n    duration\n}\n\n#[allow(dead_code)]\npub fn iter_bench_encode_batch<M, N, PT, PP, D>(\n    iters: u64,\n    tokenizer: &TokenizerImpl<M, N, PT, PP, D>,\n    batches: &[Vec<EncodeInput>],\n) -> Duration\nwhere\n    M: Model + Send + Sync,\n    N: Normalizer + Send + Sync,\n    PT: PreTokenizer + Send + Sync,\n    PP: PostProcessor + Send + Sync,\n    D: Decoder + Send + Sync,\n{\n    let mut duration = Duration::new(0, 0);\n    for _i in 0..iters {\n        for batch in batches {\n            let batch = batch.clone();\n            let start = Instant::now();\n            let _ = black_box(tokenizer.encode_batch(batch, false));\n            duration = duration.checked_add(start.elapsed()).unwrap();\n        }\n    }\n    duration\n}\n\n#[allow(dead_code)]\npub fn iter_bench_train<T, M, N, PT, PP, D>(\n    iters: u64,\n    tokenizer: &mut TokenizerImpl<M, N, PT, PP, D>,\n    trainer: &mut T,\n    files: Vec<String>,\n) -> Duration\nwhere\n    T: Trainer<Model = M> + Sync,\n    M: Model + Send + Sync,\n    N: Normalizer + Send + Sync,\n    PT: PreTokenizer + Send + Sync,\n    PP: PostProcessor + Send + Sync,\n    D: Decoder + Send + Sync,\n{\n    let mut duration = Duration::new(0, 0);\n    for _i in 0..iters {\n        let start = Instant::now();\n        tokenizer.train_from_files(trainer, files.clone()).unwrap();\n        duration = duration.checked_add(start.elapsed()).unwrap();\n    }\n    duration\n}\n"
  },
  {
    "path": "tokenizers/benches/layout_benchmark.rs",
    "content": "#[macro_use]\nextern crate criterion;\n\nuse std::fs::File;\nuse std::io::{BufRead, BufReader};\nuse std::path::Path;\nuse std::time::{Duration, Instant};\n\nuse criterion::Criterion;\nuse std::hint::black_box;\nuse tokenizers::processors::template::TemplateProcessing;\nuse tokenizers::{EncodeInput, Encoding, PostProcessor, Tokenizer};\n\n/// Simple TemplateProcessing\nfn create_processor() -> TemplateProcessing {\n    TemplateProcessing::builder()\n        .try_single(\"[CLS]:0 $A:0 [SEP]:0\")\n        .unwrap()\n        .try_pair(\"[CLS]:0 $A:0 [SEP]:0 $B:1 [SEP]:1\")\n        .unwrap()\n        .special_tokens(vec![(\"[CLS]\", 0), (\"[SEP]\", 1)])\n        .build()\n        .unwrap()\n}\n\npub fn bench_layout(c: &mut Criterion) {\n    let processor = create_processor();\n    let tokenizer = Tokenizer::from_file(\"data/albert-base-v1-tokenizer.json\").unwrap();\n    let mut encodeds: Vec<Encoding> = vec![];\n    for line in BufReader::new(File::open(Path::new(\"data/big.txt\")).unwrap()).lines() {\n        let line: EncodeInput = line.unwrap().into();\n\n        let encoded: Encoding = tokenizer.encode(line, false).unwrap();\n        encodeds.push(encoded);\n    }\n\n    c.bench_function(\"TemplateProcessing single encode\", |b| {\n        b.iter_custom(|iters| {\n            let mut duration = Duration::new(0, 0);\n            for i in 0..iters as usize {\n                let encoded_index = i % encodeds.len();\n                let encoded: Encoding = encodeds[encoded_index].clone();\n\n                let start = Instant::now();\n                let _ = black_box(processor.process(encoded, None, false));\n                duration = duration.checked_add(start.elapsed()).unwrap();\n            }\n            duration\n        })\n    });\n    c.bench_function(\"TemplateProcessing pair encode\", |b| {\n        b.iter_custom(|iters| {\n            let mut duration = Duration::new(0, 0);\n            for i in 0..iters as usize {\n                let encoded_index = i % encodeds.len();\n                let encoded: Encoding = encodeds[encoded_index].clone();\n\n                let encoded_index2 = (i + 1) % encodeds.len();\n                let pair: Encoding = encodeds[encoded_index2].clone();\n\n                let start = Instant::now();\n                let _ = black_box(processor.process(encoded, Some(pair), false));\n                duration = duration.checked_add(start.elapsed()).unwrap();\n            }\n            duration\n        })\n    });\n}\n\ncriterion_group! {\n    name = layout_benches;\n    config = Criterion::default().sample_size(20);\n    targets = bench_layout\n}\n\ncriterion_main!(layout_benches);\n"
  },
  {
    "path": "tokenizers/benches/llama3_benchmark.rs",
    "content": "#[macro_use]\nextern crate criterion;\n\nmod common;\n\nuse common::{iter_bench_encode, iter_bench_encode_batch, iter_bench_train};\nuse criterion::{Criterion, Throughput};\nuse std::hint::black_box;\nuse tokenizers::{\n    models::{bpe::BpeTrainerBuilder, TrainerWrapper},\n    EncodeInput, Tokenizer,\n};\n\nstatic BATCH_SIZE: usize = 1_000;\n\npub fn llama3(c: &mut Criterion) {\n    let data = std::fs::read_to_string(\"data/big.txt\").unwrap();\n    let mut group = c.benchmark_group(\"llama3-encode\");\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    let mut lines: Vec<EncodeInput> = vec![];\n    let mut batches: Vec<Vec<EncodeInput>> = vec![vec![]];\n    for line in data.lines() {\n        let line: EncodeInput = line.into();\n        lines.push(line.clone());\n        if batches.last().unwrap().len() >= BATCH_SIZE {\n            batches.push(vec![]);\n        }\n        batches.last_mut().unwrap().push(line);\n    }\n    let tokenizer = Tokenizer::from_file(\"data/llama-3-tokenizer.json\").unwrap();\n    group.bench_function(\"llama3-offsets\", |b| {\n        let data: Vec<_> = data.lines().collect();\n        let add_special_tokens = false;\n        b.iter(|| {\n            tokenizer\n                .encode_batch_char_offsets(black_box(data.clone()), add_special_tokens)\n                .unwrap()\n        })\n    });\n    group.bench_function(\"llama3-encode\", |b| {\n        b.iter_custom(|iters| iter_bench_encode(iters, &tokenizer, &lines))\n    });\n    group.bench_function(\"llama3-batch\", |b| {\n        b.iter_custom(|iters| iter_bench_encode_batch(iters, &tokenizer, &batches))\n    });\n    let mut trainer: TrainerWrapper = BpeTrainerBuilder::default()\n        .show_progress(false)\n        .build()\n        .into();\n    let mut tokenizer = Tokenizer::from_file(\"data/llama-3-tokenizer.json\").unwrap();\n    group.bench_function(\"BPE Train vocabulary (big)\", |b| {\n        b.iter_custom(|iters| {\n            iter_bench_train(\n                iters,\n                &mut tokenizer,\n                &mut trainer,\n                vec![\"data/big.txt\".to_string()],\n            )\n        })\n    });\n    group.finish();\n}\n\ncriterion_group! {\n    name = llama_3;\n    config = Criterion::default().sample_size(10);\n    targets = llama3\n}\n\ncriterion_main!(llama_3);\n"
  },
  {
    "path": "tokenizers/benches/unigram_benchmark.rs",
    "content": "#[macro_use]\nextern crate criterion;\n\nmod common;\n\nuse common::iter_bench_train;\n\nuse criterion::{Criterion, Throughput};\nuse tokenizers::models::unigram::{Unigram, UnigramTrainerBuilder};\nuse tokenizers::models::TrainerWrapper;\nuse tokenizers::pre_tokenizers::whitespace::Whitespace;\nuse tokenizers::Tokenizer;\n\n// pub fn bench_train(c: &mut Criterion) {\n//     let trainer = UnigramTrainer::builder()\n//         .show_progress(false)\n//         .unk_token(Some(\"<UNK>\".into()))\n//         .build()\n//         .unwrap();\n//\n//     let mut model = Unigram::default();\n//\n//     let content = read_to_string(\"data/big.txt\").unwrap();\n//     c.bench_function(\"Unigram Train vocabulary (medium)\", |b| {\n//         b.iter_custom(|iters| {\n//             let mut duration = Duration::new(0, 0);\n//             for _i in 0..iters {\n//                 let sentences = sentences.clone();\n//                 let start = Instant::now();\n//                 trainer.do_train(sentences, &mut model).unwrap();\n//                 duration = duration.checked_add(start.elapsed()).unwrap();\n//             }\n//             duration\n//         })\n//     });\n// }\nfn bench_train(c: &mut Criterion) {\n    let mut trainer: TrainerWrapper = UnigramTrainerBuilder::default()\n        .show_progress(false)\n        .build()\n        .unwrap()\n        .into();\n    let mut tokenizer = Tokenizer::new(Unigram::default()).into_inner();\n    tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    let mut group = c.benchmark_group(\"unigram-train-large\");\n    let data = std::fs::read_to_string(\"data/big.txt\").unwrap();\n    group.throughput(Throughput::Bytes(data.len() as u64));\n    group.bench_function(\"BPE Train vocabulary (big)\", |b| {\n        b.iter_custom(|iters| {\n            iter_bench_train(\n                iters,\n                &mut tokenizer,\n                &mut trainer,\n                vec![\"data/big.txt\".to_string()],\n            )\n        })\n    });\n}\n\ncriterion_group! {\n    name = benches_train;\n    config = Criterion::default().sample_size(10);\n    targets = bench_train\n}\n\ncriterion_main!(benches_train);\n"
  },
  {
    "path": "tokenizers/examples/encode_batch.rs",
    "content": "use tokenizers::Tokenizer;\n\nfn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {\n    let tokenizer = Tokenizer::from_pretrained(\"meta-llama/Meta-Llama-3.1-8B-Instruct\", None)?;\n\n    let data = std::fs::read_to_string(\"data/big.txt\")?;\n    let data: Vec<_> = data.lines().collect();\n    let add_special_tokens = false;\n    tokenizer.encode_batch_char_offsets(data, add_special_tokens)?;\n    Ok(())\n}\n"
  },
  {
    "path": "tokenizers/examples/serialization.rs",
    "content": "use tokenizers::models::wordpiece::WordPiece;\nuse tokenizers::{AddedToken, Tokenizer};\n\nfn main() {\n    let start = std::time::Instant::now();\n    let mut tokenizer = Tokenizer::new(WordPiece::default());\n\n    // Mix special and not special\n    // You can make sure ids are in order, and special status is correct.\n    let tokens: Vec<_> = (0..120_000)\n        .map(|i| AddedToken::from(format!(\"[SPECIAL_{i}]\"), i % 2 == 0))\n        .collect();\n    tokenizer.add_tokens(&tokens);\n    tokenizer.save(\"_tok.json\", true).unwrap();\n    println!(\"Save took {:?}\", start.elapsed());\n    let start = std::time::Instant::now();\n    let _tok = Tokenizer::from_file(\"_tok.json\").unwrap();\n    println!(\"Took {:?}\", start.elapsed());\n    std::fs::remove_file(\"_tok.json\").unwrap();\n}\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/.gitignore",
    "content": "/target\n**/*.rs.bk\nCargo.lock\nbin/\npkg/\nwasm-pack.log\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/Cargo.toml",
    "content": "[package]\nname = \"unstable_wasm\"\nversion = \"0.1.0\"\nauthors = [\"Nicolas Patry\"]\nedition = \"2018\"\n\n[lib]\ncrate-type = [\"cdylib\", \"rlib\"]\n\n[features]\ndefault = [\"console_error_panic_hook\"]\n\n[dependencies]\nwasm-bindgen = \"0.2.63\"\n\n# The `console_error_panic_hook` crate provides better debugging of panics by\n# logging them with `console.error`. This is great for development, but requires\n# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for\n# code size when deploying.\nconsole_error_panic_hook = { version = \"0.1.6\", optional = true }\n\n# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size\n# compared to the default allocator's ~10K. It is slower than the default\n# allocator, however.\n#\n# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now.\nwee_alloc = { version = \"0.4.5\", optional = true }\n\ntokenizers = { path = \"../../\", default-features=false, features = [\"unstable_wasm\"]}\n\n[dev-dependencies]\nwasm-bindgen-test = \"0.3.13\"\n\n[profile.release]\n# Tell `rustc` to optimize for small code size.\nopt-level = \"s\"\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/README.md",
    "content": "<div align=\"center\">\n\n  <h1><code>wasm-pack-template</code></h1>\n\n  <strong>A template for kick starting a Rust and WebAssembly project using <a href=\"https://github.com/rustwasm/wasm-pack\">wasm-pack</a>.</strong>\n\n  <p>\n    <a href=\"https://travis-ci.org/rustwasm/wasm-pack-template\"><img src=\"https://img.shields.io/travis/rustwasm/wasm-pack-template.svg?style=flat-square\" alt=\"Build Status\" /></a>\n  </p>\n\n  <h3>\n    <a href=\"https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html\">Tutorial</a>\n    <span> | </span>\n    <a href=\"https://discordapp.com/channels/442252698964721669/443151097398296587\">Chat</a>\n  </h3>\n\n  <sub>Built with 🦀🕸 by <a href=\"https://rustwasm.github.io/\">The Rust and WebAssembly Working Group</a></sub>\n</div>\n\n## About\n\n\nThis is an example project showing off a very basic use case for `wasm` tokenizers\nusage.\n\n[**📚 Read this template tutorial! 📚**][template-docs]\n\nThis template is designed for compiling Rust libraries into WebAssembly and\npublishing the resulting package to NPM.\n\nBe sure to check out [other `wasm-pack` tutorials online][tutorials] for other\ntemplates and usages of `wasm-pack`.\n\n[tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html\n[template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html\n\n## 🚴 Usage\n\n### 🐑 Use `cargo generate` to Clone this Template\n\n[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate)\n\n```\ncargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project\ncd my-project\n```\n\n### 🛠️ Build with `wasm-pack build`\n\n```\nwasm-pack build\n```\n\n### 🔬 Test in Headless Browsers with `wasm-pack test`\n\n```\nwasm-pack test --headless --firefox\n```\n\n### 🎁 Publish to NPM with `wasm-pack publish`\n\n```\nwasm-pack publish\n```\n\n## 🔋 Batteries Included\n\n* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating\n  between WebAssembly and JavaScript.\n* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook)\n  for logging panic messages to the developer console.\n* [`wee_alloc`](https://github.com/rustwasm/wee_alloc), an allocator optimized\n  for small code size.\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/src/lib.rs",
    "content": "mod utils;\nuse tokenizers::models::bpe::{Vocab, BPE};\nuse tokenizers::Tokenizer;\n\nuse wasm_bindgen::prelude::*;\n\n// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global\n// allocator.\n#[cfg(feature = \"wee_alloc\")]\n#[global_allocator]\nstatic ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;\n\n#[wasm_bindgen]\npub fn tokenize(string: &str) -> Vec<u32> {\n    let vocab: Vocab = vec![\n        (\"a\".to_string(), 0),\n        (\"##b\".to_string(), 1),\n        (\"##c\".to_string(), 2),\n        (\"ab\".to_string(), 3),\n        (\"abc\".to_string(), 4),\n    ]\n    .into_iter()\n    .collect();\n\n    let merges = vec![\n        (\"a\".to_string(), \"##b\".to_string()),\n        (\"ab\".to_string(), \"##c\".to_string()),\n    ];\n\n    let bpe = BPE::builder()\n        .vocab_and_merges(vocab, merges)\n        .unk_token(\"[UNK]\".to_string())\n        .continuing_subword_prefix(\"##\".to_string())\n        .build()\n        .unwrap();\n    let tokenizer = Tokenizer::new(bpe);\n    tokenizer\n        .encode(string, false)\n        .unwrap()\n        .get_ids()\n        .into_iter()\n        .cloned()\n        .collect()\n}\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/src/utils.rs",
    "content": "pub fn set_panic_hook() {\n    // When the `console_error_panic_hook` feature is enabled, we can call the\n    // `set_panic_hook` function at least once during initialization, and then\n    // we will get better error messages if our code ever panics.\n    //\n    // For more details see\n    // https://github.com/rustwasm/console_error_panic_hook#readme\n    #[cfg(feature = \"console_error_panic_hook\")]\n    console_error_panic_hook::set_once();\n}\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/tests/web.rs",
    "content": "//! Test suite for the Web and headless browsers.\n\n#![cfg(target_arch = \"wasm32\")]\n\nextern crate wasm_bindgen_test;\nuse wasm_bindgen_test::*;\n\nwasm_bindgen_test_configure!(run_in_browser);\n\n#[wasm_bindgen_test]\nfn pass() {\n    assert_eq!(1 + 1, 2);\n}\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/.gitignore",
    "content": "node_modules\ndist\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/.travis.yml",
    "content": "language: node_js\nnode_js: \"10\"\n\nscript:\n  - ./node_modules/.bin/webpack\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/LICENSE-APACHE",
    "content": "                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n   To apply the Apache License to your work, attach the following\n   boilerplate notice, with the fields enclosed by brackets \"[]\"\n   replaced with your own identifying information. (Don't include\n   the brackets!)  The text should be enclosed in the appropriate\n   comment syntax for the file format. We also recommend that a\n   file or class name and description of purpose be included on the\n   same \"printed page\" as the copyright notice for easier\n   identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/LICENSE-MIT",
    "content": "Copyright (c) [year] [name]\n\nPermission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/README.md",
    "content": "<div align=\"center\">\n\n  <h1><code>create-wasm-app</code></h1>\n\n  <strong>An <code>npm init</code> template for kick starting a project that uses NPM packages containing Rust-generated WebAssembly and bundles them with Webpack.</strong>\n\n  <p>\n    <a href=\"https://travis-ci.org/rustwasm/create-wasm-app\"><img src=\"https://img.shields.io/travis/rustwasm/create-wasm-app.svg?style=flat-square\" alt=\"Build Status\" /></a>\n  </p>\n\n  <h3>\n    <a href=\"#usage\">Usage</a>\n    <span> | </span>\n    <a href=\"https://discordapp.com/channels/442252698964721669/443151097398296587\">Chat</a>\n  </h3>\n\n  <sub>Built with 🦀🕸 by <a href=\"https://rustwasm.github.io/\">The Rust and WebAssembly Working Group</a></sub>\n</div>\n\n## About\n\nThis template is designed for depending on NPM packages that contain\nRust-generated WebAssembly and using them to create a Website.\n\n* Want to create an NPM package with Rust and WebAssembly? [Check out\n  `wasm-pack-template`.](https://github.com/rustwasm/wasm-pack-template)\n* Want to make a monorepo-style Website without publishing to NPM? Check out\n  [`rust-webpack-template`](https://github.com/rustwasm/rust-webpack-template)\n  and/or\n  [`rust-parcel-template`](https://github.com/rustwasm/rust-parcel-template).\n\n## 🚴 Usage\n\n```\nnpm init wasm-app\n```\n\n## 🔋 Batteries Included\n\n- `.gitignore`: ignores `node_modules`\n- `LICENSE-APACHE` and `LICENSE-MIT`: most Rust projects are licensed this way, so these are included for you\n- `README.md`: the file you are reading now!\n- `index.html`: a bare bones html document that includes the webpack bundle\n- `index.js`: example js file with a comment showing how to import and use a wasm pkg\n- `package.json` and `package-lock.json`:\n  - pulls in devDependencies for using webpack:\n      - [`webpack`](https://www.npmjs.com/package/webpack)\n      - [`webpack-cli`](https://www.npmjs.com/package/webpack-cli)\n      - [`webpack-dev-server`](https://www.npmjs.com/package/webpack-dev-server)\n  - defines a `start` script to run `webpack-dev-server`\n- `webpack.config.js`: configuration file for bundling your js with webpack\n\n## License\n\nLicensed under either of\n\n* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in the work by you, as defined in the Apache-2.0\nlicense, shall be dual licensed as above, without any additional terms or\nconditions.\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/bootstrap.js",
    "content": "// A dependency graph that contains any wasm must all be imported\n// asynchronously. This `bootstrap.js` file does the single async import, so\n// that no one else needs to worry about it again.\nimport(\"./index.js\")\n  .catch(e => console.error(\"Error importing `index.js`:\", e));\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Hello wasm-pack!</title>\n  </head>\n  <body>\n    <noscript>This page contains webassembly and javascript content, please enable javascript in your browser.</noscript>\n    <script src=\"./bootstrap.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/index.js",
    "content": "import * as wasm from \"unstable_wasm\";\n\nconsole.log(wasm.tokenize(\"ab\"));\nconsole.log(wasm.tokenize(\"abc\"));\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/package.json",
    "content": "{\n    \"name\": \"create-wasm-app\",\n    \"version\": \"0.1.0\",\n    \"description\": \"create an app to consume rust-generated wasm packages\",\n    \"main\": \"index.js\",\n    \"bin\": {\n        \"create-wasm-app\": \".bin/create-wasm-app.js\"\n    },\n    \"scripts\": {\n        \"build\": \"webpack --config webpack.config.js\",\n        \"start\": \"NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/rustwasm/create-wasm-app.git\"\n    },\n    \"keywords\": [\"webassembly\", \"wasm\", \"rust\", \"webpack\"],\n    \"author\": \"Ashley Williams <ashley666ashley@gmail.com>\",\n    \"license\": \"(MIT OR Apache-2.0)\",\n    \"bugs\": {\n        \"url\": \"https://github.com/rustwasm/create-wasm-app/issues\"\n    },\n    \"homepage\": \"https://github.com/rustwasm/create-wasm-app#readme\",\n    \"devDependencies\": {\n        \"copy-webpack-plugin\": \"^11.0.0\",\n        \"webpack\": \"^5.75.0\",\n        \"webpack-cli\": \"^5.0.1\",\n        \"webpack-dev-server\": \"^5.2.1\"\n    },\n    \"dependencies\": {\n        \"unstable_wasm\": \"file:../pkg\"\n    }\n}\n"
  },
  {
    "path": "tokenizers/examples/unstable_wasm/www/webpack.config.js",
    "content": "const CopyWebpackPlugin = require(\"copy-webpack-plugin\");\nconst path = require('path');\n\nmodule.exports = {\n  entry: \"./bootstrap.js\",\n  output: {\n    path: path.resolve(__dirname, \"dist\"),\n    filename: \"bootstrap.js\",\n  },\n  mode: \"development\",\n  plugins: [\n    new CopyWebpackPlugin(['index.html'])\n  ],\n};\n"
  },
  {
    "path": "tokenizers/rust-toolchain",
    "content": "stable\n"
  },
  {
    "path": "tokenizers/src/decoders/bpe.rs",
    "content": "use crate::tokenizer::{Decoder, Result};\n\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize, Clone, Debug, Serialize)]\n/// Allows decoding Original BPE by joining all the tokens and then replacing\n/// the suffix used to identify end-of-words by whitespaces\n#[serde(tag = \"type\")]\n#[non_exhaustive]\npub struct BPEDecoder {\n    pub suffix: String,\n}\n\nimpl BPEDecoder {\n    pub fn new(suffix: String) -> Self {\n        Self { suffix }\n    }\n}\n\nimpl Default for BPEDecoder {\n    fn default() -> Self {\n        Self::new(\"</w>\".into())\n    }\n}\n\nimpl Decoder for BPEDecoder {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        let n = tokens.len() - 1;\n        Ok(tokens\n            .into_iter()\n            .enumerate()\n            .map(|(i, token)| {\n                let replacement = if i == n { \"\" } else { \" \" };\n                token.replace(&self.suffix, replacement)\n            })\n            .collect())\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/byte_fallback.rs",
    "content": "use crate::tokenizer::{Decoder, Result};\nuse monostate::MustBe;\n\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize, Clone, Debug, Serialize, Default)]\n/// ByteFallback is a simple trick which converts tokens looking like `<0x61>`\n/// to pure bytes, and attempts to make them into a string. If the tokens\n/// cannot be decoded you will get � instead for each inconvertible byte token\n#[non_exhaustive]\npub struct ByteFallback {\n    #[serde(rename = \"type\")]\n    type_: MustBe!(\"ByteFallback\"),\n}\n\nimpl ByteFallback {\n    pub fn new() -> Self {\n        Self {\n            type_: MustBe!(\"ByteFallback\"),\n        }\n    }\n}\n\nimpl Decoder for ByteFallback {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        let mut new_tokens: Vec<String> = vec![];\n        let mut previous_byte_tokens: Vec<u8> = vec![];\n\n        for token in tokens {\n            let bytes = if token.len() == 6 && token.starts_with(\"<0x\") && token.ends_with('>') {\n                u8::from_str_radix(&token[3..5], 16).ok()\n            } else {\n                None\n            };\n            if let Some(bytes) = bytes {\n                previous_byte_tokens.push(bytes);\n            } else {\n                if !previous_byte_tokens.is_empty() {\n                    if let Ok(string) = String::from_utf8(previous_byte_tokens.clone()) {\n                        new_tokens.push(string);\n                    } else {\n                        for _ in 0..previous_byte_tokens.len() {\n                            new_tokens.push(\"�\".into());\n                        }\n                    }\n                    previous_byte_tokens.clear();\n                }\n                new_tokens.push(token);\n            }\n        }\n        if !previous_byte_tokens.is_empty() {\n            if let Ok(string) = String::from_utf8(previous_byte_tokens.clone()) {\n                new_tokens.push(string);\n            } else {\n                for _ in 0..previous_byte_tokens.len() {\n                    new_tokens.push(\"�\".into());\n                }\n            }\n        }\n\n        Ok(new_tokens)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn decode() {\n        let decoder = ByteFallback::new();\n        let res = decoder\n            .decode_chain(vec![\"Hey\".into(), \"friend!\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"Hey\", \"friend!\"]);\n\n        let res = decoder.decode_chain(vec![\"<0x61>\".into()]).unwrap();\n        assert_eq!(res, vec![\"a\"]);\n\n        let res = decoder.decode_chain(vec![\"<0xE5>\".into()]).unwrap();\n        assert_eq!(res, vec![\"�\"]);\n\n        let res = decoder\n            .decode_chain(vec![\"<0xE5>\".into(), \"<0x8f>\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"�\", \"�\"]);\n\n        // 叫\n        let res = decoder\n            .decode_chain(vec![\"<0xE5>\".into(), \"<0x8f>\".into(), \"<0xab>\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"叫\"]);\n\n        let res = decoder\n            .decode_chain(vec![\n                \"<0xE5>\".into(),\n                \"<0x8f>\".into(),\n                \"<0xab>\".into(),\n                \"a\".into(),\n            ])\n            .unwrap();\n        assert_eq!(res, vec![\"叫\", \"a\"]);\n\n        let res = decoder\n            .decode_chain(vec![\"<0xE5>\".into(), \"<0x8f>\".into(), \"a\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"�\", \"�\", \"a\"]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/ctc.rs",
    "content": "use crate::decoders::wordpiece;\nuse crate::tokenizer::{Decoder, Result};\n\nuse itertools::Itertools;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\n/// The CTC (Connectionist Temporal Classification) decoder takes care\n/// of sanitizing a list of inputs token.\n/// Due to some alignment problem the output of some models can come\n/// with duplicated token.\n#[serde(tag = \"type\")]\n#[non_exhaustive]\npub struct CTC {\n    /// The pad token used by CTC to delimit a new token.\n    pub pad_token: String,\n    /// The word delimiter token. It will be replaced by a `<space>`.\n    pub word_delimiter_token: String,\n    /// Whether to cleanup some tokenization artifacts.\n    /// Mainly spaces before punctuation, and some abbreviated english forms.\n    pub cleanup: bool,\n}\n\nimpl CTC {\n    pub fn new(pad_token: String, word_delimiter_token: String, cleanup: bool) -> Self {\n        Self {\n            pad_token,\n            word_delimiter_token,\n            cleanup,\n        }\n    }\n}\n\nimpl Default for CTC {\n    fn default() -> Self {\n        Self {\n            pad_token: \"<pad>\".to_string(),\n            word_delimiter_token: \"|\".to_string(),\n            cleanup: true,\n        }\n    }\n}\n\nimpl Decoder for CTC {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        Ok(tokens\n            .into_iter()\n            .dedup()\n            .filter_map(|token| {\n                let mut replaced = token.replace(&self.pad_token, \"\");\n                if self.cleanup {\n                    replaced =\n                        wordpiece::cleanup(&replaced).replace(&self.word_delimiter_token, \" \");\n                }\n                if replaced.is_empty() {\n                    None\n                } else {\n                    Some(replaced)\n                }\n            })\n            .collect())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[test]\n    fn handmade_sample() {\n        let ctc_decoder = CTC::default();\n        let id_to_string_result = \"<pad> <pad> h e e l l <pad> l o o o <pad>\"\n            .split(' ')\n            .map(|s| s.to_string())\n            .collect();\n        assert_eq!(\n            ctc_decoder.decode_chain(id_to_string_result).unwrap(),\n            vec![\"h\", \"e\", \"l\", \"l\", \"o\"]\n        );\n    }\n    #[test]\n    fn handmade_with_delimiter_sample() {\n        let ctc_decoder = CTC::default();\n        let id_to_string_result = \"<pad> <pad> h e e l l <pad> l o o o <pad> <pad> | <pad> w o o o r <pad> <pad> l l d <pad> <pad> <pad> <pad>\"\n            .split(' ')\n            .map(|s| s.to_string())\n            .collect();\n        assert_eq!(\n            ctc_decoder.decode_chain(id_to_string_result).unwrap(),\n            vec![\"h\", \"e\", \"l\", \"l\", \"o\", \" \", \"w\", \"o\", \"r\", \"l\", \"d\"]\n        );\n    }\n    #[test]\n    fn librispeech_sample() {\n        let ctc_decoder = CTC::default();\n        let id_to_string_result = \"<pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> A | | <pad> M <pad> <pad> <pad> <pad> A <pad> <pad> N <pad> <pad> <pad> | | | <pad> <pad> <pad> <pad> S <pad> <pad> <pad> A I <pad> D D | | T T <pad> O <pad> | | T H E E | | | <pad> U U <pad> N N <pad> I <pad> <pad> V <pad> <pad> <pad> E R R <pad> <pad> <pad> S E E | | <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> S S <pad> <pad> <pad> <pad> I <pad> R R <pad> <pad> | | | <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> I <pad> <pad> <pad> | <pad> <pad> <pad> E X <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> I <pad> S <pad> <pad> T <pad> <pad> | | <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad>\".split(' ').map(|s| s.to_string()).collect();\n        assert_eq!(\n            ctc_decoder.decode_chain(id_to_string_result).unwrap(),\n            vec![\n                \"A\", \" \", \"M\", \"A\", \"N\", \" \", \"S\", \"A\", \"I\", \"D\", \" \", \"T\", \"O\", \" \", \"T\", \"H\",\n                \"E\", \" \", \"U\", \"N\", \"I\", \"V\", \"E\", \"R\", \"S\", \"E\", \" \", \"S\", \"I\", \"R\", \" \", \"I\",\n                \" \", \"E\", \"X\", \"I\", \"S\", \"T\", \" \"\n            ]\n        );\n    }\n    #[test]\n    fn another_librispeech_sample() {\n        let ctc_decoder = CTC::default();\n        let id_to_string_result = \"<pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> H <pad> I <pad> S S | | <pad> <pad> <pad> I N <pad> <pad> S <pad> T T <pad> <pad> A N C C T <pad> | | | | | <pad> <pad> <pad> <pad> P <pad> <pad> <pad> <pad> A <pad> <pad> N N N <pad> <pad> I <pad> C <pad> <pad> | | <pad> W <pad> <pad> A S <pad> | | <pad> <pad> <pad> F <pad> <pad> O L <pad> <pad> L L O O W E E D | | <pad> B <pad> <pad> <pad> Y <pad> | | | A | | <pad> S S S <pad> M M <pad> <pad> <pad> A L L <pad> <pad> <pad> <pad> L <pad> | | | <pad> <pad> <pad> <pad> S H H <pad> <pad> <pad> <pad> A R R <pad> <pad> P <pad> <pad> | <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> B <pad> <pad> L L <pad> <pad> <pad> <pad> <pad> O W W <pad> <pad> | | | <pad> <pad> <pad> <pad> <pad> <pad> <pad> H <pad> <pad> <pad> <pad> <pad> <pad> <pad> I G H H | | <pad> <pad> O N <pad> | | H <pad> I S S | | <pad> <pad> C H H <pad> <pad> <pad> E <pad> S S <pad> T T <pad> <pad> | | | <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad> <pad>\".split(' ').map(|s| s.to_string()).collect();\n        assert_eq!(\n            ctc_decoder.decode_chain(id_to_string_result).unwrap(),\n            vec![\n                \"H\", \"I\", \"S\", \" \", \"I\", \"N\", \"S\", \"T\", \"A\", \"N\", \"C\", \"T\", \" \", \"P\", \"A\", \"N\",\n                \"I\", \"C\", \" \", \"W\", \"A\", \"S\", \" \", \"F\", \"O\", \"L\", \"L\", \"O\", \"W\", \"E\", \"D\", \" \",\n                \"B\", \"Y\", \" \", \"A\", \" \", \"S\", \"M\", \"A\", \"L\", \"L\", \" \", \"S\", \"H\", \"A\", \"R\", \"P\",\n                \" \", \"B\", \"L\", \"O\", \"W\", \" \", \"H\", \"I\", \"G\", \"H\", \" \", \"O\", \"N\", \" \", \"H\", \"I\",\n                \"S\", \" \", \"C\", \"H\", \"E\", \"S\", \"T\", \" \"\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/fuse.rs",
    "content": "use crate::tokenizer::{Decoder, Result};\nuse monostate::MustBe;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug, Serialize, Deserialize, Default)]\n/// Fuse simply fuses all tokens into one big string.\n/// It's usually the last decoding step anyway, but this\n/// decoder exists incase some decoders need to happen after that\n/// step\n#[non_exhaustive]\npub struct Fuse {\n    #[serde(rename = \"type\")]\n    type_: MustBe!(\"Fuse\"),\n}\n\nimpl Fuse {\n    pub fn new() -> Self {\n        Self {\n            type_: MustBe!(\"Fuse\"),\n        }\n    }\n}\n\nimpl Decoder for Fuse {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        let new_string = tokens.join(\"\");\n        Ok(vec![new_string])\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn decode() {\n        let decoder = Fuse::new();\n        let res = decoder\n            .decode_chain(vec![\"Hey\".into(), \" friend!\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"Hey friend!\"]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/mod.rs",
    "content": "pub mod bpe;\npub mod byte_fallback;\npub mod ctc;\npub mod fuse;\npub mod sequence;\npub mod strip;\npub mod wordpiece;\n\n// Re-export these as decoders\npub use super::pre_tokenizers::byte_level;\npub use super::pre_tokenizers::metaspace;\n\nuse serde::{Deserialize, Deserializer, Serialize};\n\nuse crate::decoders::bpe::BPEDecoder;\nuse crate::decoders::byte_fallback::ByteFallback;\nuse crate::decoders::ctc::CTC;\nuse crate::decoders::fuse::Fuse;\nuse crate::decoders::sequence::Sequence;\nuse crate::decoders::strip::Strip;\nuse crate::decoders::wordpiece::WordPiece;\nuse crate::normalizers::replace::Replace;\nuse crate::pre_tokenizers::byte_level::ByteLevel;\nuse crate::pre_tokenizers::metaspace::Metaspace;\nuse crate::{Decoder, Result};\n\n#[derive(Serialize, Clone, Debug)]\n#[serde(untagged)]\npub enum DecoderWrapper {\n    BPE(BPEDecoder),\n    ByteLevel(ByteLevel),\n    WordPiece(WordPiece),\n    Metaspace(Metaspace),\n    CTC(CTC),\n    Sequence(Sequence),\n    Replace(Replace),\n    Fuse(Fuse),\n    Strip(Strip),\n    ByteFallback(ByteFallback),\n}\n\nimpl<'de> Deserialize<'de> for DecoderWrapper {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        pub struct Tagged {\n            #[serde(rename = \"type\")]\n            variant: EnumType,\n            #[serde(flatten)]\n            rest: serde_json::Value,\n        }\n        #[derive(Serialize, Deserialize)]\n        pub enum EnumType {\n            BPEDecoder,\n            ByteLevel,\n            WordPiece,\n            Metaspace,\n            CTC,\n            Sequence,\n            Replace,\n            Fuse,\n            Strip,\n            ByteFallback,\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum DecoderHelper {\n            Tagged(Tagged),\n            Legacy(serde_json::Value),\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum DecoderUntagged {\n            BPE(BPEDecoder),\n            ByteLevel(ByteLevel),\n            WordPiece(WordPiece),\n            Metaspace(Metaspace),\n            CTC(CTC),\n            Sequence(Sequence),\n            Replace(Replace),\n            Fuse(Fuse),\n            Strip(Strip),\n            ByteFallback(ByteFallback),\n        }\n\n        let helper = DecoderHelper::deserialize(deserializer).expect(\"Helper\");\n        Ok(match helper {\n            DecoderHelper::Tagged(model) => {\n                let mut values: serde_json::Map<String, serde_json::Value> =\n                    serde_json::from_value(model.rest).map_err(serde::de::Error::custom)?;\n                values.insert(\n                    \"type\".to_string(),\n                    serde_json::to_value(&model.variant).map_err(serde::de::Error::custom)?,\n                );\n                let values = serde_json::Value::Object(values);\n                match model.variant {\n                    EnumType::BPEDecoder => DecoderWrapper::BPE(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::ByteLevel => DecoderWrapper::ByteLevel(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::WordPiece => DecoderWrapper::WordPiece(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Metaspace => DecoderWrapper::Metaspace(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::CTC => DecoderWrapper::CTC(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Sequence => DecoderWrapper::Sequence(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Replace => DecoderWrapper::Replace(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Fuse => DecoderWrapper::Fuse(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Strip => DecoderWrapper::Strip(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::ByteFallback => DecoderWrapper::ByteFallback(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                }\n            }\n            DecoderHelper::Legacy(value) => {\n                let untagged = serde_json::from_value(value).map_err(serde::de::Error::custom)?;\n                match untagged {\n                    DecoderUntagged::BPE(dec) => DecoderWrapper::BPE(dec),\n                    DecoderUntagged::ByteLevel(dec) => DecoderWrapper::ByteLevel(dec),\n                    DecoderUntagged::WordPiece(dec) => DecoderWrapper::WordPiece(dec),\n                    DecoderUntagged::Metaspace(dec) => DecoderWrapper::Metaspace(dec),\n                    DecoderUntagged::CTC(dec) => DecoderWrapper::CTC(dec),\n                    DecoderUntagged::Sequence(dec) => DecoderWrapper::Sequence(dec),\n                    DecoderUntagged::Replace(dec) => DecoderWrapper::Replace(dec),\n                    DecoderUntagged::Fuse(dec) => DecoderWrapper::Fuse(dec),\n                    DecoderUntagged::Strip(dec) => DecoderWrapper::Strip(dec),\n                    DecoderUntagged::ByteFallback(dec) => DecoderWrapper::ByteFallback(dec),\n                }\n            }\n        })\n    }\n}\n\nimpl Decoder for DecoderWrapper {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        match self {\n            Self::BPE(bpe) => bpe.decode_chain(tokens),\n            Self::ByteLevel(bl) => bl.decode_chain(tokens),\n            Self::Metaspace(ms) => ms.decode_chain(tokens),\n            Self::WordPiece(wp) => wp.decode_chain(tokens),\n            Self::CTC(ctc) => ctc.decode_chain(tokens),\n            Self::Sequence(seq) => seq.decode_chain(tokens),\n            Self::Replace(seq) => seq.decode_chain(tokens),\n            Self::ByteFallback(bf) => bf.decode_chain(tokens),\n            Self::Strip(bf) => bf.decode_chain(tokens),\n            Self::Fuse(bf) => bf.decode_chain(tokens),\n        }\n    }\n}\n\nimpl_enum_from!(BPEDecoder, DecoderWrapper, BPE);\nimpl_enum_from!(ByteLevel, DecoderWrapper, ByteLevel);\nimpl_enum_from!(ByteFallback, DecoderWrapper, ByteFallback);\nimpl_enum_from!(Fuse, DecoderWrapper, Fuse);\nimpl_enum_from!(Strip, DecoderWrapper, Strip);\nimpl_enum_from!(Metaspace, DecoderWrapper, Metaspace);\nimpl_enum_from!(WordPiece, DecoderWrapper, WordPiece);\nimpl_enum_from!(CTC, DecoderWrapper, CTC);\nimpl_enum_from!(Sequence, DecoderWrapper, Sequence);\nimpl_enum_from!(Replace, DecoderWrapper, Replace);\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn decoder_serialization() {\n        let oldjson = r#\"{\"type\":\"Sequence\",\"decoders\":[{\"type\":\"ByteFallback\"},{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"add_prefix_space\":true,\"prepend_scheme\":\"always\"}]}\"#;\n        let olddecoder: DecoderWrapper = serde_json::from_str(oldjson).unwrap();\n        let oldserialized = serde_json::to_string(&olddecoder).unwrap();\n        let json = r#\"{\"type\":\"Sequence\",\"decoders\":[{\"type\":\"ByteFallback\"},{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"prepend_scheme\":\"always\",\"split\":true}]}\"#;\n        assert_eq!(oldserialized, json);\n\n        let decoder: DecoderWrapper = serde_json::from_str(json).unwrap();\n        let serialized = serde_json::to_string(&decoder).unwrap();\n        assert_eq!(serialized, json);\n    }\n    #[test]\n    fn decoder_serialization_other_no_arg() {\n        let json = r#\"{\"type\":\"Sequence\",\"decoders\":[{\"type\":\"Fuse\"},{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"prepend_scheme\":\"always\",\"split\":true}]}\"#;\n        let decoder: DecoderWrapper = serde_json::from_str(json).unwrap();\n        let serialized = serde_json::to_string(&decoder).unwrap();\n        assert_eq!(serialized, json);\n    }\n\n    #[test]\n    fn decoder_serialization_no_decode() {\n        let json = r#\"{\"type\":\"Sequence\",\"decoders\":[{},{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"prepend_scheme\":\"always\"}]}\"#;\n        let parse = serde_json::from_str::<DecoderWrapper>(json);\n        match parse {\n            Err(err) => assert_eq!(\n                format!(\"{err}\"),\n                \"data did not match any variant of untagged enum DecoderUntagged\"\n            ),\n            _ => panic!(\"Expected error\"),\n        }\n\n        let json = r#\"{\"replacement\":\"▁\",\"prepend_scheme\":\"always\"}\"#;\n        let parse = serde_json::from_str::<DecoderWrapper>(json);\n        match parse {\n            Err(err) => assert_eq!(\n                format!(\"{err}\"),\n                \"data did not match any variant of untagged enum DecoderUntagged\"\n            ),\n            _ => panic!(\"Expected error\"),\n        }\n\n        let json = r#\"{\"type\":\"Sequence\",\"prepend_scheme\":\"always\"}\"#;\n        let parse = serde_json::from_str::<DecoderWrapper>(json);\n        match parse {\n            Err(err) => assert_eq!(format!(\"{err}\"), \"missing field `decoders`\"),\n            _ => panic!(\"Expected error\"),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/sequence.rs",
    "content": "use crate::decoders::DecoderWrapper;\nuse crate::tokenizer::{Decoder, Result};\nuse crate::utils::macro_rules_attribute;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Sequence {\n    decoders: Vec<DecoderWrapper>,\n}\n\nimpl Sequence {\n    pub fn new(decoders: Vec<DecoderWrapper>) -> Self {\n        Self { decoders }\n    }\n\n    pub fn get_decoders(&self) -> &[DecoderWrapper] {\n        &self.decoders\n    }\n\n    pub fn get_decoders_mut(&mut self) -> &mut [DecoderWrapper] {\n        &mut self.decoders\n    }\n}\n\nimpl Decoder for Sequence {\n    fn decode_chain(&self, mut tokens: Vec<String>) -> Result<Vec<String>> {\n        for decoder in &self.decoders {\n            tokens = decoder.decode_chain(tokens)?;\n        }\n        Ok(tokens)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::decoders::ctc::CTC;\n    use crate::pre_tokenizers::metaspace::Metaspace;\n\n    #[test]\n    fn sequence_basic() {\n        let decoders = vec![\n            DecoderWrapper::CTC(CTC::default()),\n            DecoderWrapper::Metaspace(Metaspace::default()),\n        ];\n        let decoder = Sequence::new(decoders);\n        let tokens: Vec<String> = vec![\"▁\", \"▁\", \"H\", \"H\", \"i\", \"i\", \"▁\", \"y\", \"o\", \"u\"]\n            .into_iter()\n            .map(|s| s.to_string())\n            .collect();\n        let out_tokens = decoder.decode(tokens).unwrap();\n        assert_eq!(out_tokens, \"Hi you\");\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/strip.rs",
    "content": "use crate::tokenizer::{Decoder, Result};\n\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize, Clone, Debug, Serialize, Default)]\n/// Strip is a simple trick which converts tokens looking like `<0x61>`\n/// to pure bytes, and attempts to make them into a string. If the tokens\n/// cannot be decoded you will get � instead for each inconvertible byte token\n#[serde(tag = \"type\")]\n#[non_exhaustive]\npub struct Strip {\n    pub content: char,\n    pub start: usize,\n    pub stop: usize,\n}\n\nimpl Strip {\n    pub fn new(content: char, start: usize, stop: usize) -> Self {\n        Self {\n            content,\n            start,\n            stop,\n        }\n    }\n}\n\nimpl Decoder for Strip {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        Ok(tokens\n            .into_iter()\n            .map(|token| {\n                let chars: Vec<char> = token.chars().collect();\n\n                let mut start_cut = 0;\n                for (i, &c) in chars.iter().enumerate().take(self.start) {\n                    if c == self.content {\n                        start_cut = i + 1;\n                        continue;\n                    } else {\n                        break;\n                    }\n                }\n\n                let mut stop_cut = chars.len();\n                for i in 0..self.stop {\n                    let index = chars.len() - i - 1;\n                    if chars[index] == self.content {\n                        stop_cut = index;\n                        continue;\n                    } else {\n                        break;\n                    }\n                }\n\n                let new_token: String = chars[start_cut..stop_cut].iter().collect();\n                new_token\n            })\n            .collect())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn decode() {\n        let decoder = Strip::new('H', 1, 0);\n        let res = decoder\n            .decode_chain(vec![\"Hey\".into(), \" friend!\".into(), \"HHH\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"ey\", \" friend!\", \"HH\"]);\n\n        let decoder = Strip::new('y', 0, 1);\n        let res = decoder\n            .decode_chain(vec![\"Hey\".into(), \" friend!\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"He\", \" friend!\"]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/decoders/wordpiece.rs",
    "content": "use crate::tokenizer::{Decoder, Result};\n\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize, Clone, Debug, Serialize)]\n/// The WordPiece decoder takes care of decoding a list of wordpiece tokens\n/// back into a readable string.\n#[serde(tag = \"type\")]\n#[non_exhaustive]\npub struct WordPiece {\n    /// The prefix to be used for continuing subwords\n    pub prefix: String,\n    /// Whether to cleanup some tokenization artifacts (spaces before punctuation, ...)\n    pub cleanup: bool,\n}\n\nimpl WordPiece {\n    pub fn new(prefix: String, cleanup: bool) -> Self {\n        Self { prefix, cleanup }\n    }\n}\n\nimpl Default for WordPiece {\n    fn default() -> Self {\n        Self {\n            prefix: \"##\".to_owned(),\n            cleanup: true,\n        }\n    }\n}\npub fn cleanup(dirty_input: &str) -> String {\n    dirty_input\n        .replace(\" .\", \".\")\n        .replace(\" ?\", \"?\")\n        .replace(\" !\", \"!\")\n        .replace(\" ,\", \",\")\n        .replace(\" ' \", \"'\")\n        .replace(\" n't\", \"n't\")\n        .replace(\" 'm\", \"'m\")\n        .replace(\" do not\", \" don't\")\n        .replace(\" 's\", \"'s\")\n        .replace(\" 've\", \"'ve\")\n        .replace(\" 're\", \"'re\")\n}\n\nimpl Decoder for WordPiece {\n    fn decode_chain(&self, mut tokens: Vec<String>) -> Result<Vec<String>> {\n        for (i, token) in tokens.iter_mut().enumerate() {\n            if i != 0 {\n                if let Some(tk) = token.strip_prefix(&self.prefix) {\n                    *token = tk.to_string();\n                } else {\n                    *token = format!(\" {token}\");\n                }\n            }\n            if self.cleanup {\n                *token = cleanup(token);\n            }\n        }\n        Ok(tokens)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn wordpiece_decoder() {\n        let decoder = WordPiece::new(\"##\".to_string(), false);\n\n        assert_eq!(\n            decoder\n                .decode(vec![\n                    \"##uelo\".to_string(),\n                    \"Ara\".to_string(),\n                    \"##új\".to_string(),\n                    \"##o\".to_string(),\n                    \"No\".to_string(),\n                    \"##guera\".to_string()\n                ])\n                .unwrap(),\n            \"##uelo Araújo Noguera\"\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/lib.rs",
    "content": "#![cfg_attr(docsrs, feature(doc_cfg))]\n#![warn(clippy::all)]\n#![allow(clippy::upper_case_acronyms)]\n#![doc(html_favicon_url = \"https://huggingface.co/favicon.ico\")]\n#![doc(html_logo_url = \"https://huggingface.co/landing/assets/huggingface_logo.svg\")]\n\n//! The core of `tokenizers`, written in Rust.\n//! Provides an implementation of today's most used tokenizers, with a focus on performance and\n//! versatility.\n//!\n//! # What is a Tokenizer\n//!\n//! A Tokenizer works as a pipeline, it processes some raw text as input and outputs an `Encoding`.\n//! The various steps of the pipeline are:\n//!\n//! 1. The `Normalizer`: in charge of normalizing the text. Common examples of normalization are\n//!    the [unicode normalization standards](https://unicode.org/reports/tr15/#Norm_Forms), such as `NFD` or `NFKC`.\n//!    More details about how to use the `Normalizers` are available on the\n//!    [Hugging Face blog](https://huggingface.co/docs/tokenizers/components#normalizers)\n//! 2. The `PreTokenizer`: in charge of creating initial words splits in the text. The most common way of\n//!    splitting text is simply on whitespace.\n//! 3. The `Model`: in charge of doing the actual tokenization. An example of a `Model` would be\n//!    `BPE` or `WordPiece`.\n//! 4. The `PostProcessor`: in charge of post-processing the `Encoding` to add anything relevant\n//!    that, for example, a language model would need, such as special tokens.\n//!\n//! ## Loading a pretrained tokenizer from the Hub\n//! ```\n//! use tokenizers::tokenizer::{Result, Tokenizer};\n//!\n//! fn main() -> Result<()> {\n//!     # #[cfg(feature = \"http\")]\n//!     # {\n//!     // needs http feature enabled\n//!     let tokenizer = Tokenizer::from_pretrained(\"bert-base-cased\", None)?;\n//!\n//!     let encoding = tokenizer.encode(\"Hey there!\", false)?;\n//!     println!(\"{:?}\", encoding.get_tokens());\n//!     # }\n//!     Ok(())\n//! }\n//! ```\n//!\n//! ## Deserialization and tokenization example\n//!\n//! ```no_run\n//! use tokenizers::tokenizer::{Result, Tokenizer, EncodeInput};\n//! use tokenizers::models::bpe::BPE;\n//!\n//! fn main() -> Result<()> {\n//!     let bpe_builder = BPE::from_file(\"./path/to/vocab.json\", \"./path/to/merges.txt\");\n//!     let bpe = bpe_builder\n//!         .dropout(0.1)\n//!         .unk_token(\"[UNK]\".into())\n//!         .build()?;\n//!\n//!     let mut tokenizer = Tokenizer::new(bpe);\n//!\n//!     let encoding = tokenizer.encode(\"Hey there!\", false)?;\n//!     println!(\"{:?}\", encoding.get_tokens());\n//!\n//!     Ok(())\n//! }\n//! ```\n//!\n//! ## Training and serialization example\n//!\n//! ```no_run\n//! use tokenizers::decoders::DecoderWrapper;\n//! use tokenizers::models::bpe::{BpeTrainerBuilder, BPE};\n//! use tokenizers::normalizers::{strip::Strip, unicode::NFC, utils::Sequence, NormalizerWrapper};\n//! use tokenizers::pre_tokenizers::byte_level::ByteLevel;\n//! use tokenizers::pre_tokenizers::PreTokenizerWrapper;\n//! use tokenizers::processors::PostProcessorWrapper;\n//! use tokenizers::{AddedToken, Model, Result, TokenizerBuilder};\n//!\n//! use std::path::Path;\n//!\n//! fn main() -> Result<()> {\n//!     let vocab_size: usize = 100;\n//!\n//!     let mut trainer = BpeTrainerBuilder::new()\n//!         .show_progress(true)\n//!         .vocab_size(vocab_size)\n//!         .min_frequency(0)\n//!         .special_tokens(vec![\n//!             AddedToken::from(String::from(\"<s>\"), true),\n//!             AddedToken::from(String::from(\"<pad>\"), true),\n//!             AddedToken::from(String::from(\"</s>\"), true),\n//!             AddedToken::from(String::from(\"<unk>\"), true),\n//!             AddedToken::from(String::from(\"<mask>\"), true),\n//!         ])\n//!         .build();\n//!\n//!     let mut tokenizer = TokenizerBuilder::new()\n//!         .with_model(BPE::default())\n//!         .with_normalizer(Some(Sequence::new(vec![\n//!             Strip::new(true, true).into(),\n//!             NFC.into(),\n//!         ])))\n//!         .with_pre_tokenizer(Some(ByteLevel::default()))\n//!         .with_post_processor(Some(ByteLevel::default()))\n//!         .with_decoder(Some(ByteLevel::default()))\n//!         .build()?;\n//!\n//!     let pretty = false;\n//!     tokenizer\n//!         .train_from_files(\n//!             &mut trainer,\n//!             vec![\"path/to/vocab.txt\".to_string()],\n//!         )?\n//!         .save(\"tokenizer.json\", pretty)?;\n//!\n//!     Ok(())\n//! }\n//! ```\n//!\n//! # Additional information\n//!\n//! - tokenizers is designed to leverage CPU parallelism when possible. The level of parallelism is determined\n//!   by the total number of core/threads your CPU provides but this can be tuned by setting the `RAYON_RS_NUM_THREADS`\n//!   environment variable. As an example setting `RAYON_RS_NUM_THREADS=4` will allocate a maximum of 4 threads.\n//!   **_Please note this behavior may evolve in the future_**\n//!\n//! # Features\n//!\n//! - **progressbar**: The progress bar visualization is enabled by default. It might be disabled if\n//!   compilation for certain targets is not supported by the [termios](https://crates.io/crates/termios)\n//!   dependency of the [indicatif](https://crates.io/crates/indicatif) progress bar.\n//!\n//! - **http**: This feature enables downloading the tokenizer via HTTP. It is disabled by default.\n//!   With this feature enabled, `Tokenizer::from_pretrained` becomes accessible.\n\n#[macro_use]\nextern crate log;\n\n#[macro_use]\nextern crate derive_builder;\n\n#[macro_use]\npub mod utils;\npub mod decoders;\npub mod models;\npub mod normalizers;\npub mod pre_tokenizers;\npub mod processors;\npub mod tokenizer;\n\n// Re-export from tokenizer\npub use tokenizer::*;\n\n// Re-export also parallelism utils\npub use utils::parallelism;\n\n// Re-export for from_pretrained\n#[cfg(feature = \"http\")]\npub use utils::from_pretrained::FromPretrainedParameters;\n"
  },
  {
    "path": "tokenizers/src/models/bpe/mod.rs",
    "content": "//! [Byte Pair Encoding](https://www.aclweb.org/anthology/P16-1162/) model.\nuse std::{iter, mem};\n\nmod model;\nmod serialization;\npub mod trainer;\nmod word;\n\ntype Pair = (u32, u32);\n\n/// Errors that can be encountered while using or constructing a `BPE` model.\n#[derive(thiserror::Error, Debug)]\npub enum Error {\n    /// An error encountered while reading files mainly.\n    #[error(\"IoError: {0}\")]\n    Io(#[from] std::io::Error),\n    /// An error forwarded from Serde, while parsing JSON\n    #[error(\"JsonError: {0}\")]\n    JsonError(#[from] serde_json::Error),\n    /// When the vocab.json file is in the wrong format\n    #[error(\"Bad vocabulary json file\")]\n    BadVocabulary,\n    /// When the merges.txt file is in the wrong format. This error holds the line\n    /// number of the line that caused the error.\n    #[error(\"Merges text file invalid at line {0}\")]\n    BadMerges(usize),\n    /// If a token found in merges, is not in the vocab\n    #[error(\"Token `{0}` out of vocabulary\")]\n    MergeTokenOutOfVocabulary(String),\n    /// If the provided unk token is out of vocabulary\n    #[error(\"Unk token `{0}` not found in the vocabulary\")]\n    UnkTokenOutOfVocabulary(String),\n    /// Dropout not between 0 and 1.\n    #[error(\"Dropout should be between 0 and 1, inclusive\")]\n    InvalidDropout,\n}\n\n/// Provides access to the `FirstLastIterator` to any Iterator\npub(crate) trait WithFirstLastIterator: Iterator + Sized {\n    fn with_first_and_last(self) -> FirstLastIterator<Self>;\n}\n\nimpl<I> WithFirstLastIterator for I\nwhere\n    I: Iterator,\n{\n    fn with_first_and_last(self) -> FirstLastIterator<Self> {\n        FirstLastIterator {\n            first: true,\n            iter: self.peekable(),\n        }\n    }\n}\n\n/// Provides information about whether an item is the first and/or the last of the iterator\npub(crate) struct FirstLastIterator<I>\nwhere\n    I: Iterator,\n{\n    first: bool,\n    iter: iter::Peekable<I>,\n}\n\nimpl<I> Iterator for FirstLastIterator<I>\nwhere\n    I: Iterator,\n{\n    /// (is_first, is_last, item)\n    type Item = (bool, bool, I::Item);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let first = mem::replace(&mut self.first, false);\n        self.iter\n            .next()\n            .map(|e| (first, self.iter.peek().is_none(), e))\n    }\n}\n\n// Re-export\npub use model::*;\npub use trainer::*;\nuse word::*;\n"
  },
  {
    "path": "tokenizers/src/models/bpe/model.rs",
    "content": "use super::{super::OrderedVocabIter, trainer::BpeTrainer, Error, Pair, Word};\nuse crate::tokenizer::{Model, Result, Token};\nuse crate::utils::cache::{Cache, DEFAULT_CACHE_CAPACITY, MAX_LENGTH};\nuse crate::utils::iter::ResultShunt;\nuse ahash::AHashMap;\nuse serde_json::Value;\nuse std::borrow::Cow;\n\nuse std::collections::HashMap;\nuse std::{\n    fs::File,\n    io::prelude::*,\n    io::{BufRead, BufReader},\n    path::{Path, PathBuf},\n};\n\npub type Vocab = AHashMap<String, u32>;\ntype VocabR = AHashMap<u32, String>;\npub type MergeMap = AHashMap<Pair, (u32, u32)>;\npub type Merges = Vec<(String, String)>;\n\nstruct Config {\n    files: Option<(String, String)>,\n    vocab: Vocab,\n    merges: Merges,\n    cache_capacity: usize,\n    dropout: Option<f32>,\n    unk_token: Option<String>,\n    continuing_subword_prefix: Option<String>,\n    end_of_word_suffix: Option<String>,\n    fuse_unk: bool,\n    byte_fallback: bool,\n    ignore_merges: bool,\n}\n\n/// A `BpeBuilder` can be used to create a `BPE` model with a custom configuration.\npub struct BpeBuilder {\n    config: Config,\n}\n\nimpl Default for BpeBuilder {\n    fn default() -> Self {\n        Self {\n            config: Config {\n                files: None,\n                vocab: AHashMap::new(),\n                merges: vec![],\n                cache_capacity: DEFAULT_CACHE_CAPACITY,\n                dropout: None,\n                unk_token: None,\n                continuing_subword_prefix: None,\n                end_of_word_suffix: None,\n                fuse_unk: false,\n                byte_fallback: false,\n                ignore_merges: false,\n            },\n        }\n    }\n}\n\nimpl BpeBuilder {\n    /// Constructs a new `BpeBuilder`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set the input files.\n    #[must_use]\n    pub fn files(mut self, vocab: String, merges: String) -> Self {\n        self.config.files = Some((vocab, merges));\n        self\n    }\n\n    /// Set the vocab (token -> ID) and merges mappings.\n    #[must_use]\n    pub fn vocab_and_merges<V: Into<AHashMap<String, u32>>>(\n        mut self,\n        vocab: V,\n        merges: Merges,\n    ) -> Self {\n        self.config.vocab = vocab.into();\n        self.config.merges = merges;\n        self\n    }\n\n    /// Set the cache's capacity. Set to 0 if you want to disable caching.\n    #[must_use]\n    pub fn cache_capacity(mut self, capacity: usize) -> Self {\n        self.config.cache_capacity = capacity;\n        self\n    }\n\n    /// Use [dropout](https://arxiv.org/abs/1910.13267) with the model.\n    #[must_use]\n    pub fn dropout(mut self, dropout: f32) -> Self {\n        self.config.dropout = Some(dropout);\n        self\n    }\n\n    /// Set the `UNK` token for the vocab.\n    #[must_use]\n    pub fn unk_token(mut self, unk_token: String) -> Self {\n        self.config.unk_token = Some(unk_token);\n        self\n    }\n\n    /// Set the `continuing_subword_prefix` option.\n    #[must_use]\n    pub fn continuing_subword_prefix(mut self, prefix: String) -> Self {\n        self.config.continuing_subword_prefix = Some(prefix);\n        self\n    }\n\n    /// Set the `end_of_word_suffix` option.\n    #[must_use]\n    pub fn end_of_word_suffix(mut self, prefix: String) -> Self {\n        self.config.end_of_word_suffix = Some(prefix);\n        self\n    }\n\n    /// Set the `fuse_unk` option.\n    #[must_use]\n    pub fn fuse_unk(mut self, fuse_unk: bool) -> Self {\n        self.config.fuse_unk = fuse_unk;\n        self\n    }\n\n    /// Set the `byte_fallback` option.\n    #[must_use]\n    pub fn byte_fallback(mut self, byte_fallback: bool) -> Self {\n        self.config.byte_fallback = byte_fallback;\n        self\n    }\n    /// Set the `ignore_merges` option.\n    #[must_use]\n    pub fn ignore_merges(mut self, ignore_merges: bool) -> Self {\n        self.config.ignore_merges = ignore_merges;\n        self\n    }\n\n    /// Returns a `BPE` model that uses the `BpeBuilder`'s configuration.\n    pub fn build(mut self) -> Result<BPE> {\n        // Validate dropout.\n        if let Some(p) = self.config.dropout {\n            if !(0.0..=1.0).contains(&p) {\n                return Err(Error::InvalidDropout.into());\n            }\n        }\n\n        // Read files if necessary\n        if let Some((vocab, merges)) = self.config.files {\n            let (v, m) = BPE::read_file(&vocab, &merges)?;\n            self.config.vocab = v;\n            self.config.merges = m;\n        }\n\n        let vocab_r = self\n            .config\n            .vocab\n            .iter()\n            .map(|(key, val)| (*val, key.to_owned()))\n            .collect();\n        let cache = match self.config.cache_capacity {\n            0 => None,\n            capacity => Some(Cache::new(capacity)),\n        };\n\n        let vocab = self.config.vocab;\n        let prefix_len = if let Some(prefix) = &self.config.continuing_subword_prefix {\n            prefix.len()\n        } else {\n            0\n        };\n        let merge_map: MergeMap = self\n            .config\n            .merges\n            .into_iter()\n            .enumerate()\n            .map(|(i, (a, b))| -> Result<(Pair, (u32, u32))> {\n                let a_id = vocab\n                    .get(&a)\n                    .ok_or_else(|| Error::MergeTokenOutOfVocabulary(a.to_owned()))?;\n                let b_id = vocab\n                    .get(&b)\n                    .ok_or_else(|| Error::MergeTokenOutOfVocabulary(b.to_owned()))?;\n                let new_token = format!(\"{}{}\", a, &b[prefix_len..]);\n                let new_id = vocab\n                    .get(&new_token)\n                    .ok_or(Error::MergeTokenOutOfVocabulary(new_token))?;\n                Ok(((*a_id, *b_id), (i as u32, *new_id)))\n            })\n            .collect::<Result<MergeMap>>()?;\n\n        // merges.insert(pair, (rank as u32, *new_id));\n\n        Ok(BPE {\n            vocab,\n            vocab_r,\n            merges: merge_map,\n            cache,\n            dropout: self.config.dropout,\n            unk_token: self.config.unk_token,\n            continuing_subword_prefix: self.config.continuing_subword_prefix,\n            end_of_word_suffix: self.config.end_of_word_suffix,\n            fuse_unk: self.config.fuse_unk,\n            byte_fallback: self.config.byte_fallback,\n            ignore_merges: self.config.ignore_merges,\n        })\n    }\n}\n\n/// A [Byte Pair Encoding](https://www.aclweb.org/anthology/P16-1162/) model.\n#[derive(PartialEq)]\npub struct BPE {\n    /// The vocabulary assigns a number to each token.\n    pub(crate) vocab: Vocab,\n    /// Reversed vocabulary, to rebuild sentences.\n    pub(crate) vocab_r: VocabR,\n    /// Contains the mapping between Pairs and their (rank, new_id).\n    pub(crate) merges: MergeMap,\n    /// Contains the cache for optimizing the encoding step.\n    cache: Option<Cache<String, Word>>,\n    /// Dropout probability for merges. 0.0 = no dropout is the default. At 1.0, tokenization will\n    /// perform no merges, so the result will just be characters.\n    pub dropout: Option<f32>,\n    /// The unknown token to be used when we encounter an unknown char\n    pub unk_token: Option<String>,\n    /// An optional prefix to use on any subword that exist only behind another one\n    pub continuing_subword_prefix: Option<String>,\n    /// An optional suffix to characterize and end-of-word subword\n    pub end_of_word_suffix: Option<String>,\n    /// Do multiple unk tokens get fused\n    pub fuse_unk: bool,\n    /// Byte fallback from sentence pieces, instead of UNK, uses `\"<0x00>\"`\n    /// for each byte in the unk token\n    pub byte_fallback: bool,\n    /// Whether or not to direct output words if they are part of the vocab.\n    pub ignore_merges: bool,\n}\n\nimpl std::fmt::Debug for BPE {\n    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        fmt.debug_struct(\"BPE\")\n            .field(\"dropout\", &self.dropout)\n            .field(\"unk_token\", &self.unk_token)\n            .field(\"continuing_subword_prefix\", &self.continuing_subword_prefix)\n            .field(\"end_of_word_suffix\", &self.end_of_word_suffix)\n            .field(\"fuse_unk\", &self.fuse_unk)\n            .field(\"byte_fallback\", &self.byte_fallback)\n            .field(\"vocab\", &self.vocab.len())\n            .field(\"merges\", &self.merges.len())\n            .field(\"ignore_merges\", &self.ignore_merges)\n            .finish()\n    }\n}\n\nimpl Default for BPE {\n    fn default() -> Self {\n        Self::builder().build().unwrap()\n    }\n}\n\nimpl Clone for BPE {\n    // `Clone` can't be derive because it's not implemented for `Cache`.\n    // To keep things simple when we clone, the new BPE will start with a fresh cache.\n    fn clone(&self) -> Self {\n        let fresh_cache = self.cache.as_ref().map(|cache| cache.fresh());\n        Self {\n            vocab: self.vocab.clone(),\n            vocab_r: self.vocab_r.clone(),\n            merges: self.merges.clone(),\n            cache: fresh_cache,\n            dropout: self.dropout,\n            unk_token: self.unk_token.clone(),\n            continuing_subword_prefix: self.continuing_subword_prefix.clone(),\n            end_of_word_suffix: self.end_of_word_suffix.clone(),\n            fuse_unk: self.fuse_unk,\n            byte_fallback: self.byte_fallback,\n            ignore_merges: self.ignore_merges,\n        }\n    }\n}\n\n/// Converts the merges strings (for example from `merges.txt` file) with the format\n/// \"{pair_a} {pair_b}\" into the format expected by the BPE struct\npub(crate) fn convert_merges_to_hashmap<I: Iterator<Item = String>>(\n    iter: I,\n    _vocab: &Vocab,\n) -> Result<Merges> {\n    let mut merges = vec![];\n\n    let lines = iter.filter(|l| !l.starts_with(\"#version\"));\n    for (rank, line) in lines.enumerate() {\n        let parts = line.split(' ').collect::<Vec<_>>();\n        if parts.len() != 2 {\n            return Err(Error::BadMerges(rank + 1).into());\n        }\n\n        merges.push((parts[0].to_string(), parts[1].to_string()));\n    }\n\n    Ok(merges)\n}\n\nimpl BPE {\n    /// Initialize a `BpeBuilder`.\n    pub fn builder() -> BpeBuilder {\n        BpeBuilder::new()\n    }\n\n    /// Create a new BPE model with the given vocab and merges.\n    pub fn new(vocab: Vocab, merges: Merges) -> Self {\n        Self::builder()\n            .vocab_and_merges(vocab, merges)\n            .build()\n            .unwrap()\n    }\n\n    /// Initialize a BpeBuilder model from vocab and merges files\n    pub fn from_file(vocab: &str, merges: &str) -> BpeBuilder {\n        Self::builder().files(vocab.to_owned(), merges.to_owned())\n    }\n\n    /// Read the given files to extract the vocab and merges\n    pub fn read_file(vocab: &str, merges: &str) -> Result<(Vocab, Merges)> {\n        // Read vocab.json\n        let vocab_file = File::open(vocab)?;\n        let mut vocab_file = BufReader::new(vocab_file);\n\n        let mut buffer = String::new();\n        vocab_file.read_to_string(&mut buffer)?;\n        let json: Value = serde_json::from_str(&buffer)?;\n        let mut vocab = AHashMap::new();\n        match json {\n            Value::Object(m) => {\n                for (token, id) in m {\n                    if let Value::Number(id) = id {\n                        let id = id.as_u64().ok_or(Error::BadVocabulary)? as u32;\n                        vocab.insert(token, id);\n                    }\n                }\n            }\n            _ => return Err(Box::new(Error::BadVocabulary)),\n        };\n\n        // Read merges file\n        let merge_file = File::open(merges)?;\n        let merge_file = BufReader::new(merge_file);\n        let merges = ResultShunt::process(merge_file.lines(), |iter| {\n            convert_merges_to_hashmap(iter, &vocab)\n        })??;\n\n        Ok((vocab, merges))\n    }\n\n    /// Reset the cache.\n    pub fn clear_cache(&self) {\n        if let Some(ref cache) = self.cache {\n            cache.clear()\n        }\n    }\n\n    /// Resize the cache\n    pub fn resize_cache(&mut self, capacity: usize) {\n        if let Some(ref mut cache) = self.cache {\n            cache.resize(capacity);\n        }\n    }\n\n    pub fn get_vocab(&self) -> HashMap<String, u32> {\n        self.vocab.clone().into_iter().collect()\n    }\n\n    pub fn get_unk_token(&self) -> &Option<String> {\n        &self.unk_token\n    }\n\n    pub fn get_continuing_subword_prefix(&self) -> &Option<String> {\n        &self.continuing_subword_prefix\n    }\n\n    fn merge_word(&self, w: &str) -> Result<Word> {\n        let mut indices = w.char_indices().map(|(idx, _)| idx).peekable();\n        let mut word = Word::with_capacity(w.len());\n        let mut unk: Option<(u32, usize)> = None;\n        while let Some(i) = indices.next() {\n            let end = indices.peek();\n            let is_first = i == 0;\n            let is_last = end.is_none();\n\n            let mut s = if let Some(e) = end {\n                Cow::Borrowed(&w[i..*e])\n            } else {\n                Cow::Borrowed(&w[i..])\n            };\n            let byte_len = s.len();\n\n            // Add the `continuing_subword_prefix` if relevant\n            if !is_first {\n                if let Some(ref prefix) = self.continuing_subword_prefix {\n                    s = format!(\"{prefix}{s}\").into()\n                }\n            }\n            // Add the `end_of_word_suffix` if relevant\n            if is_last {\n                if let Some(ref suffix) = self.end_of_word_suffix {\n                    s = format!(\"{s}{suffix}\").into()\n                }\n            }\n\n            if let Some(id) = self.vocab.get(s.as_ref()) {\n                if let Some((unk_id, unk_len)) = unk {\n                    word.add(unk_id, unk_len);\n                    unk = None;\n                }\n                word.add(*id, byte_len);\n            } else {\n                if self.byte_fallback {\n                    let tokens: Option<Vec<_>> = s\n                        .bytes()\n                        .map(|b| -> Option<&u32> {\n                            let code = format!(\"<{b:#04X}>\");\n\n                            self.vocab.get(&code)\n                        })\n                        .collect();\n                    if let Some(tokens) = tokens {\n                        for t in tokens {\n                            word.add(*t, 1);\n                        }\n                        continue;\n                    }\n                }\n                if let Some(unk_token) = &self.unk_token {\n                    unk = match (unk, self.fuse_unk) {\n                        (Some((unk_id, unk_len)), true) => {\n                            // Fuse unk\n                            Some((unk_id, unk_len + byte_len))\n                        }\n                        (Some((unk_id, unk_len)), false) => {\n                            // Do not fuse unk, add the previous one\n                            word.add(unk_id, unk_len);\n                            Some((\n                                *self.vocab.get(unk_token).ok_or_else(|| {\n                                    Error::UnkTokenOutOfVocabulary(unk_token.to_owned())\n                                })?,\n                                byte_len,\n                            ))\n                        }\n                        _ => Some((\n                            *self.vocab.get(unk_token).ok_or_else(|| {\n                                Error::UnkTokenOutOfVocabulary(unk_token.to_owned())\n                            })?,\n                            byte_len,\n                        )),\n                    };\n                }\n            }\n        }\n        if let Some((unk_id, unk_len)) = unk {\n            word.add(unk_id, unk_len);\n        }\n\n        word.merge_all(&self.merges, self.dropout);\n\n        Ok(word)\n    }\n\n    fn word_to_tokens<'a>(&'a self, word: &'a Word) -> impl Iterator<Item = Token> + 'a {\n        word.get_chars_iter()\n            .zip(word.get_offsets_iter())\n            .map(move |(id, offsets)| Token::new(id, self.vocab_r[&id].clone(), offsets))\n    }\n\n    fn tokenize_with_cache(&self, sequence: &str) -> Result<Vec<Token>> {\n        if self.ignore_merges {\n            if let Some(id) = self.vocab.get(sequence) {\n                return Ok(vec![Token::new(\n                    *id,\n                    sequence.to_string(),\n                    (0, sequence.len()),\n                )]);\n            }\n        }\n        if let Some(ref hit) = self.cache.as_ref().and_then(|c| c.get(sequence)) {\n            return Ok(self.word_to_tokens(hit).collect());\n        }\n        let word = self.merge_word(sequence)?;\n        let ret = self.word_to_tokens(&word).collect();\n        if let Some(ref cache) = self.cache {\n            if sequence.len() < MAX_LENGTH {\n                cache.set(sequence.to_owned(), word);\n            }\n        }\n        Ok(ret)\n    }\n}\n\nimpl Model for BPE {\n    type Trainer = BpeTrainer;\n\n    fn get_vocab(&self) -> HashMap<String, u32> {\n        self.vocab.clone().into_iter().collect()\n    }\n\n    fn get_vocab_size(&self) -> usize {\n        self.vocab.len()\n    }\n\n    fn tokenize(&self, sequence: &str) -> Result<Vec<Token>> {\n        if sequence.is_empty() {\n            return Ok(vec![]);\n        }\n\n        if self.dropout.is_none() || self.dropout == Some(0.0) {\n            self.tokenize_with_cache(sequence)\n        } else {\n            let word = self.merge_word(sequence)?;\n            Ok(self.word_to_tokens(&word).collect())\n        }\n    }\n\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.vocab.get(token).copied()\n    }\n\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.vocab_r.get(&id).cloned()\n    }\n\n    fn save(&self, folder: &Path, name: Option<&str>) -> Result<Vec<PathBuf>> {\n        let vocab_file_name = match name {\n            Some(name) => format!(\"{name}-vocab.json\"),\n            None => \"vocab.json\".to_string(),\n        };\n\n        // Write vocab.json\n        let vocab_path: PathBuf = [folder, Path::new(vocab_file_name.as_str())]\n            .iter()\n            .collect();\n        let mut vocab_file = File::create(&vocab_path)?;\n        let order_vocab_iter = OrderedVocabIter::new(&self.vocab_r);\n        let serialized = serde_json::to_string(&order_vocab_iter)?;\n        vocab_file.write_all(serialized.as_bytes())?;\n\n        // Write merges.txt\n        let merges_file_name = match name {\n            Some(name) => format!(\"{name}-merges.txt\"),\n            None => \"merges.txt\".to_string(),\n        };\n\n        let merges_path: PathBuf = [folder, Path::new(merges_file_name.as_str())]\n            .iter()\n            .collect();\n        let mut merges_file = File::create(&merges_path)?;\n        let mut merges: Vec<(&Pair, &u32)> = self\n            .merges\n            .iter()\n            .map(|(pair, (rank, _))| (pair, rank))\n            .collect();\n        merges.sort_unstable_by_key(|k| *k.1);\n        merges_file.write_all(b\"#version: 0.2\\n\")?;\n        merges_file.write_all(\n            &merges\n                .into_iter()\n                .flat_map(|(pair, _)| {\n                    format!(\"{} {}\\n\", self.vocab_r[&pair.0], self.vocab_r[&pair.1]).into_bytes()\n                })\n                .collect::<Vec<_>>()[..],\n        )?;\n\n        Ok(vec![vocab_path, merges_path])\n    }\n\n    fn get_trainer(&self) -> BpeTrainer {\n        BpeTrainer::default()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use tempfile::NamedTempFile;\n\n    #[test]\n    fn test_ordered_vocab_iter() {\n        let vocab_r: VocabR = [\n            (0, \"a\".into()),\n            (1, \"b\".into()),\n            (2, \"c\".into()),\n            (3, \"ab\".into()),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let order_vocab_iter = OrderedVocabIter::new(&vocab_r);\n        let serialized = serde_json::to_string(&order_vocab_iter).unwrap();\n        assert_eq!(serialized, \"{\\\"a\\\":0,\\\"b\\\":1,\\\"c\\\":2,\\\"ab\\\":3}\");\n    }\n\n    #[test]\n    fn test_unk_not_fused() {\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"a\".into(), 1), (\"b\".into(), 2)]\n            .iter()\n            .cloned()\n            .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![])\n            .unk_token(\"<unk>\".to_string())\n            .build()\n            .unwrap();\n        let tokens = bpe.tokenize(\"c\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \"<unk>\".into(), (0, 1)),]);\n\n        let tokens = bpe.tokenize(\"cc\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![\n                Token::new(0u32, \"<unk>\".into(), (0, 1)),\n                Token::new(0u32, \"<unk>\".into(), (1, 2)),\n            ]\n        );\n\n        let tokens = bpe.tokenize(\"accb\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![\n                Token::new(1u32, \"a\".into(), (0, 1)),\n                Token::new(0u32, \"<unk>\".into(), (1, 2)),\n                Token::new(0u32, \"<unk>\".into(), (2, 3)),\n                Token::new(2u32, \"b\".into(), (3, 4)),\n            ]\n        );\n    }\n    #[test]\n    fn test_unk_get_fused() {\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"a\".into(), 1), (\"b\".into(), 2)]\n            .iter()\n            .cloned()\n            .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![])\n            .unk_token(\"<unk>\".to_string())\n            .fuse_unk(true)\n            .build()\n            .unwrap();\n        let tokens = bpe.tokenize(\"c\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \"<unk>\".into(), (0, 1)),]);\n\n        let tokens = bpe.tokenize(\"cc\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \"<unk>\".into(), (0, 2)),]);\n\n        let tokens = bpe.tokenize(\"accb\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![\n                Token::new(1u32, \"a\".into(), (0, 1)),\n                Token::new(0u32, \"<unk>\".into(), (1, 3)),\n                Token::new(2u32, \"b\".into(), (3, 4)),\n            ]\n        );\n    }\n\n    #[test]\n    // Test tokenization. With dropout set to 0 tokenization is deterministic,\n    // so we know exactly what the result should be.\n    //\n    // To test this, we'll build a simple model to tokenize the word 'unrelated'.\n    fn test_tokenize_with_and_without_dropout() {\n        let vocab: Vocab = [\n            (\"u\".into(), 0),\n            (\"n\".into(), 1),\n            (\"r\".into(), 2),\n            (\"e\".into(), 3),\n            (\"l\".into(), 4),\n            (\"a\".into(), 5),\n            (\"t\".into(), 6),\n            (\"d\".into(), 7),\n            (\"re\".into(), 8),\n            (\"at\".into(), 9),\n            (\"ed\".into(), 10),\n            (\"un\".into(), 11),\n            (\"ated\".into(), 12),\n            (\"rel\".into(), 13),\n            (\"related\".into(), 14),\n            (\"unrelated\".into(), 15),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let merges: Merges = vec![\n            (\"r\".to_string(), \"e\".to_string()),\n            (\"a\".to_string(), \"t\".to_string()),\n            (\"e\".to_string(), \"d\".to_string()),\n            (\"u\".to_string(), \"n\".to_string()),\n            (\"at\".to_string(), \"ed\".to_string()),\n            (\"re\".to_string(), \"l\".to_string()),\n            (\"rel\".to_string(), \"ated\".to_string()),\n            (\"un\".to_string(), \"related\".to_string()),\n        ];\n        let mut bpe = BPE::new(vocab, merges);\n\n        // With no dropout:\n        let tokens = bpe.tokenize(\"unrelated\").unwrap();\n        assert_eq!(tokens, vec![Token::new(15u32, \"unrelated\".into(), (0, 9))]);\n\n        // With dropout = 0.0 (equivalent to dropout == none)\n        bpe.dropout = Some(0.0);\n        let tokens = bpe.tokenize(\"unrelated\").unwrap();\n        assert_eq!(tokens, vec![Token::new(15u32, \"unrelated\".into(), (0, 9))]);\n\n        // Now set dropout to 1.0. Result should be no merges performed.\n        bpe.dropout = Some(1.0);\n        let tokens = bpe.tokenize(\"unrelated\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![\n                Token::new(0u32, \"u\".into(), (0, 1)),\n                Token::new(1u32, \"n\".into(), (1, 2)),\n                Token::new(2u32, \"r\".into(), (2, 3)),\n                Token::new(3u32, \"e\".into(), (3, 4)),\n                Token::new(4u32, \"l\".into(), (4, 5)),\n                Token::new(5u32, \"a\".into(), (5, 6)),\n                Token::new(6u32, \"t\".into(), (6, 7)),\n                Token::new(3u32, \"e\".into(), (7, 8)),\n                Token::new(7u32, \"d\".into(), (8, 9)),\n            ]\n        );\n\n        // Now try with dropout between 0 and 1.\n        bpe.dropout = Some(0.5);\n        let tokens = bpe.tokenize(\"unrelated\").unwrap();\n        assert!(!tokens.is_empty() && tokens.len() <= 9);\n    }\n\n    #[test]\n    // Ensure `BPE::from_file` works as expected.\n    fn test_bpe_from_file() {\n        // Set up vocab file.\n        let mut vocab_file = NamedTempFile::new().unwrap();\n        vocab_file\n            .write_all(b\"{\\\"a\\\": 0, \\\"b\\\": 1, \\\"c\\\": 2, \\\"ab\\\": 3}\")\n            .unwrap();\n\n        // Set up merges file.\n        let mut merges_file = NamedTempFile::new().unwrap();\n        merges_file.write_all(b\"#version: 0.2\\na b\").unwrap();\n\n        // Make sure we can instantiate a BPE model from the files.\n        let builder = BPE::from_file(\n            vocab_file.path().to_str().unwrap(),\n            merges_file.path().to_str().unwrap(),\n        );\n        let bpe = builder.build().unwrap();\n\n        // Check merges.\n        assert_eq!(bpe.merges.get(&(0, 1)).unwrap(), &(0u32, 3u32));\n\n        // Check vocab.\n        assert_eq!(bpe.vocab.get(\"a\").unwrap(), &0u32);\n        assert_eq!(bpe.vocab.get(\"b\").unwrap(), &1u32);\n        assert_eq!(bpe.vocab.get(\"c\").unwrap(), &2u32);\n        assert_eq!(bpe.vocab.get(\"ab\").unwrap(), &3u32);\n    }\n\n    #[test]\n    // Ensure BPEBuilder with dropout = 0.0 doesn't error\n    fn test_bpe_with_dropout_0() {\n        let bpe = BPE::builder().dropout(0.0).build().unwrap();\n        assert_eq!(bpe.dropout, Some(0.0));\n    }\n\n    #[test]\n    // Ensure `BPE::from_file` works as expected.\n    fn test_bpe_with_continuing_subword_prefix() {\n        let vocab: Vocab = vec![\n            (\"a\".to_string(), 0),\n            (\"##b\".to_string(), 1),\n            (\"##c\".to_string(), 2),\n            (\"ab\".to_string(), 3),\n            (\"abc\".to_string(), 4),\n        ]\n        .into_iter()\n        .collect();\n\n        let merges = vec![\n            (\"a\".to_string(), \"##b\".to_string()),\n            (\"ab\".to_string(), \"##c\".to_string()),\n        ];\n\n        let bpe = BPE::builder()\n            .vocab_and_merges(vocab, merges)\n            .unk_token(\"[UNK]\".to_string())\n            .continuing_subword_prefix(\"##\".to_string())\n            .build()\n            .unwrap();\n\n        let res = bpe.tokenize(\"ab\");\n        assert_eq!(\n            res.unwrap(),\n            vec![Token {\n                id: 3,\n                value: \"ab\".to_string(),\n                offsets: (0, 2)\n            }]\n        );\n        let res = bpe.tokenize(\"abc\");\n        assert_eq!(\n            res.unwrap(),\n            vec![Token {\n                id: 4,\n                value: \"abc\".to_string(),\n                offsets: (0, 3)\n            }]\n        );\n    }\n\n    #[test]\n    // Ensure `MergeTokenOutOfVocabulary` error is returned when it should be.\n    fn test_bpe_from_file_merge_token_oov() {\n        // Set up vocab file.\n        let mut vocab_file = NamedTempFile::new().unwrap();\n        vocab_file\n            .write_all(b\"{\\\"a\\\": 0, \\\"b\\\": 1, \\\"c\\\": 2, \\\"ab\\\": 3}\")\n            .unwrap();\n\n        // Set up merges file.\n        let mut merges_file = NamedTempFile::new().unwrap();\n        merges_file.write_all(b\"#version: 0.2\\na b\\na d\").unwrap();\n\n        // Ensure the result of BPE::from_file is a MergeTokenOutOfVocabulary error.\n        match BPE::from_file(\n            vocab_file.path().to_str().unwrap(),\n            merges_file.path().to_str().unwrap(),\n        )\n        .build()\n        {\n            Ok(_) => unreachable!(),\n            Err(err) => match err.downcast_ref::<Error>() {\n                Some(Error::MergeTokenOutOfVocabulary(token)) => {\n                    assert_eq!(*token, String::from(\"d\"))\n                }\n                _ => unreachable!(),\n            },\n        }\n    }\n\n    #[test]\n    // Ensure `BadMerges` error is returned when there is an invalid line in the\n    // merges.txt file.\n    fn test_bpe_from_file_bad_merges() {\n        // Set up vocab file.\n        let mut vocab_file = NamedTempFile::new().unwrap();\n        vocab_file\n            .write_all(\"{\\\"a\\\": 0, \\\"b\\\": 1, \\\"c\\\": 2, \\\"ab\\\": 3}\".as_bytes())\n            .unwrap();\n\n        // Set up merges file with a bad line.\n        let mut merges_file = NamedTempFile::new().unwrap();\n        merges_file.write_all(b\"#version: 0.2\\na b\\nc\").unwrap();\n\n        // Ensure the result of BPE::from_file is a BadMerges error.\n        match BPE::from_file(\n            vocab_file.path().to_str().unwrap(),\n            merges_file.path().to_str().unwrap(),\n        )\n        .build()\n        {\n            Ok(_) => unreachable!(),\n            Err(err) => match err.downcast_ref::<Error>() {\n                Some(Error::BadMerges(line)) => assert_eq!(*line, 2),\n                _ => unreachable!(),\n            },\n        }\n    }\n\n    #[test]\n    fn test_bpe_byte_fallback() {\n        // 0x61 == 'a' in bytes\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"<0x61>\".into(), 1)]\n            .iter()\n            .cloned()\n            .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![])\n            .unk_token(\"<unk>\".to_string())\n            .byte_fallback(true)\n            .build()\n            .unwrap();\n        let tokens = bpe.tokenize(\"c\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \"<unk>\".into(), (0, 1)),]);\n\n        let tokens = bpe.tokenize(\"a\").unwrap();\n        assert_eq!(tokens, vec![Token::new(1u32, \"<0x61>\".into(), (0, 1)),]);\n    }\n\n    #[test]\n    fn test_bpe_byte_fallback_newline() {\n        // 0x0A == '\\n' in bytes\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"<0x0A>\".into(), 1)]\n            .iter()\n            .cloned()\n            .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![])\n            .unk_token(\"<unk>\".to_string())\n            .byte_fallback(true)\n            .build()\n            .unwrap();\n        let tokens = bpe.tokenize(\"\\n\").unwrap();\n        assert_eq!(tokens, vec![Token::new(1u32, \"<0x0A>\".into(), (0, 1)),]);\n    }\n\n    #[test]\n    fn test_ignore_merges() {\n        // 0x0A == '\\n' in bytes\n        let vocab: Vocab = [\n            (\".:.:\".into(), 0),\n            (\"Ġbelirtilen\".into(), 1),\n            (\".\".into(), 2),\n            (\":\".into(), 3),\n            (\"bel\".into(), 4),\n            (\"irtilen\".into(), 5),\n            (\"Ġ\".into(), 6),\n            (\".:\".into(), 7),\n            (\"belirtilen\".into(), 8),\n            (\".:.\".into(), 9),\n            (\"be\".into(), 10),\n            (\"l\".into(), 11),\n            (\"ir\".into(), 12),\n            (\"ti\".into(), 13),\n            (\"en\".into(), 14),\n            (\"irtil\".into(), 15),\n            (\"irti\".into(), 16),\n            (\"i\".into(), 17),\n            (\"r\".into(), 18),\n            (\"t\".into(), 19),\n            (\"b\".into(), 20),\n            (\"e\".into(), 21),\n            (\"n\".into(), 22),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let mut bpe = BpeBuilder::default()\n            .vocab_and_merges(\n                vocab,\n                vec![\n                    (\".\".into(), \":\".into()),\n                    (\"b\".into(), \"e\".into()),\n                    (\"be\".into(), \"l\".into()),\n                    (\"i\".into(), \"r\".into()),\n                    (\"t\".into(), \"i\".into()),\n                    (\"ir\".into(), \"ti\".into()),\n                    (\"e\".into(), \"n\".into()),\n                    (\"irti\".into(), \"l\".into()),\n                ],\n            )\n            .ignore_merges(true)\n            .build()\n            .unwrap();\n        let tokens = bpe.tokenize(\".:.:\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \".:.:\".into(), (0, 4))]);\n\n        let tokens = bpe.tokenize(\"Ġbelirtilen\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![Token::new(1u32, \"Ġbelirtilen\".into(), (0, 12))]\n        );\n\n        bpe.ignore_merges = false;\n\n        let tokens = bpe.tokenize(\".:.:\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![\n                Token::new(7u32, \".:\".into(), (0, 2)),\n                Token::new(7u32, \".:\".into(), (2, 4))\n            ]\n        );\n\n        let tokens = bpe.tokenize(\"Ġbelirtilen\").unwrap();\n        assert_eq!(\n            tokens,\n            vec![\n                Token {\n                    id: 6,\n                    value: \"Ġ\".into(),\n                    offsets: (0, 2)\n                },\n                Token {\n                    id: 4,\n                    value: \"bel\".into(),\n                    offsets: (2, 5)\n                },\n                Token {\n                    id: 15,\n                    value: \"irtil\".into(),\n                    offsets: (5, 10)\n                },\n                Token {\n                    id: 14,\n                    value: \"en\".into(),\n                    offsets: (10, 12)\n                }\n            ]\n        )\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/bpe/serialization.rs",
    "content": "use super::{super::OrderedVocabIter, convert_merges_to_hashmap, BpeBuilder, Pair, BPE};\nuse ahash::AHashMap;\nuse serde::{\n    de::{Error, MapAccess, Visitor},\n    ser::SerializeStruct,\n    Deserialize, Deserializer, Serialize, Serializer,\n};\n\nimpl Serialize for BPE {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut model = serializer.serialize_struct(\"BPE\", 8)?;\n\n        // Start by small fields\n        model.serialize_field(\"type\", \"BPE\")?;\n        model.serialize_field(\"dropout\", &self.dropout)?;\n        model.serialize_field(\"unk_token\", &self.unk_token)?;\n        model.serialize_field(\"continuing_subword_prefix\", &self.continuing_subword_prefix)?;\n        model.serialize_field(\"end_of_word_suffix\", &self.end_of_word_suffix)?;\n        model.serialize_field(\"fuse_unk\", &self.fuse_unk)?;\n        model.serialize_field(\"byte_fallback\", &self.byte_fallback)?;\n        model.serialize_field(\"ignore_merges\", &self.ignore_merges)?;\n\n        // Then the large ones\n        let mut merges: Vec<(&Pair, &u32)> = self\n            .merges\n            .iter()\n            .map(|(pair, (rank, _))| (pair, rank))\n            .collect();\n        merges.sort_unstable_by_key(|k| *k.1);\n        let merges = merges\n            .into_iter()\n            .map(|(pair, _)| (self.vocab_r[&pair.0].clone(), self.vocab_r[&pair.1].clone()))\n            .collect::<Vec<_>>();\n        let ordered_vocab = OrderedVocabIter::new(&self.vocab_r);\n\n        model.serialize_field(\"vocab\", &ordered_vocab)?;\n        model.serialize_field(\"merges\", &merges)?;\n\n        model.end()\n    }\n}\n\nimpl<'de> Deserialize<'de> for BPE {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_struct(\n            \"BPE\",\n            &[\n                \"type\",\n                \"dropout\",\n                \"unk_token\",\n                \"continuing_subword_prefix\",\n                \"end_of_word_suffix\",\n                \"fuse_unk\",\n                \"byte_fallback\",\n                \"ignore_merges\",\n                \"vocab\",\n                \"merges\",\n            ],\n            BPEVisitor,\n        )\n    }\n}\n\nstruct BPEVisitor;\nimpl<'de> Visitor<'de> for BPEVisitor {\n    type Value = BPE;\n\n    fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(fmt, \"struct BPE\")\n    }\n\n    fn visit_map<V>(self, mut map: V) -> std::result::Result<Self::Value, V::Error>\n    where\n        V: MapAccess<'de>,\n    {\n        let mut builder = BpeBuilder::new();\n        let mut vocab: Option<AHashMap<String, u32>> = None;\n\n        #[derive(Debug, Deserialize)]\n        #[serde(untagged)]\n        enum MergeType {\n            Tuple(Vec<(String, String)>),\n            Legacy(Vec<String>),\n        }\n        let mut merges: Option<MergeType> = None;\n        while let Some(key) = map.next_key::<String>()? {\n            match key.as_ref() {\n                \"dropout\" => {\n                    if let Some(dropout) = map.next_value()? {\n                        builder = builder.dropout(dropout);\n                    }\n                }\n                \"unk_token\" => {\n                    if let Some(unk) = map.next_value()? {\n                        builder = builder.unk_token(unk);\n                    }\n                }\n                \"continuing_subword_prefix\" => {\n                    if let Some(prefix) = map.next_value()? {\n                        builder = builder.continuing_subword_prefix(prefix);\n                    }\n                }\n                \"end_of_word_suffix\" => {\n                    if let Some(suffix) = map.next_value()? {\n                        builder = builder.end_of_word_suffix(suffix);\n                    }\n                }\n                \"fuse_unk\" => {\n                    if let Some(suffix) = map.next_value()? {\n                        builder = builder.fuse_unk(suffix);\n                    }\n                }\n                \"byte_fallback\" => {\n                    if let Some(suffix) = map.next_value()? {\n                        builder = builder.byte_fallback(suffix);\n                    }\n                }\n                \"ignore_merges\" => {\n                    if let Some(suffix) = map.next_value()? {\n                        builder = builder.ignore_merges(suffix);\n                    }\n                }\n                \"vocab\" => vocab = Some(map.next_value()?),\n                \"merges\" => merges = Some(map.next_value()?),\n                \"type\" => match map.next_value()? {\n                    \"BPE\" => {}\n                    u => {\n                        return Err(serde::de::Error::invalid_value(\n                            serde::de::Unexpected::Str(u),\n                            &\"BPE\",\n                        ))\n                    }\n                },\n                _ => {}\n            }\n        }\n        if let (Some(vocab), Some(merges)) = (vocab, merges) {\n            let merges = match merges {\n                MergeType::Tuple(merges) => merges,\n                MergeType::Legacy(merges) => {\n                    convert_merges_to_hashmap(merges.into_iter(), &vocab).map_err(Error::custom)?\n                }\n            };\n            builder = builder.vocab_and_merges(vocab, merges);\n            Ok(builder.build().map_err(Error::custom)?)\n        } else {\n            Err(Error::custom(\"Missing vocab/merges\"))\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::models::bpe::Vocab;\n\n    #[test]\n    fn test_serialization() {\n        let vocab: Vocab = [\n            (\"<unk>\".into(), 0),\n            (\"a\".into(), 1),\n            (\"b\".into(), 2),\n            (\"ab\".into(), 3),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![(\"a\".to_string(), \"b\".to_string())])\n            .unk_token(\"<unk>\".to_string())\n            .ignore_merges(true)\n            .build()\n            .unwrap();\n\n        let legacy = r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2,\"ab\":3},\"merges\":[\"a b\"]}\"#;\n        let legacy = serde_json::from_str(legacy).unwrap();\n        assert_eq!(bpe, legacy);\n\n        let data = serde_json::to_string(&bpe).unwrap();\n        assert_eq!(\n            data,\n            r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2,\"ab\":3},\"merges\":[[\"a\",\"b\"]]}\"#\n        );\n        let reconstructed = serde_json::from_str(&data).unwrap();\n        assert_eq!(bpe, reconstructed);\n\n        // With a space in the token\n        let vocab: Vocab = [\n            (\"<unk>\".into(), 0),\n            (\"a\".into(), 1),\n            (\"b c d\".into(), 2),\n            (\"ab c d\".into(), 3),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![(\"a\".to_string(), \"b c d\".to_string())])\n            .unk_token(\"<unk>\".to_string())\n            .ignore_merges(true)\n            .build()\n            .unwrap();\n        let data = serde_json::to_string(&bpe).unwrap();\n        assert_eq!(\n            data,\n            r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b c d\":2,\"ab c d\":3},\"merges\":[[\"a\",\"b c d\"]]}\"#\n        );\n        let reconstructed = serde_json::from_str(&data).unwrap();\n        assert_eq!(bpe, reconstructed);\n    }\n\n    #[test]\n    fn test_serialization_ignore_merges() {\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"a\".into(), 1), (\"b\".into(), 2)]\n            .iter()\n            .cloned()\n            .collect();\n        let mut bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![])\n            .unk_token(\"<unk>\".to_string())\n            .ignore_merges(true)\n            .build()\n            .unwrap();\n\n        let bpe_string = r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2},\"merges\":[]}\"#;\n        assert_eq!(serde_json::from_str::<BPE>(bpe_string).unwrap(), bpe);\n\n        bpe.ignore_merges = false;\n        let bpe_string = r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2},\"merges\":[]}\"#;\n        assert_eq!(serde_json::from_str::<BPE>(bpe_string).unwrap(), bpe);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/bpe/trainer.rs",
    "content": "#![allow(clippy::map_entry)]\n\nuse super::{Pair, WithFirstLastIterator, Word, BPE};\nuse crate::parallelism::*;\nuse crate::tokenizer::{AddedToken, Result, Trainer};\nuse crate::utils::progress::{ProgressBar, ProgressStyle};\nuse ahash::{AHashMap, AHashSet};\nuse compact_str::CompactString;\nuse dary_heap::OctonaryHeap;\nuse serde::{Deserialize, Serialize};\nuse std::cmp::Ordering;\nuse std::collections::HashSet;\n\n#[derive(Debug, Eq)]\nstruct Merge {\n    pair: Pair,\n    count: u64,\n    pos: AHashSet<usize>,\n}\nimpl PartialEq for Merge {\n    fn eq(&self, other: &Self) -> bool {\n        self.count == other.count && self.pair == other.pair\n    }\n}\nimpl PartialOrd for Merge {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\nimpl Ord for Merge {\n    fn cmp(&self, other: &Self) -> Ordering {\n        if self.count != other.count {\n            self.count.cmp(&other.count)\n        } else {\n            // Here we want ascending order\n            other.pair.cmp(&self.pair)\n        }\n    }\n}\n\nstruct Config {\n    min_frequency: u64,\n    vocab_size: usize,\n    show_progress: bool,\n    special_tokens: Vec<AddedToken>,\n    limit_alphabet: Option<usize>,\n    initial_alphabet: AHashSet<char>,\n    continuing_subword_prefix: Option<String>,\n    end_of_word_suffix: Option<String>,\n    max_token_length: Option<usize>,\n}\n\n/// A `BpeTrainerBuilder` can be used to create a `BpeTrainer` with a custom\n/// configuration.\npub struct BpeTrainerBuilder {\n    config: Config,\n}\n\nimpl Default for BpeTrainerBuilder {\n    fn default() -> Self {\n        Self {\n            config: Config {\n                min_frequency: 0,\n                vocab_size: 30000,\n                show_progress: true,\n                special_tokens: vec![],\n                limit_alphabet: None,\n                initial_alphabet: AHashSet::new(),\n                continuing_subword_prefix: None,\n                end_of_word_suffix: None,\n                max_token_length: None,\n            },\n        }\n    }\n}\n\nimpl BpeTrainerBuilder {\n    /// Constructs a new `BpeTrainerBuilder`\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set the expected minimum frequency\n    #[must_use]\n    pub fn min_frequency(mut self, frequency: u64) -> Self {\n        self.config.min_frequency = frequency;\n        self\n    }\n\n    /// Set the vocabulary size\n    #[must_use]\n    pub fn vocab_size(mut self, size: usize) -> Self {\n        self.config.vocab_size = size;\n        self\n    }\n\n    /// Set whether to show progress\n    #[must_use]\n    pub fn show_progress(mut self, show: bool) -> Self {\n        self.config.show_progress = show;\n        self\n    }\n\n    /// Set the special tokens\n    #[must_use]\n    pub fn special_tokens(mut self, tokens: Vec<AddedToken>) -> Self {\n        self.config.special_tokens = tokens;\n        self\n    }\n\n    /// Set whether to limit the alphabet\n    #[must_use]\n    pub fn limit_alphabet(mut self, limit: usize) -> Self {\n        self.config.limit_alphabet = Some(limit);\n        self\n    }\n\n    /// Set the initial alphabet\n    #[must_use]\n    pub fn initial_alphabet(mut self, alphabet: HashSet<char>) -> Self {\n        let mut initial_alphabet = AHashSet::with_capacity(alphabet.len());\n        initial_alphabet.extend(alphabet);\n        self.config.initial_alphabet = initial_alphabet;\n        self\n    }\n\n    /// Set the continuing_subword_prefix\n    #[must_use]\n    pub fn continuing_subword_prefix(mut self, prefix: String) -> Self {\n        self.config.continuing_subword_prefix = Some(prefix);\n        self\n    }\n\n    /// Set the end_of_word_suffix\n    #[must_use]\n    pub fn end_of_word_suffix(mut self, suffix: String) -> Self {\n        self.config.end_of_word_suffix = Some(suffix);\n        self\n    }\n    /// Set max_token_length\n    #[must_use]\n    pub fn max_token_length(mut self, max_token_length: Option<usize>) -> Self {\n        self.config.max_token_length = max_token_length;\n        self\n    }\n\n    /// Constructs the final BpeTrainer\n    pub fn build(self) -> BpeTrainer {\n        BpeTrainer {\n            min_frequency: self.config.min_frequency,\n            vocab_size: self.config.vocab_size,\n            show_progress: self.config.show_progress,\n            special_tokens: self.config.special_tokens,\n            limit_alphabet: self.config.limit_alphabet,\n            initial_alphabet: self.config.initial_alphabet,\n            continuing_subword_prefix: self.config.continuing_subword_prefix,\n            end_of_word_suffix: self.config.end_of_word_suffix,\n            max_token_length: self.config.max_token_length,\n            words: AHashMap::new(),\n        }\n    }\n}\n\n/// In charge of training a `BPE` model\n///\n/// # Examples\n///\n/// ```\n/// use tokenizers::tokenizer::Trainer;\n/// use tokenizers::models::bpe::{BPE, BpeTrainer};\n///\n/// let sequences = vec![ \"Hello\", \"World\" ];\n///\n/// let mut trainer = BpeTrainer::default();\n/// trainer.feed(sequences.iter(), |s| Ok(vec![s.to_owned()]));\n///\n/// let mut model = BPE::default();\n/// let special_tokens = trainer.train(&mut model).unwrap();\n/// ```\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\npub struct BpeTrainer {\n    /// The minimum frequency a pair must have to produce a merge operation\n    pub min_frequency: u64,\n    /// The target vocabulary size\n    pub vocab_size: usize,\n    /// Whether to show progress while training\n    pub show_progress: bool,\n    /// A list of special tokens that the model should know of\n    pub special_tokens: Vec<AddedToken>,\n    /// Whether to limit the number of initial tokens that can be kept before computing merges\n    pub limit_alphabet: Option<usize>,\n    /// The initial alphabet we want absolutely to include. This allows to cover\n    /// some characters that are not necessarily in the training set\n    pub initial_alphabet: AHashSet<char>,\n    /// An optional prefix to use on any subword that exist only behind another one\n    pub continuing_subword_prefix: Option<String>,\n    /// An optional suffix to characterize and end-of-word subword\n    pub end_of_word_suffix: Option<String>,\n    /// An optional parameter to limit the max length of any single token\n    pub max_token_length: Option<usize>,\n\n    words: AHashMap<CompactString, u64>,\n}\n\nimpl Default for BpeTrainer {\n    fn default() -> Self {\n        Self::builder().build()\n    }\n}\n\nimpl BpeTrainer {\n    pub fn new(min_frequency: u64, vocab_size: usize) -> Self {\n        Self {\n            min_frequency,\n            vocab_size,\n            ..Default::default()\n        }\n    }\n\n    pub fn builder() -> BpeTrainerBuilder {\n        BpeTrainerBuilder::new()\n    }\n\n    /// Setup a progress bar if asked to show progress\n    fn setup_progress(&self) -> Option<ProgressBar> {\n        if self.show_progress {\n            let p = ProgressBar::new(0);\n            p.set_style(\n                ProgressStyle::default_bar()\n                    .template(\"[{elapsed_precise}] {msg:<30!} {wide_bar} {pos:<9!}/{len:>9!}\")\n                    .expect(\"Invalid progress template\"),\n            );\n            Some(p)\n        } else {\n            None\n        }\n    }\n\n    /// Set the progress bar in the finish state\n    fn finalize_progress(&self, p: &Option<ProgressBar>, final_len: usize) {\n        if let Some(p) = p {\n            p.set_length(final_len as u64);\n            p.finish();\n            println!();\n        }\n    }\n\n    /// Update the progress bar with the new provided length and message\n    fn update_progress(&self, p: &Option<ProgressBar>, len: usize, message: &'static str) {\n        if let Some(p) = p {\n            p.set_message(message);\n            p.set_length(len as u64);\n            p.reset();\n        }\n    }\n\n    /// Add the provided special tokens to the initial vocabulary\n    fn add_special_tokens(\n        &self,\n        w2id: &mut AHashMap<CompactString, u32>,\n        id2w: &mut Vec<CompactString>,\n    ) {\n        for token in &self.special_tokens {\n            // get hash of content\n            if !w2id.contains_key(&CompactString::from(&token.content)) {\n                id2w.push(CompactString::from(&token.content));\n                w2id.insert(CompactString::from(&token.content), (id2w.len() - 1) as u32);\n            }\n        }\n    }\n\n    /// Compute the initial alphabet and limit it if relevant\n    fn compute_alphabet(\n        &self,\n        wc: &AHashMap<CompactString, u64>,\n        w2id: &mut AHashMap<CompactString, u32>,\n        id2w: &mut Vec<CompactString>,\n    ) {\n        // Compute the alphabet from seen words\n        let mut alphabet: AHashMap<char, usize> = AHashMap::new();\n        for (word, count) in wc {\n            for c in word.chars() {\n                *alphabet.entry(c).or_default() += *count as usize;\n            }\n        }\n\n        // Also include anything from the provided initial alphabet\n        for c in &self.initial_alphabet {\n            *alphabet.entry(*c).or_default() = usize::MAX;\n        }\n\n        let mut kept = alphabet.iter().collect::<Vec<_>>();\n\n        // Compute the number of chars to remove from the alphabet\n        // If `limit_alphabet < initial_alphabet.len()`, some of these initial characters\n        // will be removed\n        let to_remove = self\n            .limit_alphabet\n            .map(|limit| alphabet.len().saturating_sub(limit))\n            .unwrap_or(0);\n\n        // Remove the unwanted chars\n        if to_remove > 0 {\n            kept.sort_unstable_by_key(|k| *k.1);\n            kept.drain(..to_remove);\n        }\n\n        // Keep the initial alphabet (sorted for determinism)\n        kept.sort_unstable_by_key(|k| *k.0 as u32);\n        kept.into_iter().for_each(|(c, _)| {\n            let s = c.to_string();\n            /*\n            if !w2id.contains_key(&s) {\n                id2w.push(s.clone());\n                w2id.insert(s, (id2w.len() - 1) as u32);\n            }\n            */\n            // u64 hash version\n            if !w2id.contains_key(&CompactString::from(&s)) {\n                id2w.push(CompactString::from(&s));\n                w2id.insert(CompactString::from(&s), (id2w.len() - 1) as u32);\n            }\n        });\n    }\n\n    /// Tokenize words and add subwords to the vocabulary when relevant\n    fn tokenize_words(\n        &self,\n        wc: &AHashMap<CompactString, u64>,\n        w2id: &mut AHashMap<CompactString, u32>,\n        id2w: &mut Vec<CompactString>,\n        p: &Option<ProgressBar>,\n    ) -> (Vec<Word>, Vec<u64>) {\n        let mut words: Vec<Word> = Vec::with_capacity(wc.len());\n        let mut counts: Vec<u64> = Vec::with_capacity(wc.len());\n\n        for (word, count) in wc {\n            let mut current_word = Word::new();\n            counts.push(*count);\n\n            for (is_first, is_last, c) in word.chars().with_first_and_last() {\n                let mut s = c.to_string();\n                if w2id.contains_key(&CompactString::from(&s)) {\n                    // Found the initial char in the authorized alphabet\n\n                    // Add the `continuing_subword_prefix` if relevant\n                    if !is_first {\n                        if let Some(prefix) = &self.continuing_subword_prefix {\n                            s.insert_str(0, prefix);\n                        }\n                    }\n                    // Add the `end_of_word_suffix` if relevant\n                    if is_last {\n                        if let Some(suffix) = &self.end_of_word_suffix {\n                            s.push_str(suffix);\n                        }\n                    }\n\n                    // Insert the new formed string if necessary\n                    if !w2id.contains_key(&CompactString::from(&s)) {\n                        id2w.push(CompactString::from(&s));\n                        w2id.insert(CompactString::from(&s), (id2w.len() - 1) as u32);\n                    }\n                    current_word.add(w2id[&CompactString::from(&s)], 1); // We do not care about the len here\n                }\n            }\n            words.push(current_word);\n\n            if let Some(p) = p {\n                p.inc(1);\n            }\n        }\n\n        (words, counts)\n    }\n\n    fn count_pairs(\n        &self,\n        words: &[Word],\n        counts: &[u64],\n        p: &Option<ProgressBar>,\n    ) -> (AHashMap<Pair, i32>, AHashMap<Pair, AHashSet<usize>>) {\n        words\n            .maybe_par_iter()\n            .enumerate()\n            .map(|(i, word)| {\n                let mut pair_counts = AHashMap::new();\n                let mut where_to_update: AHashMap<Pair, AHashSet<usize>> = AHashMap::new();\n\n                for window in word.get_chars().windows(2) {\n                    let cur_pair: Pair = (window[0], window[1]);\n\n                    // Initialize pair_counts and where_to_update for this pair if we just saw it\n                    // Then update counts\n                    *pair_counts.entry(cur_pair).or_default() += counts[i] as i32;\n                    where_to_update.entry(cur_pair).or_default().insert(i);\n                }\n\n                if let Some(p) = &p {\n                    p.inc(1);\n                }\n\n                (pair_counts, where_to_update)\n            })\n            .reduce(\n                || (AHashMap::new(), AHashMap::new()),\n                |(mut pair_counts, mut where_to_update), (pc, wtu)| {\n                    for (k, v) in pc {\n                        *pair_counts.entry(k).or_default() += v;\n                    }\n                    for (k, v) in wtu {\n                        where_to_update.entry(k).or_default().extend(v);\n                    }\n                    (pair_counts, where_to_update)\n                },\n            )\n    }\n\n    pub fn do_train(\n        &self,\n        word_counts: &AHashMap<CompactString, u64>,\n        model: &mut BPE,\n    ) -> Result<Vec<AddedToken>> {\n        let mut word_to_id: AHashMap<CompactString, u32> = AHashMap::with_capacity(self.vocab_size);\n        let mut id_to_word: Vec<CompactString> = Vec::with_capacity(self.vocab_size);\n        let max_token_length: usize = self.max_token_length.unwrap_or(usize::MAX);\n\n        let progress = self.setup_progress();\n\n        //\n        // 1. Add all special tokens to the vocabulary\n        //\n        self.add_special_tokens(&mut word_to_id, &mut id_to_word);\n\n        //\n        // 2. Compute the initial alphabet\n        //\n        self.compute_alphabet(word_counts, &mut word_to_id, &mut id_to_word);\n\n        //\n        // 3. Tokenize words\n        //\n        self.update_progress(&progress, word_counts.len(), \"Tokenize words\");\n        let (mut words, counts) =\n            self.tokenize_words(word_counts, &mut word_to_id, &mut id_to_word, &progress);\n        self.finalize_progress(&progress, words.len());\n\n        //\n        // 4. Count pairs in words\n        //\n        self.update_progress(&progress, words.len(), \"Count pairs\");\n        let (mut pair_counts, mut where_to_update) = self.count_pairs(&words, &counts, &progress);\n        // Insert them in the queue\n        let mut queue = OctonaryHeap::with_capacity(pair_counts.len());\n        where_to_update.drain().for_each(|(pair, pos)| {\n            let count = pair_counts[&pair];\n            if count > 0 {\n                queue.push(Merge {\n                    pair,\n                    count: count as u64,\n                    pos,\n                });\n            }\n        });\n        self.finalize_progress(&progress, words.len());\n\n        //\n        // 5. Do merges\n        //\n        self.update_progress(&progress, self.vocab_size, \"Compute merges\");\n        let mut merges: Vec<(Pair, u32)> = vec![];\n        loop {\n            // Stop as soon as we have a big enough vocabulary\n            if word_to_id.len() >= self.vocab_size {\n                break;\n            }\n\n            let Some(mut top) = queue.pop() else {\n                break;\n            };\n\n            if top.count != pair_counts[&top.pair] as u64 {\n                top.count = pair_counts[&top.pair] as u64;\n                queue.push(top);\n                continue;\n            }\n\n            if top.count < 1 || self.min_frequency > top.count {\n                break;\n            }\n\n            let part_a = &id_to_word[top.pair.0 as usize];\n            let mut part_b = id_to_word[top.pair.1 as usize].as_str();\n\n            // Build new token\n            if let Some(prefix) = &self.continuing_subword_prefix {\n                if let Some(rest) = part_b.strip_prefix(prefix) {\n                    part_b = rest;\n                }\n            }\n\n            // Insert new token if it does not already exist\n            let new_token = format!(\"{part_a}{part_b}\");\n            let new_token_id = word_to_id\n                .get(&CompactString::from(&new_token))\n                .copied()\n                .unwrap_or(id_to_word.len() as u32);\n            if !word_to_id.contains_key(&CompactString::from(&new_token)) {\n                id_to_word.push(CompactString::from(&new_token));\n                word_to_id.insert(CompactString::from(&new_token), new_token_id);\n            }\n            merges.push((top.pair, new_token_id));\n\n            // Merge the new pair in every words\n            // Safety: This is just a type assertion, the code below may no longer be safe\n            // if the type of `pos` changes\n            let pos: &AHashSet<usize> = &top.pos;\n\n            let words_len = words.len();\n            struct WordPtr(*mut Word);\n            // Safety: We do not actually use this for concurrent access to the same memory,\n            // only to different chunks within the same allocation.\n            unsafe impl Sync for WordPtr {}\n            let word_start = WordPtr(words.as_mut_ptr());\n\n            let changes = pos\n                .maybe_par_iter()\n                .flat_map(|&i| {\n                    // We can merge each of these words in parallel here because each position\n                    // can be there only once (AHashSet). So this is safe.\n                    unsafe {\n                        assert!(i < words_len);\n                        // This is words[i], but avoids needing to go through &T (which triggers UB)\n                        let word = word_start.0.add(i);\n                        // let word: &mut Word = &mut (*word);\n                        (*word)\n                            .merge(top.pair.0, top.pair.1, new_token_id, max_token_length)\n                            .into_iter()\n                            .map(|c| (c, i))\n                            .collect::<Vec<_>>()\n                    }\n                })\n                .collect::<Vec<_>>();\n\n            // Introduce new formed pairs\n            for ((pair, change), iw) in changes {\n                let count = change * counts[iw] as i32;\n                *pair_counts.entry(pair).or_default() += count;\n                if change > 0 {\n                    where_to_update.entry(pair).or_default().insert(iw);\n                }\n            }\n            where_to_update.drain().for_each(|(pair, pos)| {\n                let count = pair_counts[&pair];\n                if count > 0 {\n                    queue.push(Merge {\n                        pair,\n                        count: count as u64,\n                        pos,\n                    });\n                }\n            });\n\n            if let Some(p) = &progress {\n                p.inc(1);\n            }\n        }\n        self.finalize_progress(&progress, merges.len());\n\n        // Transfer new vocab & options to model\n        //model.vocab = word_to_id;\n        model.vocab = word_to_id\n            .into_iter()\n            // we have to look up the string in id_to_word because the key in word_to_id is a hash\n            .map(|(_key, val)| (id_to_word[val as usize].to_string(), val))\n            .collect();\n        model.vocab_r = model\n            .vocab\n            .iter()\n            .map(|(key, val)| (*val, key.to_owned()))\n            .collect();\n        model.merges = merges\n            .into_iter()\n            .enumerate()\n            .map(|(i, (pair, new_token_id))| (pair, (i as u32, new_token_id)))\n            .collect();\n\n        model.continuing_subword_prefix = self.continuing_subword_prefix.clone();\n        model.end_of_word_suffix = self.end_of_word_suffix.clone();\n\n        Ok(self.special_tokens.clone())\n    }\n}\n\nimpl Trainer for BpeTrainer {\n    type Model = BPE;\n\n    /// Train a BPE model\n    fn train(&self, model: &mut BPE) -> Result<Vec<AddedToken>> {\n        self.do_train(&self.words, model)\n    }\n\n    /// Whether we should show progress\n    fn should_show_progress(&self) -> bool {\n        self.show_progress\n    }\n\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> Result<Vec<String>> + Sync,\n    {\n        let words: Result<AHashMap<CompactString, u64>> = iterator\n            .maybe_par_bridge()\n            .map(|sequence| {\n                let words = process(sequence.as_ref())?;\n                let mut map = AHashMap::new();\n                for word in words {\n                    *map.entry(CompactString::from(word)).or_default() += 1;\n                }\n                Ok(map)\n            })\n            .reduce(\n                || Ok(AHashMap::new()),\n                |acc, ws| {\n                    let mut acc = acc?;\n                    for (k, v) in ws? {\n                        *acc.entry(k).or_default() += v;\n                    }\n                    Ok(acc)\n                },\n            );\n\n        self.words = words?;\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{BpeTrainer, Pair, BPE};\n    use ahash::AHashMap;\n    use compact_str::CompactString;\n\n    #[test]\n    fn test_train() {\n        let word_counts: AHashMap<CompactString, u64> = [\n            (\"roses\".into(), 1),\n            (\"are\".into(), 2),\n            (\"red\".into(), 1),\n            (\"voilets\".into(), 1),\n            (\"blue\".into(), 1),\n            (\"BERT\".into(), 1),\n            (\"is\".into(), 2),\n            (\"big\".into(), 1),\n            (\"and\".into(), 1),\n            (\"so\".into(), 1),\n            (\"GPT-2\".into(), 1),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let trainer = BpeTrainer::builder()\n            .show_progress(false)\n            .min_frequency(2)\n            .build();\n        let mut model = BPE::default();\n        trainer.do_train(&word_counts, &mut model).unwrap();\n\n        // Vocab should contain all of the characters from the `word_counts` mapping\n        // as well as three merges: 're', 'are', and 'is'.\n        let expected_vocab: AHashMap<String, u32> = [\n            (\"-\".into(), 0),\n            (\"2\".into(), 1),\n            (\"B\".into(), 2),\n            (\"E\".into(), 3),\n            (\"G\".into(), 4),\n            (\"P\".into(), 5),\n            (\"R\".into(), 6),\n            (\"T\".into(), 7),\n            (\"a\".into(), 8),\n            (\"b\".into(), 9),\n            (\"d\".into(), 10),\n            (\"e\".into(), 11),\n            (\"g\".into(), 12),\n            (\"i\".into(), 13),\n            (\"l\".into(), 14),\n            (\"n\".into(), 15),\n            (\"o\".into(), 16),\n            (\"r\".into(), 17),\n            (\"s\".into(), 18),\n            (\"t\".into(), 19),\n            (\"u\".into(), 20),\n            (\"v\".into(), 21),\n            (\"re\".into(), 22),\n            (\"are\".into(), 23),\n            (\"is\".into(), 24),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        assert_eq!(model.vocab, expected_vocab);\n\n        // The keys in `merges` are pairs of symbols, the values are tuples of (rank, id),\n        // where 'rank' determines the order in which this merge will be applied during\n        // tokenization, and 'id' is the vocab id of the symbol resulting from merging\n        // the pair of symbols in the corresponding key.\n        let expected_merges: AHashMap<Pair, (u32, u32)> = [\n            ((17, 11), (0, 22)), // 'r' + 'e'  -> 're'\n            ((8, 22), (1, 23)),  // 'a' + 're' -> 'are'\n            ((13, 18), (2, 24)), // 'i' + 's'  -> 'is'\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        assert_eq!(model.merges, expected_merges);\n    }\n    #[test]\n    fn bpe_test_max_token_length_16() {\n        /* bpe_test_max_token_length series of tests test the max_token_length flag of bpetrainer\n        // this is the more robust version that only tests max length of learned tokens\n        // (pre) tokenizer settings or vocab can be easily modified when necessary\n         */\n\n        let max_token_length = 16;\n        let long_word_counts: AHashMap<CompactString, u64> = [\n            (\"singlelongtokenwithoutcasechange\", 2),\n            (\"singleLongTokenWithCamelCaseChange\", 2),\n            (\"Longsingletokenwithpunctu@t!onwithin\", 2),\n            (\"Anotherlongsingletokenwithnumberw1th1n\", 2),\n            (\"짧은한글문자열짧은한\", 2),             // korean 10 char\n            (\"긴한글문자열긴한글문자열긴한글문\", 2), // korean 16 char\n            (\"短字符串短字符串短字\", 2),             //simplified chinese 10 char\n            (\"长字符串长字符串长字符串长字符串\", 2), // simp. chinese 16 char\n            (\"短い文字列短い文字列\", 2),             // japanese 10 char\n            (\"長い文字列長い文字列長い文字列長\", 2), // japanese 16 char\n            (\"so\", 2),\n            (\"GPT-2\", 2),\n        ]\n        .iter()\n        .map(|(key, value)| (CompactString::from(key.to_string()), *value))\n        .collect();\n        let trainer = BpeTrainer::builder()\n            .max_token_length(Some(max_token_length))\n            .show_progress(false)\n            .min_frequency(0)\n            .build();\n        let mut model = BPE::default();\n        trainer.do_train(&long_word_counts, &mut model).unwrap();\n        let vocab = model.get_vocab();\n        for token in vocab.keys() {\n            assert!(\n                token.chars().count() <= max_token_length,\n                \"token too long : {} , chars().count() = {}\",\n                token,\n                token.chars().count()\n            )\n        }\n    }\n    #[test]\n    fn bpe_test_max_token_length_direct_assert() {\n        /* more direct version of bpe_test_max_token_length test\n        // directly compares tokens with known expected values.\n        // maybe unstable depending on specific settings or changes.\n         */\n        let long_word_counts: AHashMap<CompactString, u64> = [\n            (\"sin\", 2),\n            (\"Sin\", 2),\n            (\"Lon\", 2),\n            (\"Ano\", 2),\n            (\"짧은한\", 2),\n            (\"긴한글\", 2),\n            (\"短字符\", 2),\n            (\"长字符\", 2),\n            (\"短い文\", 2),\n            (\"長い文\", 2),\n            (\"so\", 2),\n            (\"GP\", 2),\n        ]\n        .iter()\n        .map(|(key, value)| (CompactString::from(key.to_string()), *value))\n        .collect();\n        let trainer = BpeTrainer::builder()\n            .max_token_length(Some(2))\n            .show_progress(false)\n            .min_frequency(0)\n            .build();\n        let mut model = BPE::default();\n        trainer.do_train(&long_word_counts, &mut model).unwrap();\n        let trained_vocab: AHashMap<String, u32> = model.get_vocab().into_iter().collect();\n        let expected_vocab: AHashMap<String, u32> = [\n            (\"短\", 12),\n            (\"n\", 6),\n            (\"i\", 5),\n            (\"s\", 8),\n            (\"字符\", 23),\n            (\"長\", 14),\n            (\"긴\", 17),\n            (\"い文\", 22),\n            (\"L\", 2),\n            (\"in\", 21),\n            (\"o\", 7),\n            (\"은한\", 29),\n            (\"S\", 4),\n            (\"P\", 3),\n            (\"so\", 27),\n            (\"符\", 13),\n            (\"文\", 11),\n            (\"字\", 10),\n            (\"짧\", 19),\n            (\"GP\", 25),\n            (\"글\", 16),\n            (\"G\", 1),\n            (\"An\", 24),\n            (\"长\", 15),\n            (\"A\", 0),\n            (\"Lo\", 26),\n            (\"긴한\", 28),\n            (\"い\", 9),\n            (\"한\", 20),\n            (\"은\", 18),\n        ]\n        .iter()\n        .cloned()\n        .map(|(k, v)| (k.to_string(), v))\n        .collect();\n        assert_eq!(trained_vocab, expected_vocab)\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/bpe/word.rs",
    "content": "use super::Pair;\nuse ahash::AHashMap;\nuse dary_heap::QuaternaryHeap;\nuse rand::{rng, Rng};\nuse std::cmp::Ordering;\n\n#[derive(Debug, Eq)]\nstruct Merge {\n    pos: usize,\n    rank: u32,\n    new_id: u32,\n}\n\nimpl PartialEq for Merge {\n    fn eq(&self, other: &Self) -> bool {\n        self.rank == other.rank && self.pos == other.pos\n    }\n}\n\nimpl PartialOrd for Merge {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        // By manually implementing this, we make the containing BinaryHeap a\n        // min-heap ordered first on the rank, and the pos otherwise\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for Merge {\n    fn cmp(&self, other: &Self) -> Ordering {\n        if self.rank != other.rank {\n            other.rank.cmp(&self.rank)\n        } else {\n            other.pos.cmp(&self.pos)\n        }\n    }\n}\n\n#[derive(Debug, Clone, Copy)]\nstruct Symbol {\n    c: u32,\n    prev: isize,\n    next: isize,\n    len: usize,\n}\nimpl Symbol {\n    /// Merges the current Symbol with the other one.\n    /// In order to update prev/next, we consider Self to be the Symbol on the left,\n    /// and other to be the next one on the right.\n    pub fn merge_with(&mut self, other: &Self, new_c: u32) {\n        self.c = new_c;\n        self.len += other.len;\n        self.next = other.next;\n    }\n}\n\n#[derive(Clone, Default)]\npub(super) struct Word {\n    symbols: Vec<Symbol>,\n}\nimpl std::fmt::Debug for Word {\n    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        fmt.debug_struct(\"Word\")\n            .field(\n                \"chars\",\n                &self\n                    .symbols\n                    .iter()\n                    .map(|s| s.c.to_string())\n                    .collect::<Vec<_>>()\n                    .join(\" \"),\n            )\n            .field(\"symbols\", &self.symbols)\n            .finish()\n    }\n}\n\nimpl Word {\n    pub(super) fn new() -> Self {\n        Word { symbols: vec![] }\n    }\n\n    pub(super) fn with_capacity(capacity: usize) -> Self {\n        Self {\n            symbols: Vec::with_capacity(capacity),\n        }\n    }\n\n    pub(super) fn add(&mut self, c: u32, byte_len: usize) {\n        let (prev, next) = {\n            let len = self.symbols.len() as isize;\n            if let Some(last) = self.symbols.last_mut() {\n                // Update `next` on the previous one\n                last.next = len;\n                (len - 1, -1)\n            } else {\n                (-1, -1)\n            }\n        };\n        self.symbols.push(Symbol {\n            c,\n            prev,\n            next,\n            len: byte_len,\n        });\n    }\n\n    pub(super) fn merge(\n        &mut self,\n        c1: u32,\n        c2: u32,\n        replacement: u32,\n        max_length: usize,\n    ) -> Vec<(Pair, i32)> {\n        let mut changes: Vec<(Pair, i32)> = vec![];\n        let mut i = 0;\n        loop {\n            if i >= self.symbols.len() {\n                break;\n            }\n\n            // Found a pair\n            if self.symbols[i].c == c1 && i + 1 < self.symbols.len() && self.symbols[i + 1].c == c2\n            {\n                let first = self.symbols[i];\n                let second = self.symbols[i + 1];\n\n                // Remove in place\n                let new_s = Symbol {\n                    c: replacement,\n                    prev: first.prev,\n                    next: second.next,\n                    len: first.len + second.len,\n                };\n\n                // If there are other characters before the pair\n                if i > 0 {\n                    changes.push(((self.symbols[i - 1].c, first.c), -1));\n                    if self.symbols[i - 1].len + new_s.len < max_length {\n                        changes.push(((self.symbols[i - 1].c, replacement), 1));\n                    }\n                }\n\n                self.symbols.insert(i, new_s); // Insert replacement before first char of pair\n                self.symbols.remove(i + 1); // Remove first char of pair\n                self.symbols.remove(i + 1); // And then the second\n\n                // If there are other characters after the pair\n                if i < self.symbols.len() - 1 {\n                    changes.push(((second.c, self.symbols[i + 1].c), -1));\n                    if self.symbols[i + 1].len + new_s.len < max_length {\n                        changes.push(((replacement, self.symbols[i + 1].c), 1));\n                    }\n                }\n            }\n\n            i += 1;\n        }\n\n        changes\n    }\n\n    pub(super) fn merge_all(&mut self, merges: &AHashMap<Pair, (u32, u32)>, dropout: Option<f32>) {\n        let mut queue = QuaternaryHeap::with_capacity(self.symbols.len());\n        let mut skip = Vec::with_capacity(queue.len());\n\n        queue.extend(\n            self.symbols\n                .windows(2)\n                .enumerate()\n                .filter_map(|(index, window)| {\n                    let pair = (window[0].c, window[1].c);\n                    merges.get(&pair).map(|m| Merge {\n                        pos: index,\n                        rank: m.0,\n                        new_id: m.1,\n                    })\n                }),\n        );\n\n        while let Some(top) = queue.pop() {\n            if dropout.map(|d| rng().random::<f32>() < d).unwrap_or(false) {\n                skip.push(top);\n            } else {\n                // Re-insert the skipped elements\n                queue.extend(skip.drain(..));\n\n                if self.symbols[top.pos].len == 0 {\n                    continue;\n                }\n                // Do nothing if we are the last symbol\n                if self.symbols[top.pos].next == -1 {\n                    continue;\n                }\n\n                let next_pos = self.symbols[top.pos].next as usize;\n                let right = self.symbols[next_pos];\n\n                // Make sure we are not processing an expired queue entry\n                let target_new_pair = (self.symbols[top.pos].c, right.c);\n                if merges\n                    .get(&target_new_pair)\n                    .is_none_or(|(_, new_id)| *new_id != top.new_id)\n                {\n                    continue;\n                }\n\n                // Otherwise, let's merge\n                self.symbols[top.pos].merge_with(&right, top.new_id);\n                // Tag the right part as removed\n                self.symbols[next_pos].len = 0;\n\n                // Update `prev` on the new `next` to the current pos\n                if right.next > -1 && (right.next as usize) < self.symbols.len() {\n                    self.symbols[right.next as usize].prev = top.pos as isize;\n                }\n\n                // Insert the new pair formed with the previous symbol\n                let current = &self.symbols[top.pos];\n                if current.prev >= 0 {\n                    let prev = current.prev as usize;\n                    let prev_symbol = self.symbols[prev];\n                    let new_pair = (prev_symbol.c, current.c);\n                    if let Some((rank, new_id)) = merges.get(&new_pair) {\n                        queue.push(Merge {\n                            pos: current.prev as usize,\n                            rank: *rank,\n                            new_id: *new_id,\n                        });\n                    }\n                }\n\n                // Insert the new pair formed with the next symbol\n                let next = current.next as usize;\n                if next < self.symbols.len() {\n                    let next_symbol = self.symbols[next];\n                    let new_pair = (current.c, next_symbol.c);\n                    if let Some((rank, new_id)) = merges.get(&new_pair) {\n                        queue.push(Merge {\n                            pos: top.pos,\n                            rank: *rank,\n                            new_id: *new_id,\n                        });\n                    }\n                }\n            }\n        }\n\n        // Filter out the removed symbols\n        self.symbols.retain(|s| s.len != 0);\n    }\n\n    pub(super) fn get_chars(&self) -> Vec<u32> {\n        self.symbols.iter().map(|s| s.c).collect()\n    }\n\n    pub(super) fn get_chars_iter(&self) -> impl Iterator<Item = u32> + '_ {\n        self.symbols.iter().map(|s| s.c)\n    }\n\n    pub(super) fn get_offsets_iter(&self) -> impl Iterator<Item = (usize, usize)> + '_ {\n        let mut pos = 0;\n        self.symbols.iter().map(move |symbol| {\n            let new_pos = pos + symbol.len;\n            let offset = (pos, new_pos);\n            pos = new_pos;\n            offset\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_merge() {\n        // Let's say we have the word 'hello' and a word-to-id vocab that looks\n        // like this: {'h': 0, 'e': 1, 'l': 2, 'o': 3}.\n        let mut word = Word::new();\n        word.add(0, 1); // 'h'\n        word.add(1, 1); // 'e'\n        word.add(2, 1); // 'l'\n        word.add(2, 1); // 'l'\n        word.add(3, 1); // 'o'\n\n        // We're going to perform a merge on the pair ('l', 'l') ~= (2, 2). Let's\n        // say that 'll' has the ID of 4 in the updated word-to-id vocab.\n        let changes = word.merge(2, 2, 4, usize::MAX);\n\n        // So the word should now look like this:\n        assert_eq!(\n            word.get_chars(),\n            &[\n                0u32, // 'h'\n                1u32, // 'e'\n                4u32, // 'll'\n                3u32, // 'o'\n            ]\n        );\n\n        // The return value `changes` will be used to update the pair counts during\n        // training. This merge affects the counts for the pairs\n        // ('e', 'l') ~= (1, 2),\n        // ('e', 'll') ~= (1, 4),\n        // ('l', 'o') ~= (2, 3), and\n        // ('ll', 'o') ~= (4, 3).\n        // So the changes should reflect that:\n        assert_eq!(\n            changes,\n            &[\n                ((1u32, 2u32), -1i32), // count for ('e', 'l') should be decreased by 1.\n                ((1u32, 4u32), 1i32),  // count for ('e', 'll') should be increased by 1.\n                ((2u32, 3u32), -1i32), // count for ('l', 'o') should be decreased by 1.\n                ((4u32, 3u32), 1i32),  // count for ('ll', 'o') should be increased by 1.\n            ]\n        );\n    }\n\n    #[test]\n    fn test_merge_max_length() {\n        // Let's say we have the word 'hello' and a word-to-id vocab that looks\n        // like this: {'h': 0, 'e': 1, 'l': 2, 'o': 3}.\n        let mut word = Word::new();\n        word.add(0, 1); // 'h'\n        word.add(1, 1); // 'e'\n        word.add(2, 1); // 'l'\n        word.add(2, 1); // 'l'\n        word.add(3, 1); // 'o'\n\n        // We're going to perform a merge on the pair ('l', 'l') ~= (2, 2). Let's\n        // say that 'll' has the ID of 4 in the updated word-to-id vocab.\n        let changes = word.merge(2, 2, 4, 2);\n        assert_eq!(\n            word.get_chars(),\n            &[\n                0u32, // 'h'\n                1u32, // 'e'\n                4u32, // 'll'\n                3u32, // 'o'\n            ]\n        );\n\n        assert_eq!(\n            changes,\n            &[\n                ((1u32, 2u32), -1i32), // count for ('e', 'l') should be decreased by 1.\n                // ((1u32, 4u32), 1i32),  Missing since this would be larger than 2\n                ((2u32, 3u32), -1i32), // count for ('l', 'o') should be decreased by 1.\n                                       // ((4u32, 3u32), 1i32), Missing since this would be larger than 2\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/mod.rs",
    "content": "//! Popular tokenizer models.\n\npub mod bpe;\npub mod unigram;\npub mod wordlevel;\npub mod wordpiece;\n\nuse ahash::AHashMap;\nuse std::collections::HashMap;\nuse std::path::{Path, PathBuf};\n\nuse serde::{Deserialize, Deserializer, Serialize, Serializer};\n\nuse crate::models::bpe::{BpeTrainer, BPE};\nuse crate::models::unigram::{Unigram, UnigramTrainer};\nuse crate::models::wordlevel::{WordLevel, WordLevelTrainer};\nuse crate::models::wordpiece::{WordPiece, WordPieceTrainer};\nuse crate::{AddedToken, Model, Result, Token, Trainer};\n\n/// Wraps a vocab mapping (ID -> token) to a struct that will be serialized in order\n/// of token ID, smallest to largest.\nstruct OrderedVocabIter<'a> {\n    vocab_r: &'a AHashMap<u32, String>,\n}\n\nimpl<'a> OrderedVocabIter<'a> {\n    fn new(vocab_r: &'a AHashMap<u32, String>) -> Self {\n        Self { vocab_r }\n    }\n}\n\nimpl Serialize for OrderedVocabIter<'_> {\n    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        // There could be holes so max + 1 is more correct than vocab_r.len()\n        let mut holes = vec![];\n        let result = if let Some(max) = self.vocab_r.keys().max() {\n            let iter = (0..*max + 1).filter_map(|i| {\n                if let Some(token) = self.vocab_r.get(&i) {\n                    Some((token, i))\n                } else {\n                    holes.push(i);\n                    None\n                }\n            });\n            serializer.collect_map(iter)\n        } else {\n            serializer.collect_map(std::iter::empty::<(&str, u32)>())\n        };\n\n        if !holes.is_empty() {\n            warn!(\"The OrderedVocab you are attempting to serialize contains holes for indices {holes:?}, your vocabulary could be corrupted!\");\n        }\n        result\n    }\n}\n\n#[derive(Serialize, Debug, PartialEq, Clone)]\n#[serde(untagged)]\npub enum ModelWrapper {\n    BPE(BPE),\n    // WordPiece must stay before WordLevel here for deserialization (for retrocompatibility\n    // with the versions not including the \"type\"), since WordLevel is a subset of WordPiece\n    WordPiece(WordPiece),\n    WordLevel(WordLevel),\n    Unigram(Unigram),\n}\n\nimpl<'de> Deserialize<'de> for ModelWrapper {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        pub struct Tagged {\n            #[serde(rename = \"type\")]\n            variant: EnumType,\n            #[serde(flatten)]\n            rest: serde_json::Value,\n        }\n        #[derive(Deserialize)]\n        pub enum EnumType {\n            BPE,\n            WordPiece,\n            WordLevel,\n            Unigram,\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum ModelHelper {\n            Tagged(Tagged),\n            Legacy(serde_json::Value),\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum ModelUntagged {\n            BPE(BPE),\n            // WordPiece must stay before WordLevel here for deserialization (for retrocompatibility\n            // with the versions not including the \"type\"), since WordLevel is a subset of WordPiece\n            WordPiece(WordPiece),\n            WordLevel(WordLevel),\n            Unigram(Unigram),\n        }\n\n        let helper = ModelHelper::deserialize(deserializer)?;\n        Ok(match helper {\n            ModelHelper::Tagged(model) => match model.variant {\n                EnumType::BPE => ModelWrapper::BPE(\n                    serde_json::from_value(model.rest).map_err(serde::de::Error::custom)?,\n                ),\n                EnumType::WordPiece => ModelWrapper::WordPiece(\n                    serde_json::from_value(model.rest).map_err(serde::de::Error::custom)?,\n                ),\n                EnumType::WordLevel => ModelWrapper::WordLevel(\n                    serde_json::from_value(model.rest).map_err(serde::de::Error::custom)?,\n                ),\n                EnumType::Unigram => ModelWrapper::Unigram(\n                    serde_json::from_value(model.rest).map_err(serde::de::Error::custom)?,\n                ),\n            },\n            ModelHelper::Legacy(value) => {\n                let untagged = serde_json::from_value(value).map_err(serde::de::Error::custom)?;\n                match untagged {\n                    ModelUntagged::BPE(bpe) => ModelWrapper::BPE(bpe),\n                    ModelUntagged::WordPiece(bpe) => ModelWrapper::WordPiece(bpe),\n                    ModelUntagged::WordLevel(bpe) => ModelWrapper::WordLevel(bpe),\n                    ModelUntagged::Unigram(bpe) => ModelWrapper::Unigram(bpe),\n                }\n            }\n        })\n    }\n}\n\nimpl_enum_from!(WordLevel, ModelWrapper, WordLevel);\nimpl_enum_from!(WordPiece, ModelWrapper, WordPiece);\nimpl_enum_from!(BPE, ModelWrapper, BPE);\nimpl_enum_from!(Unigram, ModelWrapper, Unigram);\n\nimpl Model for ModelWrapper {\n    type Trainer = TrainerWrapper;\n\n    fn tokenize(&self, tokens: &str) -> Result<Vec<Token>> {\n        match self {\n            Self::WordLevel(t) => t.tokenize(tokens),\n            Self::WordPiece(t) => t.tokenize(tokens),\n            Self::BPE(t) => t.tokenize(tokens),\n            Self::Unigram(t) => t.tokenize(tokens),\n        }\n    }\n\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        match self {\n            Self::WordLevel(t) => t.token_to_id(token),\n            Self::WordPiece(t) => t.token_to_id(token),\n            Self::BPE(t) => t.token_to_id(token),\n            Self::Unigram(t) => t.token_to_id(token),\n        }\n    }\n\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        match self {\n            Self::WordLevel(t) => t.id_to_token(id),\n            Self::WordPiece(t) => t.id_to_token(id),\n            Self::BPE(t) => t.id_to_token(id),\n            Self::Unigram(t) => t.id_to_token(id),\n        }\n    }\n\n    fn get_vocab(&self) -> HashMap<String, u32> {\n        match self {\n            Self::WordLevel(t) => t.get_vocab(),\n            Self::WordPiece(t) => t.get_vocab(),\n            Self::BPE(t) => t.get_vocab(),\n            Self::Unigram(t) => t.get_vocab(),\n        }\n    }\n\n    fn get_vocab_size(&self) -> usize {\n        match self {\n            Self::WordLevel(t) => t.get_vocab_size(),\n            Self::WordPiece(t) => t.get_vocab_size(),\n            Self::BPE(t) => t.get_vocab_size(),\n            Self::Unigram(t) => t.get_vocab_size(),\n        }\n    }\n\n    fn save(&self, folder: &Path, name: Option<&str>) -> Result<Vec<PathBuf>> {\n        match self {\n            Self::WordLevel(t) => t.save(folder, name),\n            Self::WordPiece(t) => t.save(folder, name),\n            Self::BPE(t) => t.save(folder, name),\n            Self::Unigram(t) => t.save(folder, name),\n        }\n    }\n\n    fn get_trainer(&self) -> Self::Trainer {\n        match self {\n            Self::WordLevel(t) => t.get_trainer().into(),\n            Self::WordPiece(t) => t.get_trainer().into(),\n            Self::BPE(t) => t.get_trainer().into(),\n            Self::Unigram(t) => t.get_trainer().into(),\n        }\n    }\n}\n\nimpl ModelWrapper {\n    pub fn clear_cache(&mut self) {\n        match self {\n            Self::Unigram(model) => model.clear_cache(),\n            Self::BPE(model) => model.clear_cache(),\n            _ => (),\n        }\n    }\n    pub fn resize_cache(&mut self, capacity: usize) {\n        match self {\n            Self::Unigram(model) => model.resize_cache(capacity),\n            Self::BPE(model) => model.resize_cache(capacity),\n            _ => (),\n        }\n    }\n}\n\n#[derive(Clone, Serialize, Deserialize)]\npub enum TrainerWrapper {\n    BpeTrainer(BpeTrainer),\n    WordPieceTrainer(WordPieceTrainer),\n    WordLevelTrainer(WordLevelTrainer),\n    UnigramTrainer(UnigramTrainer),\n}\n\nimpl Trainer for TrainerWrapper {\n    type Model = ModelWrapper;\n\n    fn should_show_progress(&self) -> bool {\n        match self {\n            Self::BpeTrainer(bpe) => bpe.should_show_progress(),\n            Self::WordPieceTrainer(wpt) => wpt.should_show_progress(),\n            Self::WordLevelTrainer(wpt) => wpt.should_show_progress(),\n            Self::UnigramTrainer(wpt) => wpt.should_show_progress(),\n        }\n    }\n\n    fn train(&self, model: &mut ModelWrapper) -> Result<Vec<AddedToken>> {\n        match self {\n            Self::BpeTrainer(t) => match model {\n                ModelWrapper::BPE(bpe) => t.train(bpe),\n                _ => Err(\"BpeTrainer can only train a BPE\".into()),\n            },\n            Self::WordPieceTrainer(t) => match model {\n                ModelWrapper::WordPiece(wp) => t.train(wp),\n                _ => Err(\"WordPieceTrainer can only train a WordPiece\".into()),\n            },\n            Self::WordLevelTrainer(t) => match model {\n                ModelWrapper::WordLevel(wl) => t.train(wl),\n                _ => Err(\"WordLevelTrainer can only train a WordLevel\".into()),\n            },\n            Self::UnigramTrainer(t) => match model {\n                ModelWrapper::Unigram(u) => t.train(u),\n                _ => Err(\"UnigramTrainer can only train a Unigram\".into()),\n            },\n        }\n    }\n\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> Result<Vec<String>> + Sync,\n    {\n        match self {\n            Self::BpeTrainer(bpe) => bpe.feed(iterator, process),\n            Self::WordPieceTrainer(wpt) => wpt.feed(iterator, process),\n            Self::WordLevelTrainer(wpt) => wpt.feed(iterator, process),\n            Self::UnigramTrainer(wpt) => wpt.feed(iterator, process),\n        }\n    }\n}\n\nimpl_enum_from!(BpeTrainer, TrainerWrapper, BpeTrainer);\nimpl_enum_from!(WordPieceTrainer, TrainerWrapper, WordPieceTrainer);\nimpl_enum_from!(UnigramTrainer, TrainerWrapper, UnigramTrainer);\nimpl_enum_from!(WordLevelTrainer, TrainerWrapper, WordLevelTrainer);\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::models::bpe::{BpeBuilder, Vocab};\n\n    #[test]\n    fn trainer_wrapper_train_model_wrapper() {\n        let trainer = TrainerWrapper::BpeTrainer(BpeTrainer::default());\n        let mut model = ModelWrapper::Unigram(Unigram::default());\n\n        let result = trainer.train(&mut model);\n        assert!(result.is_err());\n    }\n\n    #[test]\n    fn incomplete_ordered_vocab() {\n        let vocab_r: AHashMap<u32, String> =\n            AHashMap::from([(0, \"Hi\".to_string()), (2, \"There\".to_string())]);\n\n        let ordered = OrderedVocabIter::new(&vocab_r);\n\n        let serialized = serde_json::to_string(&ordered).unwrap();\n        assert_eq!(serialized, \"{\\\"Hi\\\":0,\\\"There\\\":2}\");\n    }\n\n    #[test]\n    fn serialization() {\n        let vocab: Vocab = [\n            (\"<unk>\".into(), 0),\n            (\"a\".into(), 1),\n            (\"b\".into(), 2),\n            (\"ab\".into(), 3),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        let bpe = BpeBuilder::default()\n            .vocab_and_merges(vocab, vec![(\"a\".to_string(), \"b\".to_string())])\n            .unk_token(\"<unk>\".to_string())\n            .ignore_merges(true)\n            .build()\n            .unwrap();\n\n        let model = ModelWrapper::BPE(bpe);\n        let legacy = r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2,\"ab\":3},\"merges\":[\"a b\"]}\"#;\n        let legacy = serde_json::from_str(legacy).unwrap();\n        assert_eq!(model, legacy);\n\n        let data = serde_json::to_string(&model).unwrap();\n        assert_eq!(\n            data,\n            r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2,\"ab\":3},\"merges\":[[\"a\",\"b\"]]}\"#\n        );\n        let reconstructed = serde_json::from_str(&data).unwrap();\n        assert_eq!(model, reconstructed);\n\n        // Legacy check, type is not necessary.\n        let legacy = r#\"{\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2,\"ab\":3},\"merges\":[\"a b\"]}\"#;\n        let reconstructed = serde_json::from_str(legacy).unwrap();\n        assert_eq!(model, reconstructed);\n\n        let invalid = r#\"{\"type\":\"BPE\",\"dropout\":null,\"unk_token\":\"<unk>\",\"continuing_subword_prefix\":null,\"end_of_word_suffix\":null,\"fuse_unk\":false,\"byte_fallback\":false,\"ignore_merges\":true,\"vocab\":{\"<unk>\":0,\"a\":1,\"b\":2,\"ab\":3},\"merges\":[\"a b c\"]}\"#;\n        let reconstructed: std::result::Result<ModelWrapper, serde_json::Error> =\n            serde_json::from_str(invalid);\n        match reconstructed {\n            Err(err) => assert_eq!(err.to_string(), \"Merges text file invalid at line 1\"),\n            _ => panic!(\"Expected an error here\"),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/unigram/lattice.rs",
    "content": "use dary_heap::QuaternaryHeap;\nuse rand::distr::weighted::WeightedIndex;\nuse rand::{prelude::*, rng};\nuse std::cell::RefCell;\nuse std::cmp::{min, Ordering};\nuse std::rc::Rc;\n\ntype NodeRef = Rc<RefCell<Node>>;\ntype HypothesisRef = Rc<RefCell<Hypothesis>>;\ntype Agenda = QuaternaryHeap<Hypothesis>;\n\nstruct Hypothesis {\n    node_ref: NodeRef,\n    next: Option<HypothesisRef>,\n    fx: f64,\n    gx: f64,\n}\nimpl Hypothesis {\n    pub fn new(node_ref: NodeRef, next: Option<HypothesisRef>, fx: f64, gx: f64) -> Self {\n        Self {\n            node_ref,\n            next,\n            fx,\n            gx,\n        }\n    }\n}\nimpl PartialEq for Hypothesis {\n    fn eq(&self, other: &Self) -> bool {\n        self.fx == other.fx\n    }\n}\nimpl Eq for Hypothesis {}\nimpl PartialOrd for Hypothesis {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n// TODO Maybe use Ordered Floats (https://docs.rs/ordered-float/1.0.2/ordered_float/)\nimpl Ord for Hypothesis {\n    fn cmp(&self, other: &Self) -> Ordering {\n        if self.fx < other.fx {\n            Ordering::Less\n        } else {\n            Ordering::Greater\n        }\n    }\n}\n\n/// Structure to implement Viterbi algorithm to find the best encoding, or sample\n/// from all possible encodings of a given sentence.\n#[derive(Debug)]\npub struct Lattice<'a> {\n    pub(super) sentence: &'a str,\n    len: usize,\n    nodes: Vec<NodeRef>,\n    pub(super) begin_nodes: Vec<Vec<NodeRef>>,\n    pub(super) end_nodes: Vec<Vec<NodeRef>>,\n    _bos_id: usize,\n    _eos_id: usize,\n}\n\nimpl std::fmt::Display for Lattice<'_> {\n    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {\n        let display_pieces = |nodes: &Vec<Vec<NodeRef>>| {\n            nodes\n                .iter()\n                .map(|l| {\n                    l.iter()\n                        .map(|n| self.piece(&n.borrow()))\n                        .collect::<Vec<_>>()\n                })\n                .collect::<Vec<_>>()\n        };\n\n        f.debug_struct(\"Lattice\")\n            .field(\"sentence\", &self.sentence)\n            .field(\"begin_nodes\", &display_pieces(&self.begin_nodes))\n            .field(\"end_nodes\", &display_pieces(&self.end_nodes))\n            .finish()\n    }\n}\n\n/// A node from the lattice, that helps reconstruct the underlying `String`\n#[derive(Debug, Clone)]\npub struct Node {\n    // Vocabulary id\n    pub(super) id: usize,\n    // Local lattice identifier\n    pub(super) node_id: usize,\n    pos: usize,\n    length: usize,\n    prev: Option<NodeRef>,\n    backtrace_score: f64,\n    score: f64,\n}\n\nimpl PartialEq for Node {\n    fn eq(&self, other: &Node) -> bool {\n        self.id == other.id\n    }\n}\n\nimpl Node {\n    pub fn new(id: usize, node_id: usize, pos: usize, length: usize, score: f64) -> Self {\n        Self {\n            id,\n            node_id,\n            pos,\n            length,\n            prev: None,\n            score,\n            backtrace_score: 0.0,\n        }\n    }\n}\n\n/// Returns log(exp(x) + exp(y)).\n/// if init_mode is true, returns log(exp(y)) == y.\n/// log(\\sum_i exp(a[i])) can be computed as\n/// for (int i = 0; i < a.size(); ++i)\n///   x = LogSumExp(x, a[i], i == 0);\nfn log_sum_exp(x: f64, y: f64, init_mode: bool) -> f64 {\n    if init_mode {\n        y\n    } else {\n        let (vmin, vmax) = if x > y { (y, x) } else { (x, y) };\n        let k_minus_log_epsilon = 50.0;\n        if vmax > vmin + k_minus_log_epsilon {\n            vmax\n        } else {\n            vmax + ((vmin - vmax).exp() + 1.0).ln()\n        }\n    }\n}\n\nimpl<'a> Lattice<'a> {\n    pub fn from(sentence: &'a str, bos_id: usize, eos_id: usize) -> Self {\n        let len = sentence.len();\n        let k_reserved_node_size = 16;\n        // We are adding 2 tokens, bos and eos\n        let mut nodes: Vec<NodeRef> = Vec::with_capacity(k_reserved_node_size);\n        let mut begin_nodes = vec![Vec::with_capacity(k_reserved_node_size); len + 1];\n        let mut end_nodes = vec![Vec::with_capacity(k_reserved_node_size); len + 1];\n\n        let bos = Rc::new(RefCell::new(Node::new(bos_id, 0, 0, 0, 0.0)));\n        let eos = Rc::new(RefCell::new(Node::new(eos_id, 1, len, 0, 0.0)));\n\n        begin_nodes[len].push(Rc::clone(&eos));\n        end_nodes[0].push(Rc::clone(&bos));\n\n        nodes.push(bos);\n        nodes.push(eos);\n\n        Self {\n            sentence,\n            len,\n            nodes,\n            begin_nodes,\n            end_nodes,\n            _bos_id: bos_id,\n            _eos_id: eos_id,\n        }\n    }\n\n    pub fn insert(&mut self, pos: usize, length: usize, score: f64, id: usize) {\n        let node_id = self.nodes.len();\n        let node = Rc::new(RefCell::new(Node::new(id, node_id, pos, length, score)));\n\n        self.begin_nodes[pos].push(Rc::clone(&node));\n        self.end_nodes[pos + length].push(Rc::clone(&node));\n\n        self.nodes.push(node);\n    }\n\n    pub fn viterbi(&mut self) -> Vec<NodeRef> {\n        let len = self.len;\n        let mut pos = 0;\n        while pos <= len {\n            if self.begin_nodes[pos].is_empty() {\n                return vec![];\n            }\n            for rnode in &self.begin_nodes[pos] {\n                rnode.borrow_mut().prev = None;\n                let mut best_score = 0.0;\n                let mut best_node: Option<NodeRef> = None;\n                for lnode in &self.end_nodes[pos] {\n                    let score = lnode.borrow().backtrace_score + rnode.borrow().score;\n                    if best_node.is_none() || score > best_score {\n                        // TODO can we remove this clone ?\n                        best_node = Some(lnode.clone());\n                        best_score = score\n                    }\n                }\n                match best_node {\n                    Some(bnode) => {\n                        rnode.borrow_mut().prev = Some(Rc::clone(&bnode));\n                        rnode.borrow_mut().backtrace_score = best_score;\n                    }\n                    None => return vec![],\n                }\n            }\n            if let Some(c) = self.sentence[pos..].chars().next() {\n                pos += c.len_utf8();\n            } else {\n                break;\n            }\n        }\n\n        let mut results: Vec<NodeRef> = vec![];\n        let root = self.begin_nodes[len][0].borrow();\n        let prev = root.prev.as_ref();\n        if prev.is_none() {\n            return vec![];\n        }\n        let mut node: NodeRef = prev.unwrap().clone();\n        while node.borrow().prev.is_some() {\n            results.push(node.clone());\n            let n = node.borrow().clone();\n            node = n.prev.as_ref().unwrap().clone();\n        }\n        results.reverse();\n        results\n    }\n\n    pub fn piece(&self, node: &Node) -> String {\n        self.sentence[node.pos..node.pos + node.length].to_owned()\n    }\n\n    pub fn tokens(&mut self) -> Vec<String> {\n        self.viterbi()\n            .iter()\n            .map(|node| self.piece(&node.borrow()))\n            .collect()\n    }\n\n    pub fn nbest(&mut self, n: usize) -> Vec<Vec<NodeRef>> {\n        match n {\n            0 => vec![],\n            1 => vec![self.viterbi()],\n            _ => {\n                // let k_reserved_hypothesis_size = 512;\n                let mut agenda: Agenda = QuaternaryHeap::new();\n                let mut hypotheses: Vec<Vec<NodeRef>> = vec![];\n                let eos = self.eos_node();\n                let score = eos.borrow().score;\n                let hypo = Hypothesis::new(eos, None, score, score);\n                agenda.push(hypo);\n\n                // Fill backtrace scores\n                self.viterbi();\n\n                while !agenda.is_empty() {\n                    let top = Rc::new(RefCell::new(agenda.pop().unwrap()));\n                    let node = Rc::clone(&top.borrow().node_ref);\n                    if node.borrow().id == self.bos_node().borrow().id {\n                        let mut hypothesis = vec![];\n                        let mut next: HypothesisRef =\n                            Rc::clone(top.borrow().next.as_ref().unwrap());\n                        while next.borrow().next.is_some() {\n                            hypothesis.push(next.borrow().node_ref.clone());\n                            let c: HypothesisRef = next.clone();\n                            // let c: Ref<Hypothesis> = next.clone().borrow();\n                            next = Rc::clone(c.borrow().next.as_ref().unwrap());\n                        }\n                        hypotheses.push(hypothesis);\n                        if hypotheses.len() == n {\n                            return hypotheses;\n                        }\n                    } else {\n                        for lnode in &self.end_nodes[node.borrow().pos] {\n                            let top_gx = top.borrow().gx;\n                            let fx = lnode.borrow().backtrace_score + top_gx;\n                            let gx = lnode.borrow().score + top_gx;\n                            let hyp =\n                                Hypothesis::new(Rc::clone(lnode), Some(Rc::clone(&top)), fx, gx);\n                            agenda.push(hyp);\n                        }\n                        // When the input is too long or contains duplicated phrases,\n                        // `agenda` will get extremely big. Here we avoid this case by\n                        // dynamically shrinking the agenda.\n                        let k_max_agenda_size = 100_000;\n                        let k_min_agenda_size = 512;\n                        if agenda.len() > k_max_agenda_size {\n                            let mut new_agenda = QuaternaryHeap::new();\n                            let len = min(k_min_agenda_size, n * 10);\n                            for _i in 0..len {\n                                new_agenda.push(agenda.pop().unwrap());\n                            }\n                            agenda = new_agenda;\n                        }\n                    }\n                }\n                hypotheses\n            }\n        }\n    }\n\n    pub fn nbest_tokens(&mut self, n: usize) -> Vec<Vec<String>> {\n        self.nbest(n)\n            .iter()\n            .map(|v| v.iter().map(|node| self.piece(&node.borrow())).collect())\n            .collect()\n    }\n\n    pub fn len(&self) -> usize {\n        self.len\n    }\n\n    pub fn is_empty(&self) -> bool {\n        self.len == 0\n    }\n\n    pub fn bos_node(&self) -> NodeRef {\n        Rc::clone(&self.end_nodes[0][0])\n    }\n    pub fn eos_node(&self) -> NodeRef {\n        Rc::clone(&self.begin_nodes[self.len][0])\n    }\n\n    pub fn surface(&self, n: usize) -> &str {\n        match self.sentence.char_indices().nth(n) {\n            Some((pos, _)) => &self.sentence[pos..],\n            None => \"\",\n        }\n    }\n    pub fn sentence(&self) -> &str {\n        self.sentence\n    }\n\n    pub fn populate_marginal(&self, freq: f64, expected: &mut [f64]) -> f64 {\n        let len = self.len();\n        let n_nodes = self.nodes.len();\n        let mut alpha = vec![0.0; n_nodes];\n        let mut beta = vec![0.0; n_nodes];\n        for pos in 0..=len {\n            for rnode in &self.begin_nodes[pos] {\n                for lnode in &self.end_nodes[pos] {\n                    let lid = lnode.borrow().node_id;\n                    let rid = rnode.borrow().node_id;\n                    alpha[rid] = log_sum_exp(\n                        alpha[rid],\n                        lnode.borrow().score + alpha[lid],\n                        *lnode == self.end_nodes[pos][0],\n                    );\n                }\n            }\n        }\n        for pos in (0..=len).rev() {\n            // let rpos = len - pos;\n            for lnode in &self.end_nodes[pos] {\n                for rnode in &self.begin_nodes[pos] {\n                    let lid = lnode.borrow().node_id;\n                    let rid = rnode.borrow().node_id;\n                    beta[lid] = log_sum_exp(\n                        beta[lid],\n                        rnode.borrow().score + beta[rid],\n                        *rnode == self.begin_nodes[pos][0],\n                    );\n                }\n            }\n        }\n\n        let eos_id = self.begin_nodes[len][0].borrow().node_id;\n        let z = alpha[eos_id];\n        for pos in 0..len {\n            for node in &self.begin_nodes[pos] {\n                let node_id = node.borrow().node_id;\n                let id = node.borrow().id;\n                let a = alpha[node_id];\n                let b = beta[node_id];\n                let total = a + node.borrow().score + b - z;\n                let update = freq * total.exp();\n                expected[id] += update;\n            }\n        }\n        freq * z\n    }\n\n    pub fn sample(&self, theta: f64) -> Vec<NodeRef> {\n        let len = self.len();\n        if len == 0 {\n            return vec![];\n        }\n        let mut alpha = vec![0.0; self.nodes.len()];\n        for pos in 0..=len {\n            for rnode in &self.begin_nodes[pos] {\n                for lnode in &self.end_nodes[pos] {\n                    let lid = lnode.borrow().node_id;\n                    let rid = rnode.borrow().node_id;\n                    alpha[rid] = log_sum_exp(\n                        alpha[rid],\n                        theta * (lnode.borrow().score + alpha[lid]),\n                        *lnode == self.end_nodes[pos][0],\n                    );\n                }\n            }\n        }\n\n        let mut rng = rng();\n        let mut results: Vec<NodeRef> = vec![];\n        let mut probs: Vec<f64> = vec![];\n        let mut z = alpha[self.eos_node().borrow().node_id];\n        let mut node = self.eos_node();\n        loop {\n            probs.clear();\n            let pos = node.borrow().pos;\n            for lnode in &self.end_nodes[pos] {\n                let lid = lnode.borrow().node_id;\n                probs.push((alpha[lid] + theta * lnode.borrow().score - z).exp())\n            }\n            let dist = WeightedIndex::new(&probs).unwrap();\n            let index = dist.sample(&mut rng);\n            node = Rc::clone(&self.end_nodes[pos][index]);\n            if node == self.bos_node() {\n                break;\n            }\n            z = alpha[node.borrow().node_id];\n            results.push(Rc::clone(&node));\n        }\n        results.reverse();\n        results\n    }\n\n    pub fn sample_token(&self, theta: f64) -> Vec<String> {\n        self.sample(theta)\n            .iter()\n            .map(|node| self.piece(&node.borrow()))\n            .collect()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use assert_approx_eq::assert_approx_eq;\n\n    #[test]\n    fn set_sentence() {\n        let lattice = Lattice::from(\"\", 1, 2);\n\n        assert_eq!(lattice.len(), 0);\n\n        let lattice = Lattice::from(\"\", 1, 2);\n        assert_eq!(lattice.len(), 0);\n        assert_eq!(lattice.sentence(), \"\");\n        assert_eq!(lattice.surface(0), \"\");\n\n        let lattice = Lattice::from(\"test\", 1, 2);\n        assert_eq!(lattice.len(), 4);\n        assert_eq!(lattice.sentence(), \"test\");\n        assert_eq!(lattice.surface(0), \"test\");\n        assert_eq!(lattice.surface(1), \"est\");\n        assert_eq!(lattice.surface(2), \"st\");\n        assert_eq!(lattice.surface(3), \"t\");\n\n        let bos = lattice.bos_node();\n        let eos = lattice.eos_node();\n\n        assert_eq!(bos.borrow().id, 1);\n        assert_eq!(eos.borrow().id, 2);\n        assert_eq!(\n            lattice.end_nodes[0].first().unwrap().borrow().id,\n            bos.borrow().id\n        );\n        assert_eq!(\n            lattice.begin_nodes[4].first().unwrap().borrow().id,\n            eos.borrow().id\n        );\n\n        let lattice = Lattice::from(\"テストab\", 1, 2);\n        assert_eq!(lattice.len(), 11);\n        assert_eq!(lattice.sentence(), \"テストab\");\n        assert_eq!(lattice.surface(0), \"テストab\");\n        assert_eq!(lattice.surface(1), \"ストab\");\n        assert_eq!(lattice.surface(2), \"トab\");\n        assert_eq!(lattice.surface(3), \"ab\");\n        assert_eq!(lattice.surface(4), \"b\");\n    }\n\n    #[test]\n    fn insert_test() {\n        let mut lattice = Lattice::from(\"ABあい\", 1, 2);\n\n        lattice.insert(0, 1, 0.0, 3);\n        lattice.insert(1, 1, 0.0, 4);\n        lattice.insert(2, 3, 0.0, 5);\n        lattice.insert(5, 3, 0.0, 6);\n        lattice.insert(0, 2, 0.0, 7);\n        lattice.insert(1, 4, 0.0, 8);\n        lattice.insert(2, 6, 0.0, 9);\n        // 0 & 1 are bos and eos\n        let node0 = lattice.nodes[2].borrow();\n        let node1 = lattice.nodes[3].borrow();\n        let node2 = lattice.nodes[4].borrow();\n        let node3 = lattice.nodes[5].borrow();\n        let node4 = lattice.nodes[6].borrow();\n        let node5 = lattice.nodes[7].borrow();\n        let node6 = lattice.nodes[8].borrow();\n\n        assert_eq!(lattice.piece(&node0), \"A\");\n        assert_eq!(lattice.piece(&node1), \"B\");\n        assert_eq!(lattice.piece(&node2), \"あ\");\n        assert_eq!(lattice.piece(&node3), \"い\");\n        assert_eq!(lattice.piece(&node4), \"AB\");\n        assert_eq!(lattice.piece(&node5), \"Bあ\");\n        assert_eq!(lattice.piece(&node6), \"あい\");\n\n        assert_eq!(node0.pos, 0);\n        assert_eq!(node1.pos, 1);\n        assert_eq!(node2.pos, 2);\n        assert_eq!(node3.pos, 5);\n        assert_eq!(node4.pos, 0);\n        assert_eq!(node5.pos, 1);\n        assert_eq!(node6.pos, 2);\n\n        assert_eq!(node0.length, 1);\n        assert_eq!(node1.length, 1);\n        assert_eq!(node2.length, 3);\n        assert_eq!(node3.length, 3);\n        assert_eq!(node4.length, 2);\n        assert_eq!(node5.length, 4);\n        assert_eq!(node6.length, 6);\n\n        assert_eq!(lattice.bos_node().borrow().id, 1);\n        assert_eq!(lattice.eos_node().borrow().id, 2);\n        assert_eq!(node0.id, 3);\n        assert_eq!(node1.id, 4);\n        assert_eq!(node2.id, 5);\n        assert_eq!(node3.id, 6);\n        assert_eq!(node4.id, 7);\n        assert_eq!(node5.id, 8);\n        assert_eq!(node6.id, 9);\n\n        assert_eq!(lattice.begin_nodes[0].len(), 2);\n        assert_eq!(lattice.begin_nodes[1].len(), 2);\n        assert_eq!(lattice.begin_nodes[2].len(), 2);\n        assert_eq!(lattice.begin_nodes[5].len(), 1);\n        assert_eq!(lattice.begin_nodes[8].len(), 1);\n\n        assert_eq!(lattice.end_nodes[0].len(), 1);\n        assert_eq!(lattice.end_nodes[1].len(), 1);\n        assert_eq!(lattice.end_nodes[2].len(), 2);\n        assert_eq!(lattice.end_nodes[5].len(), 2);\n        assert_eq!(lattice.end_nodes[8].len(), 2);\n\n        assert_eq!(lattice.begin_nodes[0][0].borrow().id, node0.id);\n        assert_eq!(lattice.begin_nodes[0][1].borrow().id, node4.id);\n        assert_eq!(lattice.begin_nodes[1][0].borrow().id, node1.id);\n        assert_eq!(lattice.begin_nodes[1][1].borrow().id, node5.id);\n        assert_eq!(lattice.begin_nodes[2][0].borrow().id, node2.id);\n        assert_eq!(lattice.begin_nodes[2][1].borrow().id, node6.id);\n        assert_eq!(lattice.begin_nodes[5][0].borrow().id, node3.id);\n        assert_eq!(\n            lattice.eos_node().borrow().id,\n            lattice.begin_nodes[8][0].borrow().id\n        );\n\n        assert_eq!(\n            lattice.bos_node().borrow().id,\n            lattice.end_nodes[0][0].borrow().id\n        );\n        assert_eq!(node0.id, lattice.end_nodes[1][0].borrow().id);\n        assert_eq!(node1.id, lattice.end_nodes[2][0].borrow().id);\n        assert_eq!(node4.id, lattice.end_nodes[2][1].borrow().id);\n        assert_eq!(node2.id, lattice.end_nodes[5][0].borrow().id);\n        assert_eq!(node5.id, lattice.end_nodes[5][1].borrow().id);\n        assert_eq!(node3.id, lattice.end_nodes[8][0].borrow().id);\n        assert_eq!(node6.id, lattice.end_nodes[8][1].borrow().id);\n    }\n\n    #[test]\n    fn test_viterbi() {\n        let mut lattice = Lattice::from(\"ABC\", 1, 2);\n        assert_eq!(lattice.viterbi(), vec![]);\n        // Still incomplete\n        lattice.insert(0, 1, 0.0, 3);\n        assert_eq!(lattice.viterbi(), vec![]);\n        lattice.insert(1, 1, 0.0, 4);\n        lattice.insert(2, 1, 0.0, 5);\n        // XXX: In sentence piece this is not tested, still incomplete ?\n        assert_eq!(lattice.viterbi().len(), 3);\n    }\n\n    #[test]\n    fn test_viterbi2() {\n        let mut lattice = Lattice::from(\"ABC\", 1, 2);\n\n        lattice.insert(0, 1, 0.0, 3);\n        lattice.insert(1, 1, 0.0, 4);\n        lattice.insert(2, 1, 0.0, 5);\n\n        assert_eq!(lattice.tokens(), [\"A\", \"B\", \"C\"]);\n\n        lattice.insert(0, 2, 2.0, 6);\n        assert_eq!(lattice.tokens(), [\"AB\", \"C\"]);\n\n        lattice.insert(1, 2, 5.0, 7);\n        assert_eq!(lattice.tokens(), [\"A\", \"BC\"]);\n\n        lattice.insert(0, 3, 10.0, 8);\n        assert_eq!(lattice.tokens(), [\"ABC\"]);\n    }\n\n    #[test]\n    fn test_nbest() {\n        let mut lattice = Lattice::from(\"ABC\", 1, 2);\n        lattice.insert(0, 1, 0.0, 3);\n        lattice.insert(1, 1, 0.0, 4);\n        lattice.insert(2, 1, 0.0, 5);\n        lattice.insert(0, 2, 2.0, 6);\n        lattice.insert(1, 2, 5.0, 7);\n        lattice.insert(0, 3, 10.0, 8);\n\n        let nbests = lattice.nbest_tokens(10);\n        assert_eq!(\n            nbests,\n            vec![\n                vec![\"ABC\"],\n                vec![\"A\", \"BC\"],\n                vec![\"AB\", \"C\"],\n                vec![\"A\", \"B\", \"C\"]\n            ]\n        );\n\n        assert!(lattice.nbest_tokens(0).is_empty());\n        assert_eq!(lattice.nbest_tokens(1), vec![vec![\"ABC\"]]);\n    }\n    #[test]\n    fn test_log_sum_exp() {\n        let mut x = 0.0;\n\n        let v: Vec<f64> = vec![1.0, 2.0, 3.0];\n        for (i, y) in v.iter().enumerate() {\n            x = log_sum_exp(x, *y, i == 0);\n        }\n        assert_approx_eq!(x, v.iter().map(|n| n.exp()).sum::<f64>().ln(), 0.001);\n    }\n\n    #[test]\n    fn test_populate() {\n        let mut lattice = Lattice::from(\"ABC\", 1, 2);\n        lattice.insert(0, 1, 1.0, 3); // A\n        lattice.insert(1, 1, 1.2, 4); // B\n        lattice.insert(2, 1, 2.5, 5); // C\n        lattice.insert(0, 2, 3.0, 6); // AB\n        lattice.insert(1, 2, 4.0, 7); // BC\n        lattice.insert(0, 3, 2.0, 8); // ABC\n\n        let mut probs = vec![0.0; 9];\n        let p1 = (1.0_f64 + 1.2 + 2.5).exp();\n        let p2 = (3.0_f64 + 2.5).exp();\n        let p3 = (1.0_f64 + 4.0).exp();\n        let p4 = 2.0_f64.exp();\n        let z = p1 + p2 + p3 + p4;\n\n        let log_z = lattice.populate_marginal(1.0, &mut probs);\n\n        assert_approx_eq!(log_z, z.ln(), 0.001);\n        assert_approx_eq!(probs[0], 0.0, 0.001);\n        assert_approx_eq!(probs[1], 0.0, 0.001);\n        assert_approx_eq!(probs[2], 0.0, 0.001);\n        assert_approx_eq!(probs[3], (p1 + p3) / z, 0.001);\n        assert_approx_eq!(probs[4], (p1) / z, 0.001);\n        assert_approx_eq!(probs[5], (p1 + p2) / z, 0.001);\n        assert_approx_eq!(probs[6], (p2) / z, 0.001);\n        assert_approx_eq!(probs[7], (p3) / z, 0.001);\n        assert_approx_eq!(probs[8], (p4) / z, 0.001);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/unigram/mod.rs",
    "content": "//! [Unigram](https://arxiv.org/abs/1804.10959) model.\nmod lattice;\nmod model;\nmod serialization;\nmod trainer;\nmod trie;\n\npub use lattice::*;\npub use model::*;\npub use trainer::*;\n"
  },
  {
    "path": "tokenizers/src/models/unigram/model.rs",
    "content": "use super::{\n    lattice::Lattice,\n    trainer::UnigramTrainer,\n    trie::{Trie, TrieBuilder},\n};\nuse crate::tokenizer::{Model, Result, Token};\nuse crate::utils::cache::{Cache, MAX_LENGTH};\nuse std::collections::HashMap;\n\nuse ahash::AHashMap;\nuse std::convert::TryInto;\nuse std::fs::read_to_string;\nuse std::path::{Path, PathBuf};\n\ntype TokenMap = AHashMap<String, u32>;\ntype Vocab = Vec<(String, f64)>;\n\n/// A `Unigram` model to encode sentences.\npub struct Unigram {\n    token_to_ids: TokenMap,\n    pub(crate) vocab: Vocab,\n    cache: Cache<String, Vec<String>>,\n    trie: Trie<u8>,\n    pub min_score: f64,\n    pub(super) unk_id: Option<usize>,\n    pub(super) bos_id: usize,\n    pub(super) eos_id: usize,\n\n    fuse_unk: bool,\n    is_optimized: bool,\n    byte_fallback: bool,\n}\nimpl PartialEq for Unigram {\n    fn eq(&self, other: &Self) -> bool {\n        self.unk_id == other.unk_id && self.vocab == other.vocab\n    }\n}\n\nimpl Clone for Unigram {\n    // `Clone` can't be derive because it's not implemented for `Cache`.\n    // To keep things simple when we clone, the new Unigram will start with a fresh cache.\n    fn clone(&self) -> Self {\n        let fresh_cache = self.cache.fresh();\n        Self {\n            vocab: self.vocab.clone(),\n            cache: fresh_cache,\n            token_to_ids: self.token_to_ids.clone(),\n            trie: self.trie.clone(),\n            min_score: self.min_score,\n            unk_id: self.unk_id,\n            bos_id: self.bos_id,\n            eos_id: self.eos_id,\n            fuse_unk: self.fuse_unk,\n            is_optimized: self.is_optimized,\n            byte_fallback: self.byte_fallback,\n        }\n    }\n}\n\nimpl std::fmt::Debug for Unigram {\n    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        fmt.debug_struct(\"Unigram\")\n            .field(\"vocab\", &self.vocab.len())\n            .field(\"unk_id\", &self.unk_id)\n            .field(\"byte_fallback\", &self.byte_fallback)\n            .finish()\n    }\n}\n\nstatic K_UNK_PENALTY: f64 = 10.0;\n\n#[derive(thiserror::Error, Debug)]\npub enum UnigramError {\n    #[error(\"The vocabulary is empty but at least <unk> is needed\")]\n    EmptyVocabulary,\n    #[error(\"The `unk_id` is larger than vocabulary size\")]\n    UnkIdNotInVocabulary,\n    #[error(\"Encountered an unknown token but `unk_id` is missing\")]\n    MissingUnkId,\n}\n\nimpl Default for Unigram {\n    fn default() -> Self {\n        let vocab = vec![(\"<unk>\".to_string(), 0.0)];\n        Self::from(vocab, Some(0), false).unwrap()\n    }\n}\n\nimpl Unigram {\n    /// Create a `Unigram` model from a given vocabulary.\n    /// Vocabulary are the various tokens and their associated score which is a sort of a logprob of\n    /// their frequency, which will enable tokenization and sampling.\n    /// unk_id, is the index within the vocabulary.\n    /// For now `Unigram` *requires* at least `unk` because we might find a never seen char.\n    /// Further versions might allow that part to be hidden.\n    pub fn from(\n        vocab: Vec<(String, f64)>,\n        unk_id: Option<usize>,\n        byte_fallback: bool,\n    ) -> Result<Self> {\n        let n = vocab.len();\n        let mut token_to_ids: TokenMap = AHashMap::new();\n        let mut builder = TrieBuilder::default();\n\n        if let Some(unk_id) = unk_id {\n            if vocab.is_empty() {\n                return Err(Box::new(UnigramError::EmptyVocabulary));\n            }\n            if unk_id >= vocab.len() {\n                return Err(Box::new(UnigramError::UnkIdNotInVocabulary));\n            }\n        }\n        let bos_id = n + 1;\n        let eos_id = n + 2;\n\n        let mut min_score = f64::INFINITY;\n        for (id, (token, score)) in vocab.iter().enumerate() {\n            token_to_ids.insert(token.to_string(), id as u32);\n            builder.push(token.as_bytes());\n            if score < &min_score {\n                min_score = *score;\n            }\n        }\n        let trie = builder.build();\n        let fuse_unk = true;\n        let is_optimized = true;\n\n        Ok(Self {\n            vocab,\n            token_to_ids,\n            trie,\n            min_score,\n            bos_id,\n            eos_id,\n            unk_id,\n            fuse_unk,\n            cache: Cache::default(),\n            is_optimized,\n            byte_fallback,\n        })\n    }\n\n    #[cfg(test)]\n    pub(super) fn set_fuse_unk(&mut self, fuse_unk: bool) {\n        self.fuse_unk = fuse_unk;\n        self.cache = self.cache.fresh();\n    }\n\n    #[cfg(test)]\n    pub(super) fn set_optimized(&mut self, is_optimized: bool) {\n        self.is_optimized = is_optimized;\n    }\n    pub fn byte_fallback(&self) -> bool {\n        self.byte_fallback\n    }\n    pub(super) fn len(&self) -> usize {\n        self.vocab.len()\n    }\n\n    pub(super) fn populate_nodes(&self, lattice: &mut Lattice) {\n        let unk_score = self.min_score - K_UNK_PENALTY;\n\n        let len = lattice.len();\n\n        let mut begin_pos = 0;\n        while begin_pos < len {\n            let mblen = lattice.sentence[begin_pos..]\n                .chars()\n                .next()\n                .unwrap()\n                .len_utf8();\n\n            let mut has_single_node = false;\n\n            for bytes in self\n                .trie\n                .common_prefix_search(lattice.sentence.bytes().skip(begin_pos))\n            {\n                let n = bytes.len();\n                let tok = String::from_utf8(bytes).unwrap();\n                let id = *self.token_to_ids.get(&tok).unwrap();\n\n                let item = &self.vocab[id as usize];\n                assert_eq!(item.0, tok);\n                let score: f64 = item.1;\n                lattice.insert(begin_pos, n, score, id.try_into().unwrap());\n                if !has_single_node && n == mblen {\n                    has_single_node = true;\n                }\n            }\n\n            if !has_single_node {\n                if let Some(unk_id) = self.unk_id {\n                    lattice.insert(begin_pos, mblen, unk_score, unk_id);\n                }\n            }\n            begin_pos += mblen\n        }\n    }\n\n    /// This functions take a String, and will encode it in a Vec of Strings,\n    /// of the best tokenization available to the current model.\n    /// ```\n    /// use tokenizers::models::unigram::Unigram;\n    ///\n    /// let pieces = vec![\n    ///     (\"<unk>\".to_string(), 0.0),\n    ///     (\"a\".to_string(), 0.0),\n    ///     (\"b\".to_string(), 0.0),\n    ///     (\"c\".to_string(), 0.0),\n    ///     (\"d\".to_string(), 0.0),\n    ///     (\"cd\".to_string(), 1.0),\n    ///     (\"ab\".to_string(), 2.0),\n    ///     (\"abc\".to_string(), 5.0),\n    ///     (\"abcd\".to_string(), 10.0),\n    /// ];\n    /// let model = Unigram::from(pieces, Some(0), false).unwrap();\n    /// let result = model.encode(\"abcdacdxx\").unwrap();\n    /// assert_eq!(result, vec![\"abcd\", \"a\", \"cd\", \"xx\"]);\n    /// ```\n    pub fn encode(&self, sentence: &str) -> Result<Vec<String>> {\n        if sentence.is_empty() {\n            return Ok(vec![]);\n        }\n        if let Some(result) = self.cache.get(sentence) {\n            Ok(result.to_vec())\n        } else {\n            let result = if self.is_optimized {\n                self.encode_optimized(sentence)?\n            } else {\n                self.encode_unoptimized(sentence)?\n            };\n            if sentence.len() < MAX_LENGTH {\n                self.cache.set(sentence.to_owned(), result.clone());\n            }\n            Ok(result)\n        }\n    }\n\n    fn encode_optimized(&self, sentence: &str) -> Result<Vec<String>> {\n        // https://github.com/google/sentencepiece/blob/d48247191a6d50e469ed1a4a36e877befffd1851/src/unigram_model.cc#L600\n        #[derive(Debug, Clone)]\n        struct BestPathNode {\n            /// The vocab id. (maybe UNK)\n            id: usize,\n            /// The total score of the best path ending at this node.\n            best_path_score: f64,\n            /// The starting position (in utf-8) of this node. The entire best\n            /// path can be constructed by backtracking along this link.\n            starts_at: Option<usize>,\n        }\n        impl Default for BestPathNode {\n            fn default() -> Self {\n                Self {\n                    id: 0,\n                    best_path_score: 0.0,\n                    starts_at: None,\n                }\n            }\n        }\n        let size = sentence.len();\n        let unk_score = self.min_score - K_UNK_PENALTY;\n\n        let mut best_path_ends_at = vec![BestPathNode::default(); size + 1];\n        let mut starts_at = 0;\n        while starts_at < size {\n            let best_path_score_till_here = best_path_ends_at[starts_at].best_path_score;\n            let mut has_single_node = false;\n            let mblen = sentence[starts_at..].chars().next().unwrap().len_utf8();\n            for tok_bytes in self\n                .trie\n                .common_prefix_search(sentence.bytes().skip(starts_at))\n            {\n                let key_pos = starts_at + tok_bytes.len();\n                let token: String = String::from_utf8(tok_bytes).unwrap();\n                let target_node = &mut best_path_ends_at[key_pos];\n                let length = key_pos - starts_at;\n                let id = self.token_to_ids.get(&token).unwrap();\n                let score = self.vocab.get(*id as usize).unwrap().1;\n                let candidate_best_path_score = score + best_path_score_till_here;\n                if target_node.starts_at.is_none()\n                    || candidate_best_path_score > target_node.best_path_score\n                {\n                    target_node.best_path_score = candidate_best_path_score;\n                    target_node.starts_at = Some(starts_at);\n                    target_node.id = *id as usize;\n                }\n                if !has_single_node && length == mblen {\n                    has_single_node = true;\n                }\n            }\n            if !has_single_node {\n                let target_node = &mut best_path_ends_at[starts_at + mblen];\n                let candidate_best_path_score = unk_score + best_path_score_till_here;\n                if target_node.starts_at.is_none()\n                    || candidate_best_path_score > target_node.best_path_score\n                {\n                    target_node.best_path_score = candidate_best_path_score;\n                    target_node.starts_at = Some(starts_at);\n                    target_node.id = self.unk_id.ok_or(UnigramError::MissingUnkId)?;\n                }\n            }\n            starts_at += mblen\n        }\n        let mut ends_at = size;\n        let mut results: Vec<String> = vec![];\n        let mut token = vec![];\n        while ends_at > 0 {\n            let node = &best_path_ends_at[ends_at];\n            let starts_at = node.starts_at.unwrap();\n            if self.fuse_unk && Some(node.id) == self.unk_id {\n                token.push(sentence[starts_at..ends_at].to_string());\n            } else {\n                if !token.is_empty() {\n                    token.reverse();\n                    results.push(token.concat());\n                    token = vec![];\n                }\n                results.push(sentence[starts_at..ends_at].to_string());\n            }\n            ends_at = starts_at;\n        }\n        if !token.is_empty() {\n            token.reverse();\n            results.push(token.concat());\n        }\n        results.reverse();\n        Ok(results)\n    }\n\n    fn encode_unoptimized(&self, sentence: &str) -> Result<Vec<String>> {\n        let mut lattice = Lattice::from(sentence, self.bos_id, self.eos_id);\n        self.populate_nodes(&mut lattice);\n        if self.fuse_unk {\n            let mut results = vec![];\n            let mut token = String::new();\n            for node in lattice.viterbi().iter() {\n                let item = lattice.piece(&node.borrow());\n                if node.borrow().id == self.unk_id.ok_or(UnigramError::MissingUnkId)? {\n                    token.push_str(&item);\n                } else {\n                    if !token.is_empty() {\n                        results.push(token);\n                        token = String::new();\n                    }\n                    results.push(item);\n                }\n            }\n            if !token.is_empty() {\n                results.push(token);\n            }\n            Ok(results)\n        } else {\n            Ok(lattice.tokens())\n        }\n    }\n\n    /// Iterate of vocabulary of the model as a pair of `(token, score)`.\n    pub fn iter(&self) -> UnigramIterator<'_> {\n        UnigramIterator { model: self, i: 0 }\n    }\n\n    /// Loads a SentencePiece output model after being trained by tokenizers.\n    /// After that you can use the model with tokenizers library.\n    /// ```no_run\n    /// use tokenizers::models::unigram::Unigram;\n    /// use std::path::Path;\n    ///\n    /// let model = Unigram::load(\"mymodel-unigram.json\").unwrap();\n    /// ```\n    pub fn load<P: AsRef<Path>>(path: P) -> Result<Unigram> {\n        let string = read_to_string(path)?;\n        Ok(serde_json::from_str(&string)?)\n    }\n\n    /// Clears the internal cache\n    pub fn clear_cache(&mut self) {\n        self.cache.clear();\n    }\n\n    /// Resize the cache\n    pub fn resize_cache(&mut self, capacity: usize) {\n        self.cache.resize(capacity);\n    }\n}\n\n/// Iterator to iterate of vocabulary of the model, and their relative score.\npub struct UnigramIterator<'a> {\n    model: &'a Unigram,\n    i: usize,\n}\n\nimpl<'a> Iterator for UnigramIterator<'a> {\n    type Item = &'a (String, f64);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let i = self.i;\n        if i < self.model.len() {\n            let r = Some(&self.model.vocab[i]);\n            self.i += 1;\n            r\n        } else {\n            None\n        }\n    }\n}\n\nimpl Model for Unigram {\n    type Trainer = UnigramTrainer;\n\n    fn get_vocab(&self) -> HashMap<String, u32> {\n        self.token_to_ids.clone().into_iter().collect()\n    }\n\n    fn get_vocab_size(&self) -> usize {\n        self.vocab.len()\n    }\n\n    fn tokenize(&self, sentence: &str) -> Result<Vec<Token>> {\n        let str_tokens = self.encode(sentence)?;\n        let mut offset = 0;\n        let mut tokens = Vec::with_capacity(str_tokens.len());\n        for string in str_tokens {\n            let len = string.len();\n            let offsets = (offset, offset + len);\n            let id: u32 = match self.token_to_ids.get(&string) {\n                Some(id) => *id,\n                None => {\n                    if self.byte_fallback {\n                        let byte_tokens: Option<Vec<_>> = string\n                            .bytes()\n                            .map(|byte| -> Option<Token> {\n                                let byte_string = format!(\"<0x{byte:02X}>\");\n                                let id = self.token_to_ids.get(&byte_string);\n                                id.map(|id| Token::new(*id, byte_string, (offset, offset + len)))\n                            })\n                            .collect();\n                        if let Some(byte_tokens) = byte_tokens {\n                            for token in byte_tokens {\n                                tokens.push(token);\n                            }\n                            offset += len;\n                            continue;\n                        }\n                    }\n                    self.unk_id.ok_or(UnigramError::MissingUnkId)? as u32\n                }\n            };\n            offset += len;\n            tokens.push(Token::new(id, string, offsets));\n        }\n        Ok(tokens)\n    }\n\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.token_to_ids.get(token).copied()\n    }\n\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.vocab.get(id as usize).map(|item| item.0.clone())\n    }\n\n    fn save(&self, folder: &Path, name: Option<&str>) -> Result<Vec<PathBuf>> {\n        let name = match name {\n            Some(name) => format!(\"{name}-unigram.json\"),\n            None => \"unigram.json\".to_string(),\n        };\n        let mut fullpath = PathBuf::new();\n        fullpath.push(folder);\n        fullpath.push(name);\n        let string = serde_json::to_string_pretty(self)?;\n        std::fs::write(&fullpath, string)?;\n        Ok(vec![fullpath])\n    }\n\n    fn get_trainer(&self) -> Self::Trainer {\n        UnigramTrainer::default()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_populate_nodes_unk() {\n        let pieces = vec![(\"<unk>\".to_string(), 0.0)];\n        let model = Unigram::from(pieces, Some(0), false).unwrap();\n\n        let mut lattice = Lattice::from(\"abc\", model.bos_id, model.eos_id);\n        model.populate_nodes(&mut lattice);\n\n        assert_eq!(lattice.begin_nodes[0].len(), 1);\n        assert_eq!(lattice.begin_nodes[1].len(), 1);\n        assert_eq!(lattice.begin_nodes[2].len(), 1);\n        assert_eq!(lattice.begin_nodes[0][0].borrow().id, 0);\n        assert_eq!(lattice.begin_nodes[1][0].borrow().id, 0);\n        assert_eq!(lattice.begin_nodes[2][0].borrow().id, 0);\n        assert_eq!(lattice.begin_nodes[0][0].borrow().node_id, 2);\n        assert_eq!(lattice.begin_nodes[1][0].borrow().node_id, 3);\n        assert_eq!(lattice.begin_nodes[2][0].borrow().node_id, 4);\n    }\n\n    #[test]\n    fn test_populate_nodes() {\n        let pieces = vec![\n            (\"<unk>\".to_string(), 0.0),\n            (\"a\".to_string(), 0.1),\n            (\"b\".to_string(), 0.2),\n            (\"ab\".to_string(), 0.3),\n            (\"bc\".to_string(), 0.4),\n        ];\n        let model = Unigram::from(pieces, Some(0), false).unwrap();\n\n        let mut lattice = Lattice::from(\"abc\", model.bos_id, model.eos_id);\n        model.populate_nodes(&mut lattice);\n\n        assert_eq!(lattice.begin_nodes[0].len(), 2); // a, ab\n        assert_eq!(lattice.begin_nodes[1].len(), 2); // b, bc\n        assert_eq!(lattice.begin_nodes[2].len(), 1); // c(unk)\n\n        // Id is the vocabulary id from Unigram model\n        // node_id is simply the rank of the given node in the lattice.\n        assert_eq!(lattice.begin_nodes[0][0].borrow().id, 1);\n        assert_eq!(lattice.begin_nodes[0][1].borrow().id, 3);\n        assert_eq!(lattice.begin_nodes[1][0].borrow().id, 2);\n        assert_eq!(lattice.begin_nodes[1][1].borrow().id, 4);\n        assert_eq!(lattice.begin_nodes[2][0].borrow().id, 0);\n        assert_eq!(lattice.begin_nodes[0][0].borrow().node_id, 2);\n        assert_eq!(lattice.begin_nodes[0][1].borrow().node_id, 3);\n        assert_eq!(lattice.begin_nodes[1][0].borrow().node_id, 4);\n        assert_eq!(lattice.begin_nodes[1][1].borrow().node_id, 5);\n        assert_eq!(lattice.begin_nodes[2][0].borrow().node_id, 6);\n    }\n\n    #[test]\n    fn test_encode() {\n        let sentencepieces = vec![\n            (\"<unk>\".to_string(), 0.0),\n            (\"a\".to_string(), 0.0),\n            (\"b\".to_string(), 0.0),\n            (\"c\".to_string(), 0.0),\n            (\"d\".to_string(), 0.0),\n            (\"cd\".to_string(), 1.0),\n            (\"ab\".to_string(), 2.0),\n            (\"abc\".to_string(), 5.0),\n            (\"abcd\".to_string(), 10.0),\n        ];\n\n        let model = Unigram::from(sentencepieces, Some(0), false).unwrap();\n        let result = model.encode(\"abcd\").unwrap();\n        assert_eq!(result, vec![\"abcd\"]);\n    }\n\n    #[test]\n    fn test_encode2() {\n        let sentencepieces = vec![\n            (\"<unk>\".to_string(), 0.0),\n            (\"ab\".to_string(), 0.0),\n            (\"cd\".to_string(), -0.1),\n            (\"abc\".to_string(), -0.2),\n            (\"a\".to_string(), -0.3),\n            (\"b\".to_string(), -0.4),\n            (\"c\".to_string(), -0.5),\n            (\"ABC\".to_string(), -0.5),\n            (\"abcdabcd\".to_string(), 20.0), // User defined just max the scores.\n            (\"q\".to_string(), 20.5),\n            (\"r\".to_string(), 20.5),\n            (\"qr\".to_string(), -0.5),\n        ];\n\n        let mut model = Unigram::from(sentencepieces, Some(0), false).unwrap();\n\n        for is_optimized in &[true, false] {\n            model.set_optimized(*is_optimized);\n            println!(\"IsOptimized {is_optimized:?}\");\n            assert_eq!(model.encode(\"abc\").unwrap(), vec![\"abc\"]);\n            assert_eq!(model.encode(\"AB\").unwrap(), vec![\"AB\"]);\n\n            model.set_fuse_unk(false);\n            assert_eq!(model.encode(\"AB\").unwrap(), vec![\"A\", \"B\"]);\n            model.set_fuse_unk(true);\n            assert_eq!(model.encode(\"AB\").unwrap(), vec![\"AB\"]);\n\n            assert_eq!(model.encode(\"abcd\").unwrap(), vec![\"ab\", \"cd\"]);\n            assert_eq!(model.encode(\"abcc\").unwrap(), vec![\"abc\", \"c\"]);\n            assert_eq!(\n                model.encode(\"xabcabaabcdd\").unwrap(),\n                vec![\"x\", \"abc\", \"ab\", \"a\", \"ab\", \"cd\", \"d\"]\n            );\n            model.set_fuse_unk(false);\n            assert_eq!(\n                model.encode(\"xyz東京\").unwrap(),\n                vec![\"x\", \"y\", \"z\", \"東\", \"京\"]\n            );\n            model.set_fuse_unk(true);\n            assert_eq!(model.encode(\"xyz東京\").unwrap(), vec![\"xyz東京\"]);\n\n            // User encoded in original version\n            assert_eq!(model.encode(\"ABC\").unwrap(), vec![\"ABC\"]);\n            assert_eq!(model.encode(\"abABCcd\").unwrap(), vec![\"ab\", \"ABC\", \"cd\"]);\n            assert_eq!(\n                model.encode(\"ababcdabcdcd\").unwrap(),\n                vec![\"ab\", \"abcdabcd\", \"cd\"]\n            );\n            assert_eq!(model.encode(\"abqrcd\").unwrap(), vec![\"ab\", \"q\", \"r\", \"cd\"]);\n        }\n    }\n\n    #[test]\n    fn test_unigram_bytefallback() {\n        // In [97]: processor.encode_as_pieces(\"⅐⅛⅑ \")\n        // Out[97]: ['▁', '<0xE2>', '<0x85>', '<0x90>', '⅛', '<0xE2>', '<0x85>', '<0x91>', '▁']\n        let sentencepieces = vec![\n            (\"<unk>\".to_string(), 0.0),\n            (\"<0xC3>\".to_string(), -0.01),\n            (\"<0xA9>\".to_string(), -0.03),\n        ];\n        let unigram = Unigram::from(sentencepieces, Some(0), true).unwrap();\n        let tokens: Vec<Token> = unigram.tokenize(\"é\").unwrap();\n        assert_eq!(\n            tokens,\n            [\n                Token {\n                    id: 1,\n                    value: \"<0xC3>\".to_string(),\n                    offsets: (0, 2)\n                },\n                Token {\n                    id: 2,\n                    value: \"<0xA9>\".to_string(),\n                    offsets: (0, 2)\n                }\n            ]\n        );\n\n        let tokens = unigram.tokenize(\"?é\").unwrap();\n        assert_eq!(tokens[0].id, 0);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/unigram/serialization.rs",
    "content": "use super::model::Unigram;\nuse serde::{\n    de::{Error, MapAccess, Visitor},\n    ser::SerializeStruct,\n    Deserialize, Deserializer, Serialize, Serializer,\n};\n\nimpl Serialize for Unigram {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut model = serializer.serialize_struct(\"Unigram\", 3)?;\n\n        model.serialize_field(\"type\", \"Unigram\")?;\n        model.serialize_field(\"unk_id\", &self.unk_id)?;\n        model.serialize_field(\"vocab\", &self.vocab)?;\n        model.serialize_field(\"byte_fallback\", &self.byte_fallback())?;\n\n        model.end()\n    }\n}\n\nimpl<'de> Deserialize<'de> for Unigram {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_struct(\n            \"Unigram\",\n            &[\"type\", \"vocab\", \"unk_id\", \"byte_fallback\"],\n            UnigramVisitor,\n        )\n    }\n}\n\nstruct UnigramVisitor;\nimpl<'de> Visitor<'de> for UnigramVisitor {\n    type Value = Unigram;\n\n    fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(fmt, \"struct Unigram\")\n    }\n\n    fn visit_map<V>(self, mut map: V) -> std::result::Result<Self::Value, V::Error>\n    where\n        V: MapAccess<'de>,\n    {\n        let mut vocab: Option<Vec<(String, f64)>> = None;\n        let mut unk_id: Option<usize> = None;\n        let mut byte_fallback: bool = false;\n        while let Some(key) = map.next_key::<String>()? {\n            match key.as_ref() {\n                \"unk_id\" => {\n                    unk_id = map.next_value()?;\n                }\n                \"byte_fallback\" => byte_fallback = map.next_value()?,\n                \"vocab\" => vocab = Some(map.next_value()?),\n                \"type\" => match map.next_value()? {\n                    \"Unigram\" => {}\n                    u => {\n                        return Err(serde::de::Error::invalid_value(\n                            serde::de::Unexpected::Str(u),\n                            &\"Unigram\",\n                        ))\n                    }\n                },\n                _ => (),\n            }\n        }\n        match (vocab, unk_id, byte_fallback) {\n            (Some(vocab), unk_id, byte_fallback) => Ok(Unigram::from(vocab, unk_id, byte_fallback)\n                .map_err(|err| Error::custom(format!(\"Unable to load vocab {err:?}\")))?),\n            (None, _, _) => Err(Error::custom(\"Missing vocab\")),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn test_serialization() {\n        let vocab = vec![(\"<unk>\".to_string(), 0.0), (\"a\".to_string(), -0.5)];\n        let model = Unigram::from(vocab, Some(0), false).unwrap();\n\n        let data = serde_json::to_string(&model).unwrap();\n        let reconstructed = serde_json::from_str(&data).unwrap();\n\n        assert_eq!(model, reconstructed);\n    }\n\n    #[test]\n    fn test_serialization_unk_id_not_zero() {\n        let vocab = vec![(\"a\".to_string(), -0.5), (\"<unk>\".to_string(), 0.0)];\n        let model = Unigram::from(vocab, Some(1), false).unwrap();\n\n        let data = serde_json::to_string(&model).unwrap();\n        let reconstructed = serde_json::from_str(&data).unwrap();\n\n        assert_eq!(model, reconstructed);\n    }\n\n    #[test]\n    fn test_serialization_no_unk_id() {\n        let vocab = vec![(\"a\".to_string(), -0.5)];\n        let model = Unigram::from(vocab, None, false).unwrap();\n\n        let data = serde_json::to_string(&model).unwrap();\n        let reconstructed = serde_json::from_str(&data).unwrap();\n\n        assert_eq!(model, reconstructed);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/unigram/trainer.rs",
    "content": "use crate::models::unigram::{lattice::Lattice, model::Unigram};\nuse crate::tokenizer::{AddedToken, Result, Trainer};\nuse crate::utils::parallelism::*;\nuse crate::utils::progress::{ProgressBar, ProgressStyle};\nuse ahash::{AHashMap, AHashSet};\nuse log::debug;\nuse serde::{Deserialize, Serialize};\nuse std::cmp::Reverse;\nuse std::convert::TryInto;\n\n// A token and a score\ntype SentencePiece = (String, f64);\n\n// A full sentence or word + it's count within the dataset\ntype Sentence = (String, u32);\n\nfn digamma(mut x: f64) -> f64 {\n    let mut result = 0.0;\n    while x < 7.0 {\n        result -= 1.0 / x;\n        x += 1.0;\n    }\n    x -= 1.0 / 2.0;\n    let xx = 1.0 / x;\n    let xx2 = xx * xx;\n    let xx4 = xx2 * xx2;\n    result += x.ln() + (1.0 / 24.0) * xx2 - 7.0 / 960.0 * xx4 + (31.0 / 8064.0) * xx4 * xx2\n        - (127.0 / 30720.0) * xx4 * xx4;\n    result\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum UnigramTrainerError {\n    #[error(\"The vocabulary is not large enough to contain all chars\")]\n    VocabularyTooSmall,\n}\n\nfn to_log_prob(pieces: &mut [SentencePiece]) {\n    let sum: f64 = pieces.iter().map(|(_, score)| score).sum();\n    let logsum = sum.ln();\n    for (_, score) in pieces.iter_mut() {\n        *score = score.ln() - logsum;\n    }\n}\n\n/// A `UnigramTrainer` can train a `Unigram` model from `word_counts`.\n#[non_exhaustive]\n#[derive(Builder, Debug, Clone, Serialize, Deserialize)]\npub struct UnigramTrainer {\n    #[builder(default = \"true\")]\n    pub show_progress: bool,\n    #[builder(default = \"8000\")]\n    pub vocab_size: u32,\n    #[builder(default = \"2\")]\n    pub n_sub_iterations: u32,\n    #[builder(default = \"0.75\")]\n    pub shrinking_factor: f64,\n    #[builder(default = \"vec![]\")]\n    pub special_tokens: Vec<AddedToken>,\n    #[builder(default = \"AHashSet::new()\")]\n    pub initial_alphabet: AHashSet<char>,\n\n    #[builder(default = \"None\")]\n    pub unk_token: Option<String>,\n\n    #[builder(default = \"16\")]\n    pub max_piece_length: usize,\n    #[builder(default = \"1_000_000\")]\n    seed_size: usize,\n    #[builder(default = \"AHashMap::new()\")]\n    words: AHashMap<String, u32>,\n}\n\nimpl Default for UnigramTrainer {\n    fn default() -> Self {\n        Self::builder().build().unwrap()\n    }\n}\n\nimpl UnigramTrainer {\n    pub fn builder() -> UnigramTrainerBuilder {\n        UnigramTrainerBuilder::default()\n    }\n\n    /// Setup a progress bar if asked to show progress\n    fn setup_progress(&self) -> Option<ProgressBar> {\n        if self.show_progress {\n            let p = ProgressBar::new(0);\n            p.set_style(\n                ProgressStyle::default_bar()\n                    .template(\"[{elapsed_precise}] {msg:<30!} {wide_bar} {pos:<9!}/{len:>9!}\")\n                    .expect(\"Invalid progress template\"),\n            );\n            Some(p)\n        } else {\n            None\n        }\n    }\n\n    fn is_valid_sentencepiece(&self, char_string: &[char]) -> bool {\n        // Checks string length\n        // Space not in the substring, numbers, hiragana and more should be taken\n        // care of within pre_tokenizers.\n        // https://github.com/google/sentencepiece/blob/26be9516cd81d5315ee31c48d2438018e0eab879/src/trainer_interface.cc#L203\n        let n = char_string.len();\n        if char_string.is_empty() || n > self.max_piece_length {\n            return false;\n        }\n\n        true\n    }\n\n    fn finalize(&self, model: Unigram, required_chars: AHashSet<String>) -> Result<Unigram> {\n        let mut min_score_penalty = 0.0;\n        let min_score_penalty_delta = 0.0001;\n\n        let mut pieces: Vec<(String, f64)> = vec![];\n        let mut inserted: AHashSet<String> = AHashSet::new();\n\n        // We don't want to include the <UNK> that was used to train\n        inserted.insert(\"<UNK>\".into());\n\n        let existing_pieces: AHashMap<String, f64> = model.iter().cloned().collect();\n        for c in required_chars {\n            if let Some(t) = existing_pieces.get(&c) {\n                inserted.insert(c.clone());\n                pieces.push((c, *t));\n            } else {\n                let score = model.min_score + min_score_penalty;\n\n                inserted.insert(c.clone());\n                pieces.push((c, score));\n                min_score_penalty += min_score_penalty_delta;\n            }\n        }\n\n        let (unk_id, need_add_unk) = if let Some(ref unk) = self.unk_token {\n            let unk_id = self.special_tokens.iter().enumerate().find_map(|(i, t)| {\n                if t.content == *unk {\n                    Some(i)\n                } else {\n                    None\n                }\n            });\n            match unk_id {\n                Some(id) => (Some(id), false),\n                None => (Some(0), true),\n            }\n        } else {\n            (None, false)\n        };\n\n        let vocab_size_without_special_tokens = if need_add_unk {\n            self.vocab_size as usize - self.special_tokens.len() - 1\n        } else {\n            self.vocab_size as usize - self.special_tokens.len()\n        };\n        for (token, score) in model.iter() {\n            if inserted.contains::<str>(token) {\n                continue;\n            }\n            inserted.insert(token.to_string());\n            pieces.push((token.to_string(), if score.is_nan() { 0.0 } else { *score }));\n\n            if pieces.len() == vocab_size_without_special_tokens {\n                break;\n            }\n        }\n        pieces.sort_by(|(_, a), (_, b)| b.partial_cmp(a).unwrap());\n\n        // Insert the necessary tokens\n        let mut special_tokens = self\n            .special_tokens\n            .iter()\n            .map(|t| (t.content.clone(), 0.0))\n            .collect::<Vec<_>>();\n        if need_add_unk {\n            special_tokens.insert(0, (self.unk_token.clone().unwrap(), 0.0));\n        }\n\n        Unigram::from(\n            special_tokens.into_iter().chain(pieces).collect(),\n            unk_id,\n            model.byte_fallback(),\n        )\n    }\n\n    fn required_chars(&self, word_counts: &[Sentence]) -> AHashSet<String> {\n        word_counts\n            .iter()\n            .flat_map(|(s, _count)| s.chars())\n            .chain(self.initial_alphabet.iter().copied())\n            .map(|c| c.to_string())\n            .collect()\n    }\n    fn make_seed_sentence_pieces(\n        &self,\n        sentences: &[Sentence],\n        _progress: &Option<ProgressBar>,\n    ) -> Vec<SentencePiece> {\n        // Put all sentences in a string, separated by \\0\n        let total: usize = sentences\n            .iter()\n            .map(|(s, _)| s.chars().count())\n            .sum::<usize>()\n            + sentences.len();\n        let mut flat_string = String::with_capacity(total);\n        let mut all_chars: AHashMap<char, u32> = AHashMap::new();\n        let c_sentence_boundary = '\\0';\n        let k_sentence_boundary = '\\0'.to_string();\n        for (string, n) in sentences {\n            if string.is_empty() {\n                continue;\n            }\n            flat_string.push_str(string);\n            // XXX\n            // Comment suggests we add sentence boundary, but it seems to be missing from actual\n            // code in spm.\n            flat_string.push_str(&k_sentence_boundary);\n            for c in string.chars() {\n                if c != c_sentence_boundary {\n                    *all_chars.entry(c).or_insert(0) += n;\n                }\n            }\n        }\n        flat_string.shrink_to_fit();\n        #[cfg(feature = \"esaxx_fast\")]\n        let suffix = esaxx_rs::suffix(&flat_string).unwrap();\n        #[cfg(not(feature = \"esaxx_fast\"))]\n        let suffix = esaxx_rs::suffix_rs(&flat_string).unwrap();\n\n        //  Basic chars need to be in sentence pieces.\n        let mut seed_sentencepieces: Vec<SentencePiece> = vec![];\n\n        let mut sall_chars: Vec<_> = all_chars.into_iter().map(|(a, b)| (b, a)).collect();\n        // Reversed order\n        sall_chars.sort_by_key(|&a| Reverse(a));\n        let mut substr_index: Vec<_> = suffix\n            .iter()\n            .filter_map(|(string, freq)| {\n                if string.len() <= 1 {\n                    return None;\n                }\n                if string.contains(&c_sentence_boundary) {\n                    return None;\n                }\n                if !self.is_valid_sentencepiece(string) {\n                    return None;\n                }\n                let score = freq * string.len() as u32;\n                // if let Some(p) = &progress {\n                //     p.inc(1);\n                // }\n                Some((score, string))\n            })\n            .collect();\n\n        // Fill seed_sentencepieces\n        for (count, character) in sall_chars {\n            seed_sentencepieces.push((character.to_string(), count.into()));\n        }\n\n        // sort by decreasing score\n        substr_index.sort_by_key(|&a| Reverse(a));\n        for (score, char_string) in substr_index {\n            // Just in case\n            assert!(self.is_valid_sentencepiece(char_string));\n            let string: String = char_string.iter().collect();\n            seed_sentencepieces.push((string, score.into()));\n            if seed_sentencepieces.len() >= self.seed_size {\n                break;\n            }\n        }\n        to_log_prob(&mut seed_sentencepieces);\n        seed_sentencepieces\n    }\n    fn prune_sentence_pieces(\n        &self,\n        model: &Unigram,\n        pieces: &[SentencePiece],\n        sentences: &[Sentence],\n    ) -> Vec<SentencePiece> {\n        let mut always_keep = vec![true; pieces.len()];\n        let mut alternatives: Vec<Vec<usize>> = vec![Vec::new(); pieces.len()];\n\n        let bos_id = pieces.len() + 1;\n        let eos_id = pieces.len() + 2;\n\n        // First, segments the current sentencepieces to know\n        // how each sentencepiece is resegmented if this sentencepiece is removed\n        // from the vocabulary.\n        // To do so, we take the second best segmentation of sentencepiece[i].\n        // alternatives[i] stores the sequence of second best sentencepieces.\n        for (id, (token, _score)) in pieces.iter().enumerate() {\n            // Always keep unk.\n            if id == 0 {\n                always_keep[id] = false;\n                continue;\n            }\n            let mut lattice = Lattice::from(token, bos_id, eos_id);\n            model.populate_nodes(&mut lattice);\n\n            let nbests = lattice.nbest(2);\n            if nbests.len() == 1 {\n                always_keep[id] = true;\n            } else if nbests[0].len() >= 2 {\n                always_keep[id] = false;\n            } else if nbests[0].len() == 1 {\n                always_keep[id] = true;\n                for node in &nbests[1] {\n                    let alt_id = node.borrow().id;\n                    alternatives[id].push(alt_id);\n                }\n            }\n        }\n\n        // Second, segments all sentences to compute likelihood\n        // with a unigram language model. inverted[i] stores\n        // the set of sentence index where the sentencepieces[i] appears.\n        let chunk_size = std::cmp::max(sentences.len() / current_num_threads(), 1);\n        let indexed_sentences: Vec<(usize, &Sentence)> = sentences.iter().enumerate().collect();\n        let collected: (f64, Vec<f64>, Vec<Vec<usize>>) = indexed_sentences\n            .maybe_par_chunks(chunk_size)\n            .map(|enumerated_sentence_count_chunk| {\n                let mut vsum = 0.0;\n                let mut freq: Vec<f64> = vec![0.0; pieces.len()];\n                let mut inverted: Vec<Vec<usize>> = vec![Vec::new(); pieces.len()];\n\n                for (i, (sentence, count)) in enumerated_sentence_count_chunk {\n                    let mut lattice = Lattice::from(sentence, bos_id, eos_id);\n                    model.populate_nodes(&mut lattice);\n                    vsum += *count as f64;\n                    for node_ref in lattice.viterbi() {\n                        let id = node_ref.borrow().id;\n                        freq[id] += *count as f64;\n                        inverted[id].push(*i);\n                    }\n                }\n                (vsum, freq, inverted)\n            })\n            .reduce(\n                || (0.0, vec![0.0; pieces.len()], vec![Vec::new(); pieces.len()]),\n                |(vsum, freq, inverted), (lvsum, lfreq, linverted)| {\n                    (\n                        vsum + lvsum,\n                        freq.iter()\n                            .zip(lfreq)\n                            .map(|(global_el, local_el)| global_el + local_el)\n                            .collect(),\n                        inverted\n                            .iter()\n                            .zip(linverted)\n                            .map(|(global_el, local_el)| [&global_el[..], &local_el[..]].concat())\n                            .collect(),\n                    )\n                },\n            );\n\n        let (vsum, freq, inverted) = collected;\n\n        let sum: f64 = freq.iter().sum();\n        let logsum = sum.ln();\n        let mut candidates: Vec<(usize, f64)> = vec![];\n        let mut new_pieces: Vec<SentencePiece> = Vec::with_capacity(self.vocab_size as usize);\n        new_pieces.push(pieces[0].clone());\n\n        // Finally, computes how likely the LM likelihood is reduced if\n        // the sentencepiece[i] is removed from the vocabulary.\n        // Since the exact computation of loss is difficult, we compute the\n        // loss approximately by assuming that all sentencepiece[i] in the sentences\n        // are replaced with alternatives[i] when sentencepiece[i] is removed.\n        for (id, (token, score)) in pieces.iter().enumerate() {\n            if id == 0 {\n                continue;\n            }\n            if freq[id] == 0.0 && !always_keep[id] {\n                // not found in Viterbi path. Can remove this entry safely.\n                continue;\n            } else if alternatives[id].is_empty() {\n                // no alternatives. Keeps this entry.\n                new_pieces.push((token.to_string(), *score));\n            } else {\n                let mut f = 0.0; // the frequency of pieces[i];\n\n                for n in &inverted[id] {\n                    let score = sentences[*n].1 as f64;\n                    f += score;\n                }\n                // TODO: Temporary hack to avoid Nans.\n                if f == 0.0 || f.is_nan() {\n                    // new_pieces.push((token.to_string(), *score));\n                    continue;\n                }\n                f /= vsum; // normalizes by all sentence frequency.\n                let logprob_sp = freq[id].ln() - logsum;\n\n                // After removing the sentencepiece[i], its frequency freq[i] is\n                // re-assigned to alternatives.\n                // new_sum = current_sum - freq[i] + freq[i] * alternatives.size()\n                //         = current_sum + freq[i] (alternatives - 1)\n\n                let logsum_alt = (sum + freq[id] * (alternatives.len() - 1) as f64).ln();\n\n                // The frequencies of alternatives are increased by freq[i].\n                let mut logprob_alt = 0.0;\n                for n in &alternatives[id] {\n                    logprob_alt += (freq[*n] + freq[id]).ln() - logsum_alt;\n                }\n\n                // loss: the diff of likelihood after removing the sentencepieces[i].\n                let loss = f * (logprob_sp - logprob_alt);\n                if loss.is_nan() {\n                    panic!(\"\");\n                }\n\n                candidates.push((id, loss));\n            }\n        }\n        let desired_vocab_size: usize = (self.vocab_size as usize * 11) / 10; // * 1.1\n        let pruned_size: usize = ((pieces.len() as f64) * self.shrinking_factor) as usize;\n        let pruned_size = desired_vocab_size.max(pruned_size);\n\n        candidates.sort_by(|(_, a), (_, b)| b.partial_cmp(a).unwrap());\n        for (id, _score) in candidates {\n            if new_pieces.len() == pruned_size {\n                break;\n            }\n            new_pieces.push(pieces[id].clone());\n        }\n\n        new_pieces\n    }\n\n    /// Update the progress bar with the new provided length and message\n    fn update_progress(&self, p: &Option<ProgressBar>, len: usize, message: &'static str) {\n        if let Some(p) = p {\n            p.set_message(message);\n            p.set_length(len as u64);\n            p.reset();\n        }\n    }\n    /// Set the progress bar in the finish state\n    fn finalize_progress(&self, p: &Option<ProgressBar>, final_len: usize) {\n        if let Some(p) = p {\n            p.set_length(final_len as u64);\n            p.finish();\n            println!();\n        }\n    }\n\n    fn run_e_step(&self, model: &Unigram, sentences: &[Sentence]) -> (f64, u32, Vec<f64>) {\n        let all_sentence_freq: u32 = sentences.iter().map(|(_a, b)| *b).sum();\n\n        let chunk_size = std::cmp::max(sentences.len() / current_num_threads(), 1);\n        let collected: (f64, u32, Vec<f64>) = sentences\n            .maybe_par_chunks(chunk_size)\n            .map(|sentences_chunk| {\n                let mut expected: Vec<f64> = vec![0.0; model.len()];\n                let mut objs: f64 = 0.0;\n                let mut ntokens: u32 = 0;\n\n                for (string, freq) in sentences_chunk {\n                    let mut lattice = Lattice::from(string, model.bos_id, model.eos_id);\n                    model.populate_nodes(&mut lattice);\n\n                    let z: f64 = lattice.populate_marginal(*freq as f64, &mut expected);\n                    if z.is_nan() {\n                        panic!(\"likelihood is NAN. Input sentence may be too long.\");\n                    }\n                    ntokens += lattice.viterbi().len() as u32;\n                    objs -= z / (all_sentence_freq as f64);\n                }\n                (objs, ntokens, expected)\n            })\n            .reduce(\n                || (0.0, 0, vec![0.0; model.len()]),\n                |(objs, ntokens, expected), (lobjs, lntokens, lexpected)| {\n                    (\n                        objs + lobjs,\n                        ntokens + lntokens,\n                        expected\n                            .iter()\n                            .zip(lexpected)\n                            .map(|(global_el, local_el)| global_el + local_el)\n                            .collect(),\n                    )\n                },\n            );\n\n        collected\n    }\n    fn run_m_step(&self, pieces: &[SentencePiece], expected: &[f64]) -> Vec<SentencePiece> {\n        if pieces.len() != expected.len() {\n            panic!(\n                \"Those two iterators are supposed to be the same length ({} vs {})\",\n                pieces.len(),\n                expected.len()\n            );\n        }\n        let mut new_pieces: Vec<SentencePiece> =\n            Vec::with_capacity(self.vocab_size.try_into().unwrap());\n\n        let mut sum = 0.0;\n        let expected_frequency_threshold = 0.5;\n\n        for (i, (freq, (piece, _score))) in expected.iter().zip(pieces).enumerate() {\n            // Always keep unk.\n            if i == 0 {\n                new_pieces.push((piece.clone(), f64::NAN));\n                continue;\n            }\n            if *freq < expected_frequency_threshold {\n                continue;\n            }\n            new_pieces.push((piece.clone(), *freq));\n            sum += freq;\n        }\n        // // Here we do not use the original EM, but use the\n        // // Bayesianified/DPified EM algorithm.\n        // // https://cs.stanford.edu/~pliang/papers/tutorial-acl2007-talk.pdf\n        // // This modification will act as a sparse prior.\n        let logsum = digamma(sum);\n        let new_pieces: Vec<_> = new_pieces\n            .into_iter()\n            .map(|(s, c)| (s, digamma(c) - logsum))\n            .collect();\n        new_pieces\n    }\n    pub fn do_train(\n        &self,\n        sentences: Vec<Sentence>,\n        model: &mut Unigram,\n    ) -> Result<Vec<AddedToken>> {\n        let progress = self.setup_progress();\n        //\n        // 1. Compute frequent substrings\n        // TODO Should be able to upgrade to u64 when needed\n        self.update_progress(&progress, sentences.len(), \"Suffix array seeds\");\n        let mut pieces: Vec<SentencePiece> =\n            Vec::with_capacity(self.vocab_size.try_into().unwrap());\n\n        // We use a UNK token when training, whatever the `self.unk_token`\n        pieces.push((\"<UNK>\".into(), f64::NAN));\n        pieces.extend(self.make_seed_sentence_pieces(&sentences, &progress));\n        self.finalize_progress(&progress, sentences.len());\n\n        // Useful to check compatibility with spm.\n        debug!(\n            \"Using {} pieces on {} sentences for EM training\",\n            pieces.len(),\n            sentences.len()\n        );\n\n        let desired_vocab_size: usize = (self.vocab_size as usize * 11) / 10; // * 1.1\n\n        // 2. Run E-M Loops to fine grain the pieces.\n        // We will shrink the vocab by shrinking_factor every loop on average\n        // Some other pieces are dropped if logprob is too small\n        // V = N * (f)**k\n        // k = log(V / N) / log(f)\n        let expected_loops = (((desired_vocab_size as f64).ln() - (pieces.len() as f64).ln())\n            / self.shrinking_factor.ln()) as usize\n            + 1;\n        let expected_updates = expected_loops * self.n_sub_iterations as usize;\n        self.update_progress(&progress, expected_updates, \"EM training\");\n        let required_chars = self.required_chars(&sentences);\n        if required_chars.len() as u32 > self.vocab_size {\n            return Err(Box::new(UnigramTrainerError::VocabularyTooSmall));\n        }\n        let mut new_model = Unigram::from(pieces.clone(), Some(0), false)?;\n        loop {\n            // Sub-EM iteration.\n            for _iter in 0..self.n_sub_iterations {\n                // Executes E step\n                let (_objective, _num_tokens, expected) = self.run_e_step(&new_model, &sentences);\n\n                // Executes M step.\n                pieces = self.run_m_step(&pieces, &expected);\n                new_model = Unigram::from(pieces.clone(), Some(0), false)?;\n\n                // Useful comment for checking compatibility with spm\n                debug!(\n                    \"Em iter={} size={} obj={} num_tokens={} num_tokens/piece={}\",\n                    _iter,\n                    new_model.len(),\n                    _objective,\n                    _num_tokens,\n                    _num_tokens as f64 / model.len() as f64\n                );\n                if let Some(p) = &progress {\n                    p.inc(1);\n                }\n            } // end of Sub EM iteration\n\n            // Stops the iteration when the size of sentences reaches to the\n            // desired symbol size.\n            if pieces.len() <= desired_vocab_size {\n                break;\n            }\n\n            // Prunes pieces.\n            pieces = self.prune_sentence_pieces(&new_model, &pieces, &sentences);\n            new_model = Unigram::from(pieces.clone(), Some(0), false)?;\n        }\n        self.finalize_progress(&progress, expected_updates);\n\n        // Finally, adjusts the size of sentencepices to be |vocab_size|.\n        *model = self.finalize(new_model, required_chars)?;\n\n        Ok(self.special_tokens.clone())\n    }\n}\n\nimpl Trainer for UnigramTrainer {\n    type Model = Unigram;\n\n    /// Train a Unigram model\n    fn train(&self, model: &mut Unigram) -> Result<Vec<AddedToken>> {\n        let sentences: Vec<_> = self.words.iter().map(|(s, i)| (s.to_owned(), *i)).collect();\n        self.do_train(sentences, model)\n    }\n\n    /// Whether we should show progress\n    fn should_show_progress(&self) -> bool {\n        self.show_progress\n    }\n\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> Result<Vec<String>> + Sync,\n    {\n        let words: Result<AHashMap<String, u32>> = iterator\n            .maybe_par_bridge()\n            .map(|sequence| {\n                let words = process(sequence.as_ref())?;\n                let mut map = AHashMap::new();\n                for word in words {\n                    *map.entry(word).or_default() += 1;\n                }\n                Ok(map)\n            })\n            .reduce(\n                || Ok(AHashMap::new()),\n                |acc, ws| {\n                    let mut acc = acc?;\n                    for (k, v) in ws? {\n                        *acc.entry(k).or_default() += v;\n                    }\n                    Ok(acc)\n                },\n            );\n\n        self.words = words?;\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use assert_approx_eq::assert_approx_eq;\n    use std::iter::FromIterator;\n\n    #[test]\n    fn test_unigram_chars() {\n        let trainer = UnigramTrainerBuilder::default()\n            .show_progress(false)\n            .build()\n            .unwrap();\n\n        let sentences = vec![\n            (\"This is a\".to_string(), 1),\n            (\"こんにちは友達\".to_string(), 1),\n        ];\n\n        let required_chars = trainer.required_chars(&sentences);\n        assert_eq!(required_chars.len(), 13);\n\n        let progress = None;\n        let table = trainer.make_seed_sentence_pieces(&sentences, &progress);\n\n        let target_strings = vec![\n            \"s\", \"i\", \" \", \"達\", \"友\", \"ん\", \"は\", \"に\", \"ち\", \"こ\", \"h\", \"a\", \"T\", \"is \", \"s \",\n        ];\n\n        let strings: Vec<_> = table.iter().map(|(string, _)| string).collect();\n        assert_eq!(strings, target_strings);\n\n        let scores = table.iter().map(|(_, score)| score);\n        let target_scores = vec![\n            -2.5649493574615367, // 2.0\n            -2.5649493574615367, // 2.0\n            -2.5649493574615367, // 2.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -3.258096538021482,  // 1.0\n            -1.4663370687934272, // 6.0\n            -1.8718021769015916, // 4.0\n        ];\n\n        for (score, target_score) in scores.zip(target_scores) {\n            assert_approx_eq!(*score, target_score, 0.01);\n        }\n    }\n\n    #[test]\n    fn test_initial_alphabet() {\n        let trainer = UnigramTrainerBuilder::default()\n            .show_progress(false)\n            .initial_alphabet(AHashSet::from_iter(vec!['a', 'b', 'c', 'd', 'e', 'f']))\n            .build()\n            .unwrap();\n\n        let sentences = vec![(\"こんにちは友達\".to_string(), 1)];\n        let required_chars = trainer.required_chars(&sentences);\n        assert_eq!(\n            required_chars,\n            vec![\"こ\", \"ん\", \"に\", \"ち\", \"は\", \"友\", \"達\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"]\n                .into_iter()\n                .map(|s| s.to_owned())\n                .collect::<AHashSet<_>>()\n        );\n    }\n\n    #[test]\n    fn test_unk_token() {\n        // 1. Should add `unk_token` as first special token\n        let trainer = UnigramTrainerBuilder::default()\n            .show_progress(false)\n            .special_tokens(vec![\n                AddedToken::from(\"[SEP]\", true),\n                AddedToken::from(\"[CLS]\", true),\n            ])\n            .unk_token(Some(\"[UNK]\".into()))\n            .build()\n            .unwrap();\n\n        let mut unigram = Unigram::default();\n        trainer\n            .do_train(vec![(\"The\".into(), 12), (\"are\".into(), 11)], &mut unigram)\n            .unwrap();\n\n        let mut pieces = unigram.iter();\n        assert_eq!(pieces.next(), Some(&(\"[UNK]\".into(), 0.0)));\n        assert_eq!(pieces.next(), Some(&(\"[SEP]\".into(), 0.0)));\n        assert_eq!(pieces.next(), Some(&(\"[CLS]\".into(), 0.0)));\n\n        // 2. Let it where it is\n        let trainer = UnigramTrainerBuilder::default()\n            .show_progress(false)\n            .special_tokens(vec![\n                AddedToken::from(\"[SEP]\", true),\n                AddedToken::from(\"[CLS]\", true),\n                AddedToken::from(\"[UNK]\", true),\n            ])\n            .unk_token(Some(\"[UNK]\".into()))\n            .build()\n            .unwrap();\n\n        let mut unigram = Unigram::default();\n        trainer\n            .do_train(vec![(\"The\".into(), 12), (\"are\".into(), 11)], &mut unigram)\n            .unwrap();\n\n        let mut pieces = unigram.iter();\n        assert_eq!(pieces.next(), Some(&(\"[SEP]\".into(), 0.0)));\n        assert_eq!(pieces.next(), Some(&(\"[CLS]\".into(), 0.0)));\n        assert_eq!(pieces.next(), Some(&(\"[UNK]\".into(), 0.0)));\n\n        // 3. Don't put it there if not needed\n        let trainer = UnigramTrainerBuilder::default()\n            .show_progress(false)\n            .build()\n            .unwrap();\n\n        let mut unigram = Unigram::default();\n        trainer\n            .do_train(vec![(\"The\".into(), 12), (\"are\".into(), 11)], &mut unigram)\n            .unwrap();\n\n        let mut pieces = unigram.iter();\n        assert_eq!(pieces.next().unwrap().0, \"e\".to_string());\n    }\n\n    #[test]\n    fn test_special_tokens() {\n        let trainer = UnigramTrainerBuilder::default()\n            .show_progress(false)\n            .special_tokens(vec![\n                AddedToken::from(\"[SEP]\", true),\n                AddedToken::from(\"[CLS]\", true),\n            ])\n            .build()\n            .unwrap();\n\n        let mut unigram = Unigram::default();\n        trainer\n            .do_train(vec![(\"The\".into(), 12), (\"are\".into(), 11)], &mut unigram)\n            .unwrap();\n\n        let mut pieces = unigram.iter();\n        assert_eq!(pieces.next(), Some(&(\"[SEP]\".into(), 0.0)));\n        assert_eq!(pieces.next(), Some(&(\"[CLS]\".into(), 0.0)));\n    }\n\n    #[test]\n    fn test_to_log_prob() {\n        let mut a = vec![(\"\".to_string(), 1.0), (\"\".to_string(), 2.0)];\n        to_log_prob(&mut a);\n        let scores = a.iter().map(|(_, score)| *score).collect::<Vec<_>>();\n        // ln(1) - ln(3)\n        assert_approx_eq!(scores[0], -1.098, 0.01);\n        // ln(2) - ln(3)\n        assert_approx_eq!(scores[1], -0.405, 0.01);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/unigram/trie.rs",
    "content": "use ahash::AHashMap;\nuse std::hash::Hash;\n\n#[derive(Default)]\npub struct TrieBuilder<Label> {\n    trie: Trie<Label>,\n}\n\nimpl<Label: Eq + Hash + Copy> TrieBuilder<Label> {\n    pub fn push(&mut self, element: &[Label]) {\n        self.trie.push(element);\n    }\n\n    pub fn build(self) -> Trie<Label> {\n        self.trie\n    }\n}\n\n#[derive(Clone)]\npub struct Trie<Label> {\n    root: Node<Label>,\n}\n\nimpl<Label: Eq + Hash + Copy> Trie<Label> {\n    pub fn push(&mut self, element: &[Label]) {\n        let mut node = &mut self.root;\n        for label in element.iter() {\n            node = node.children.entry(*label).or_default();\n        }\n        node.is_leaf = true;\n    }\n\n    pub fn common_prefix_search<T>(&self, iterator: T) -> TrieIterator<'_, Label, T>\n    where\n        T: Iterator<Item = Label>,\n    {\n        TrieIterator {\n            node: &self.root,\n            prefix: vec![],\n            iterator,\n        }\n    }\n}\n\npub struct TrieIterator<'a, Label, T> {\n    node: &'a Node<Label>,\n    prefix: Vec<Label>,\n    iterator: T,\n}\n\nimpl<Label, T> Iterator for TrieIterator<'_, Label, T>\nwhere\n    Label: Eq + Hash + Copy,\n    T: Iterator<Item = Label>,\n{\n    type Item = Vec<Label>;\n    fn next(&mut self) -> Option<Self::Item> {\n        loop {\n            let label = self.iterator.next()?;\n            self.prefix.push(label);\n            let child = self.node.children.get(&label)?;\n            self.node = child;\n            if self.node.is_leaf {\n                return Some(self.prefix.clone());\n            }\n        }\n    }\n}\n\nimpl<Label> Default for Trie<Label> {\n    fn default() -> Self {\n        Self {\n            root: Node::default(),\n        }\n    }\n}\n\n#[derive(Clone)]\npub struct Node<Label> {\n    is_leaf: bool,\n    children: AHashMap<Label, Node<Label>>,\n}\n\nimpl<Label> Default for Node<Label> {\n    fn default() -> Self {\n        Self {\n            is_leaf: false,\n            children: AHashMap::new(),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/wordlevel/mod.rs",
    "content": "use super::OrderedVocabIter;\nuse crate::tokenizer::{Model, Result, Token};\nuse ahash::AHashMap;\nuse serde_json::Value;\nuse std::collections::HashMap;\nuse std::fs::File;\nuse std::io::{BufReader, Read, Write};\nuse std::path::{Path, PathBuf};\n\nmod serialization;\nmod trainer;\n\n// Re-export\npub use trainer::*;\n\ntype Vocab = AHashMap<String, u32>;\n\n#[derive(thiserror::Error, Debug)]\npub enum Error {\n    #[error(\"WordLevel error: Missing [UNK] token from the vocabulary\")]\n    MissingUnkToken,\n    #[error(\"Bad vocabulary json file\")]\n    BadVocabulary,\n}\n\nstruct Config {\n    files: Option<String>,\n    vocab: AHashMap<String, u32>,\n    unk_token: String,\n}\n\n/// A `WordLevelBuilder` can be used to create a `WordLevel`\n/// model with a custom configuration.\npub struct WordLevelBuilder {\n    config: Config,\n}\n\nimpl Default for WordLevelBuilder {\n    fn default() -> Self {\n        Self {\n            config: Config {\n                files: None,\n                vocab: AHashMap::new(),\n                unk_token: String::from(\"<unk>\"),\n            },\n        }\n    }\n}\n\nimpl WordLevelBuilder {\n    /// Construct a new `WordLevelBuilder`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set the input files.\n    #[must_use]\n    pub fn files(mut self, vocab: String) -> Self {\n        self.config.files = Some(vocab);\n        self\n    }\n\n    /// Set the vocab (token -> ID) mapping.\n    #[must_use]\n    pub fn vocab(mut self, vocab: AHashMap<String, u32>) -> Self {\n        self.config.vocab = vocab;\n        self\n    }\n\n    /// The the `UNK` token for the vocab.\n    #[must_use]\n    pub fn unk_token(mut self, unk_token: String) -> Self {\n        self.config.unk_token = unk_token;\n        self\n    }\n\n    /// Constructs a `WordLevel` model that uses the `WordLevelBuilder`'s configuration.\n    pub fn build(mut self) -> Result<WordLevel> {\n        if let Some(vocab) = self.config.files {\n            self.config.vocab = WordLevel::read_file(&vocab)?;\n        }\n\n        let vocab_r = self\n            .config\n            .vocab\n            .iter()\n            .map(|(key, val)| (*val, key.to_owned()))\n            .collect();\n\n        Ok(WordLevel {\n            vocab: self.config.vocab,\n            vocab_r,\n            unk_token: self.config.unk_token,\n        })\n    }\n}\n\n#[derive(PartialEq, Clone, Eq)]\npub struct WordLevel {\n    vocab: AHashMap<String, u32>,\n    vocab_r: AHashMap<u32, String>,\n    pub unk_token: String,\n}\n\nimpl std::fmt::Debug for WordLevel {\n    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        fmt.debug_struct(\"WordLevel\")\n            .field(\"unk_token\", &self.unk_token)\n            .field(\"vocab\", &self.vocab.len())\n            .finish()\n    }\n}\n\nimpl WordLevel {\n    pub fn builder() -> WordLevelBuilder {\n        WordLevelBuilder::new()\n    }\n\n    pub fn read_file(vocab_path: &str) -> Result<Vocab> {\n        let vocab_file = File::open(vocab_path)?;\n        let mut vocab_file = BufReader::new(vocab_file);\n        let mut buffer = String::new();\n        let mut vocab = AHashMap::new();\n\n        vocab_file.read_to_string(&mut buffer)?;\n        let json: Value = serde_json::from_str(&buffer)?;\n\n        match json {\n            Value::Object(m) => {\n                for (token, id) in m {\n                    if let Value::Number(id) = id {\n                        let id = id.as_u64().ok_or(Error::BadVocabulary)? as u32;\n                        vocab.insert(token, id);\n                    }\n                }\n            }\n            _ => return Err(Box::new(Error::BadVocabulary)),\n        };\n        Ok(vocab)\n    }\n\n    /// Initialize a WordLevel model from vocab and merges file.\n    pub fn from_file(vocab_path: &str, unk_token: String) -> Result<WordLevel> {\n        let vocab = WordLevel::read_file(vocab_path)?;\n        Self::builder().vocab(vocab).unk_token(unk_token).build()\n    }\n}\n\nimpl Default for WordLevel {\n    fn default() -> Self {\n        Self {\n            vocab: AHashMap::new(),\n            vocab_r: AHashMap::new(),\n            unk_token: String::from(\"<unk>\"),\n        }\n    }\n}\n\nimpl Model for WordLevel {\n    type Trainer = WordLevelTrainer;\n\n    fn tokenize(&self, token: &str) -> Result<Vec<Token>> {\n        if let Some(&id) = self.vocab.get(token) {\n            Ok(vec![Token {\n                id,\n                value: token.to_owned(),\n                offsets: (0, token.len()),\n            }])\n        } else if let Some(&unk_id) = self.vocab.get(&self.unk_token) {\n            Ok(vec![Token {\n                id: unk_id,\n                value: self.unk_token.to_owned(),\n                offsets: (0, token.len()),\n            }])\n        } else {\n            Err(Box::new(Error::MissingUnkToken))\n        }\n    }\n\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.vocab.get(token).copied()\n    }\n\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.vocab_r.get(&id).cloned()\n    }\n\n    fn get_vocab(&self) -> HashMap<String, u32> {\n        self.vocab.clone().into_iter().collect()\n    }\n\n    fn get_vocab_size(&self) -> usize {\n        self.vocab.keys().len()\n    }\n\n    fn save(&self, folder: &Path, name: Option<&str>) -> Result<Vec<PathBuf>> {\n        let vocab_file_name = match name {\n            Some(name) => format!(\"{name}-vocab.json\"),\n            None => \"vocab.json\".to_string(),\n        };\n\n        // Write vocab.json\n        let vocab_path: PathBuf = [folder, Path::new(vocab_file_name.as_str())]\n            .iter()\n            .collect();\n        let mut vocab_file = File::create(&vocab_path)?;\n        let order_vocab_iter = OrderedVocabIter::new(&self.vocab_r);\n        let serialized = serde_json::to_string(&order_vocab_iter)?;\n        vocab_file.write_all(serialized.as_bytes())?;\n\n        Ok(vec![vocab_path])\n    }\n\n    fn get_trainer(&self) -> Self::Trainer {\n        WordLevelTrainer::default()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_tokenize_unk() {\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"a\".into(), 1), (\"b\".into(), 2)]\n            .iter()\n            .cloned()\n            .collect();\n        let wordlevel = WordLevelBuilder::default()\n            .vocab(vocab)\n            .unk_token(\"<unk>\".to_string())\n            .build()\n            .unwrap();\n        let tokens = wordlevel.tokenize(\"c\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \"<unk>\".into(), (0, 1)),]);\n\n        let tokens = wordlevel.tokenize(\"a\").unwrap();\n        assert_eq!(tokens, vec![Token::new(1u32, \"a\".into(), (0, 1)),]);\n    }\n\n    #[test]\n    fn test_tokenize_missing_unk_token() {\n        let vocab: Vocab = [(\"a\".into(), 0), (\"b\".into(), 1)].iter().cloned().collect();\n        let wordlevel = WordLevelBuilder::default().vocab(vocab).build().unwrap();\n        let tokens = wordlevel.tokenize(\"a\").unwrap();\n        assert_eq!(tokens, vec![Token::new(0u32, \"a\".into(), (0, 1)),]);\n\n        let error = wordlevel.tokenize(\"c\").err().unwrap();\n        assert!(error.is::<Error>());\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/wordlevel/serialization.rs",
    "content": "use super::{super::OrderedVocabIter, WordLevel, WordLevelBuilder};\nuse ahash::AHashSet;\nuse serde::{\n    de::{MapAccess, Visitor},\n    ser::SerializeStruct,\n    Deserialize, Deserializer, Serialize, Serializer,\n};\n\nimpl Serialize for WordLevel {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut model = serializer.serialize_struct(\"WordLevel\", 3)?;\n        let ordered_vocab = OrderedVocabIter::new(&self.vocab_r);\n        model.serialize_field(\"type\", \"WordLevel\")?;\n        model.serialize_field(\"vocab\", &ordered_vocab)?;\n        model.serialize_field(\"unk_token\", &self.unk_token)?;\n        model.end()\n    }\n}\n\nimpl<'de> Deserialize<'de> for WordLevel {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_struct(\n            \"WordLevel\",\n            &[\"type\", \"vocab\", \"unk_token\"],\n            WordLevelVisitor,\n        )\n    }\n}\n\nstruct WordLevelVisitor;\nimpl<'de> Visitor<'de> for WordLevelVisitor {\n    type Value = WordLevel;\n\n    fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(fmt, \"struct WordLevel\")\n    }\n\n    fn visit_map<V>(self, mut map: V) -> std::result::Result<Self::Value, V::Error>\n    where\n        V: MapAccess<'de>,\n    {\n        let mut builder = WordLevelBuilder::new();\n        let mut missing_fields = vec![\n            // for retrocompatibility the \"type\" field is not mandatory\n            \"unk_token\",\n            \"vocab\",\n        ]\n        .into_iter()\n        .collect::<AHashSet<_>>();\n        while let Some(key) = map.next_key::<String>()? {\n            match key.as_ref() {\n                \"vocab\" => builder = builder.vocab(map.next_value()?),\n                \"unk_token\" => builder = builder.unk_token(map.next_value()?),\n                \"type\" => match map.next_value()? {\n                    \"WordLevel\" => {}\n                    u => {\n                        return Err(serde::de::Error::invalid_value(\n                            serde::de::Unexpected::Str(u),\n                            &\"WordLevel\",\n                        ))\n                    }\n                },\n                _ => {}\n            }\n            missing_fields.remove::<str>(&key);\n        }\n\n        if !missing_fields.is_empty() {\n            Err(serde::de::Error::missing_field(\n                missing_fields.iter().next().unwrap(),\n            ))\n        } else {\n            Ok(builder.build().map_err(serde::de::Error::custom)?)\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::models::wordlevel::{Vocab, WordLevel, WordLevelBuilder};\n\n    #[test]\n    fn serde() {\n        let wl = WordLevel::default();\n        let wl_s = r#\"{\"type\":\"WordLevel\",\"vocab\":{},\"unk_token\":\"<unk>\"}\"#;\n\n        assert_eq!(serde_json::to_string(&wl).unwrap(), wl_s);\n        assert_eq!(serde_json::from_str::<WordLevel>(wl_s).unwrap(), wl);\n    }\n\n    #[test]\n    fn incomplete_vocab() {\n        let vocab: Vocab = [(\"<unk>\".into(), 0), (\"b\".into(), 2)]\n            .iter()\n            .cloned()\n            .collect();\n        let wordlevel = WordLevelBuilder::default()\n            .vocab(vocab)\n            .unk_token(\"<unk>\".to_string())\n            .build()\n            .unwrap();\n        let wl_s = r#\"{\"type\":\"WordLevel\",\"vocab\":{\"<unk>\":0,\"b\":2},\"unk_token\":\"<unk>\"}\"#;\n        assert_eq!(serde_json::to_string(&wordlevel).unwrap(), wl_s);\n        assert_eq!(serde_json::from_str::<WordLevel>(wl_s).unwrap(), wordlevel);\n    }\n\n    #[test]\n    fn deserialization_should_fail() {\n        let missing_unk = r#\"{\"type\":\"WordLevel\",\"vocab\":{}}\"#;\n        assert!(serde_json::from_str::<WordLevel>(missing_unk)\n            .unwrap_err()\n            .to_string()\n            .starts_with(\"missing field `unk_token`\"));\n\n        let wrong_type = r#\"{\"type\":\"WordPiece\",\"vocab\":{}}\"#;\n        assert!(serde_json::from_str::<WordLevel>(wrong_type)\n            .unwrap_err()\n            .to_string()\n            .starts_with(\"invalid value: string \\\"WordPiece\\\", expected WordLevel\"));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/wordlevel/trainer.rs",
    "content": "use super::WordLevel;\nuse crate::utils::parallelism::*;\nuse crate::{AddedToken, Result, Trainer};\nuse ahash::AHashMap;\nuse serde::{Deserialize, Serialize};\nuse std::cmp::Ordering;\n\n#[non_exhaustive]\n#[derive(Debug, Clone, Builder, Serialize, Deserialize)]\npub struct WordLevelTrainer {\n    /// The minimum frequency a word must have to be part of the vocabulary\n    #[builder(default = \"0\")]\n    pub min_frequency: u64,\n    /// The target vocabulary size\n    #[builder(default = \"30_000\")]\n    pub vocab_size: usize,\n    /// Whether to show progress while training\n    #[builder(default = \"true\")]\n    pub show_progress: bool,\n    /// A list of special tokens that the model should know of\n    #[builder(default)]\n    pub special_tokens: Vec<AddedToken>,\n\n    #[builder(default, private)]\n    words: AHashMap<String, u64>,\n}\n\nimpl Default for WordLevelTrainer {\n    fn default() -> Self {\n        Self::builder().build().unwrap()\n    }\n}\n\nimpl WordLevelTrainer {\n    pub fn builder() -> WordLevelTrainerBuilder {\n        WordLevelTrainerBuilder::default()\n    }\n\n    fn do_train(\n        &self,\n        word_counts: &AHashMap<String, u64>,\n        model: &mut WordLevel,\n    ) -> Result<Vec<AddedToken>> {\n        let mut ordered_counts = word_counts.iter().collect::<Vec<_>>();\n\n        //sort the word counts first by inverse counts and then by word, in order\n        //to keep the sorting deterministic in case of equal counts\n        let cmp = |l: &(&String, &u64), r: &(&String, &u64)| -> Ordering {\n            let count_comp: Ordering = l.1.cmp(r.1);\n            if count_comp != Ordering::Equal {\n                return count_comp.reverse();\n            }\n            l.0.cmp(r.0)\n        };\n\n        ordered_counts.sort_by(cmp);\n\n        let word_level = WordLevel::builder()\n            .vocab(\n                self.special_tokens\n                    .iter()\n                    .map(|token| token.content.clone())\n                    .chain(\n                        ordered_counts\n                            .into_iter()\n                            .filter(|(_, n)| **n >= self.min_frequency)\n                            .map(|(w, _)| w.to_owned()),\n                    )\n                    .take(self.vocab_size)\n                    .enumerate()\n                    .map(|(i, w)| (w, i as u32))\n                    .collect(),\n            )\n            .build()?;\n\n        // Transfer the vocab\n        model.vocab = word_level.vocab;\n        model.vocab_r = word_level.vocab_r;\n\n        Ok(self.special_tokens.clone())\n    }\n}\n\nimpl Trainer for WordLevelTrainer {\n    type Model = WordLevel;\n\n    /// Train a WordLevel model\n    fn train(&self, model: &mut WordLevel) -> Result<Vec<AddedToken>> {\n        self.do_train(&self.words, model)\n    }\n\n    /// Whether we should show progress\n    fn should_show_progress(&self) -> bool {\n        self.show_progress\n    }\n\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> Result<Vec<String>> + Sync,\n    {\n        let words: Result<AHashMap<String, u64>> = iterator\n            .maybe_par_bridge()\n            .map(|sequence| {\n                let words = process(sequence.as_ref())?;\n                let mut map = AHashMap::new();\n                for word in words {\n                    *map.entry(word).or_default() += 1;\n                }\n                Ok(map)\n            })\n            .reduce(\n                || Ok(AHashMap::new()),\n                |acc, ws| {\n                    let mut acc = acc?;\n                    for (k, v) in ws? {\n                        *acc.entry(k).or_default() += v;\n                    }\n                    Ok(acc)\n                },\n            );\n\n        self.words = words?;\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_train() {\n        let word_counts: AHashMap<String, u64> = [\n            (\"the\".into(), 25),\n            (\"roses\".into(), 22),\n            (\"are\".into(), 24),\n            (\"red\".into(), 12),\n            (\"voilets\".into(), 10),\n            (\"blue\".into(), 16),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n\n        let mut trainer = WordLevelTrainer {\n            vocab_size: 5,\n            ..Default::default()\n        };\n\n        let mut model = WordLevel::default();\n        trainer.do_train(&word_counts, &mut model).unwrap();\n        let expected_vocab: AHashMap<String, u32> = [\n            (\"the\".into(), 0),\n            (\"are\".into(), 1),\n            (\"roses\".into(), 2),\n            (\"blue\".into(), 3),\n            (\"red\".into(), 4),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n        assert_eq!(model.vocab, expected_vocab);\n\n        // If we specify a min_frequency\n        trainer.min_frequency = 15;\n        let mut model = WordLevel::default();\n        trainer.do_train(&word_counts, &mut model).unwrap();\n        let expected_vocab: AHashMap<String, u32> = [\n            (\"the\".into(), 0),\n            (\"are\".into(), 1),\n            (\"roses\".into(), 2),\n            (\"blue\".into(), 3),\n        ]\n        .iter()\n        .cloned()\n        .collect();\n\n        assert_eq!(model.vocab, expected_vocab);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/wordpiece/mod.rs",
    "content": "//! [WordPiece](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37842.pdf)\n//! model.\n\nuse crate::models::bpe::BPE;\nuse crate::tokenizer::{Model, Result, Token};\nuse ahash::AHashMap;\nuse std::collections::HashMap;\nuse std::{\n    borrow::Cow,\n    fs::File,\n    io::prelude::*,\n    io::{BufRead, BufReader},\n    path::{Path, PathBuf},\n};\n\nmod serialization;\nmod trainer;\npub use trainer::*;\n\n#[derive(thiserror::Error, Debug)]\npub enum Error {\n    #[error(\"WordPiece error: Missing [UNK] token from the vocabulary\")]\n    MissingUnkToken,\n}\n\ntype Vocab = AHashMap<String, u32>;\ntype VocabR = AHashMap<u32, String>;\n\nstruct Config {\n    files: Option<String>,\n    vocab: Vocab,\n    unk_token: String,\n    continuing_subword_prefix: String,\n    max_input_chars_per_word: usize,\n}\n\n/// A `WordPieceBuilder` can be used to create a `WordPiece` model with a custom configuration.\npub struct WordPieceBuilder {\n    config: Config,\n}\n\nimpl Default for WordPieceBuilder {\n    fn default() -> Self {\n        Self {\n            config: Config {\n                files: None,\n                vocab: AHashMap::new(),\n                unk_token: String::from(\"[UNK]\"),\n                continuing_subword_prefix: String::from(\"##\"),\n                max_input_chars_per_word: 100,\n            },\n        }\n    }\n}\n\nimpl WordPieceBuilder {\n    /// Construct a new `WordPieceBuilder`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set the input files.\n    #[must_use]\n    pub fn files(mut self, vocab: String) -> Self {\n        self.config.files = Some(vocab);\n        self\n    }\n\n    /// Set the vocab (token -> ID) mapping.\n    #[must_use]\n    pub fn vocab<V: Into<AHashMap<String, u32>>>(mut self, vocab: V) -> Self {\n        self.config.vocab = vocab.into();\n        self\n    }\n\n    /// The the `UNK` token for the vocab.\n    #[must_use]\n    pub fn unk_token(mut self, unk_token: String) -> Self {\n        self.config.unk_token = unk_token;\n        self\n    }\n\n    /// Set the prefix for continuing subwords.\n    #[must_use]\n    pub fn continuing_subword_prefix(mut self, continuing_subword_prefix: String) -> Self {\n        self.config.continuing_subword_prefix = continuing_subword_prefix;\n        self\n    }\n\n    /// Set the maximum number of input characters per word.\n    #[must_use]\n    pub fn max_input_chars_per_word(mut self, max_input_chars_per_word: usize) -> Self {\n        self.config.max_input_chars_per_word = max_input_chars_per_word;\n        self\n    }\n\n    /// Constructs a `WordPiece` model that uses the `WordPieceBuilder`'s configuration.\n    pub fn build(mut self) -> Result<WordPiece> {\n        if let Some(vocab) = self.config.files {\n            self.config.vocab = WordPiece::read_file(&vocab)?;\n        }\n\n        let vocab_r = self\n            .config\n            .vocab\n            .iter()\n            .map(|(key, val)| (*val, key.to_owned()))\n            .collect();\n\n        Ok(WordPiece {\n            vocab: self.config.vocab,\n            vocab_r,\n            unk_token: self.config.unk_token,\n            continuing_subword_prefix: self.config.continuing_subword_prefix,\n            max_input_chars_per_word: self.config.max_input_chars_per_word,\n        })\n    }\n}\n\n/// A\n/// [WordPiece](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37842.pdf)\n/// model.\n#[derive(Clone, PartialEq, Eq)]\npub struct WordPiece {\n    vocab: Vocab,\n    vocab_r: VocabR,\n    pub unk_token: String,\n    pub continuing_subword_prefix: String,\n    pub max_input_chars_per_word: usize,\n}\n\nimpl std::fmt::Debug for WordPiece {\n    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        fmt.debug_struct(\"WordPiece\")\n            .field(\"unk_token\", &self.unk_token)\n            .field(\"continuing_subword_prefix\", &self.continuing_subword_prefix)\n            .field(\"max_input_chars_per_word\", &self.max_input_chars_per_word)\n            .field(\"vocab\", &self.vocab.len())\n            .finish()\n    }\n}\n\nimpl Default for WordPiece {\n    fn default() -> Self {\n        Self {\n            vocab: AHashMap::new(),\n            vocab_r: AHashMap::new(),\n            unk_token: String::from(\"[UNK]\"),\n            continuing_subword_prefix: String::from(\"##\"),\n            max_input_chars_per_word: 100,\n        }\n    }\n}\n\nimpl WordPiece {\n    /// Get a `WordPieceBuilder`.\n    pub fn builder() -> WordPieceBuilder {\n        WordPieceBuilder::new()\n    }\n\n    /// Read the given files to extract the vocab\n    pub fn read_file(vocab: &str) -> Result<Vocab> {\n        let file = File::open(vocab)?;\n        let file = BufReader::new(file);\n\n        let mut vocab = AHashMap::new();\n        for (index, line) in file.lines().enumerate() {\n            let line = line?;\n            vocab.insert(line.trim_end().to_owned(), index as u32);\n        }\n\n        Ok(vocab)\n    }\n\n    pub fn read_bytes(vocab: &[u8]) -> Result<Vocab> {\n        let file = BufReader::new(vocab);\n\n        let mut vocab = AHashMap::new();\n        for (index, line) in file.lines().enumerate() {\n            let line = line?;\n            vocab.insert(line.trim_end().to_owned(), index as u32);\n        }\n\n        Ok(vocab)\n    }\n\n    pub fn from_bytes<P: AsRef<[u8]>>(bytes: P) -> Result<Self> {\n        let tokenizer = serde_json::from_slice(bytes.as_ref())?;\n        Ok(tokenizer)\n    }\n\n    /// Initialize a `WordPiece` model from a vocab mapping file.\n    pub fn from_file(vocab: &str) -> WordPieceBuilder {\n        WordPiece::builder().files(vocab.to_owned())\n    }\n\n    /// Create a `WordPiece` model from a `BPE` model.\n    pub fn from_bpe(bpe: &BPE) -> Self {\n        let mut wp = Self::builder()\n            .vocab(bpe.get_vocab().into_iter().collect::<AHashMap<_, _>>())\n            .build()\n            .unwrap();\n        if let Some(unk) = bpe.get_unk_token() {\n            unk.clone_into(&mut wp.unk_token);\n        }\n        if let Some(prefix) = bpe.get_continuing_subword_prefix() {\n            prefix.clone_into(&mut wp.continuing_subword_prefix);\n        }\n        wp\n    }\n}\n\nimpl Model for WordPiece {\n    type Trainer = WordPieceTrainer;\n\n    fn get_vocab(&self) -> HashMap<String, u32> {\n        self.vocab.clone().into_iter().collect()\n    }\n\n    fn get_vocab_size(&self) -> usize {\n        self.vocab.len()\n    }\n\n    fn tokenize(&self, sequence: &str) -> Result<Vec<Token>> {\n        let char_len = sequence.chars().count();\n        if char_len > self.max_input_chars_per_word {\n            return Ok(vec![Token {\n                value: self.unk_token.clone(),\n                id: *self\n                    .vocab\n                    .get(&self.unk_token)\n                    .ok_or(Error::MissingUnkToken)?,\n                offsets: (0, sequence.len()),\n            }]);\n        }\n\n        let mut is_bad = false;\n        let mut start = 0;\n        let mut sub_tokens: Vec<Token> = vec![];\n\n        while start < sequence.len() {\n            let mut end = sequence.len();\n            let mut cur_str = None;\n\n            while start < end {\n                let mut substr: Cow<str> = Cow::Borrowed(&sequence[start..end]);\n\n                if start > 0 {\n                    substr = Cow::Owned(format!(\"{}{}\", self.continuing_subword_prefix, substr));\n                }\n                if self.vocab.contains_key(substr.as_ref()) {\n                    cur_str = Some(Token {\n                        id: self.vocab[substr.as_ref()],\n                        value: substr.to_string(),\n                        offsets: (start, end),\n                    });\n                    break;\n                }\n                end -= substr.chars().last().map_or(1, |c| c.len_utf8());\n            }\n\n            if cur_str.is_none() {\n                is_bad = true;\n                break;\n            }\n\n            sub_tokens.push(cur_str.unwrap());\n            start = end;\n        }\n\n        if is_bad {\n            Ok(vec![Token {\n                value: self.unk_token.clone(),\n                id: *self\n                    .vocab\n                    .get(&self.unk_token)\n                    .ok_or(Error::MissingUnkToken)?,\n                offsets: (0, sequence.len()),\n            }])\n        } else {\n            Ok(sub_tokens)\n        }\n    }\n\n    fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.vocab.get(token).copied()\n    }\n\n    fn id_to_token(&self, id: u32) -> Option<String> {\n        self.vocab_r.get(&id).cloned()\n    }\n\n    fn save(&self, folder: &Path, name: Option<&str>) -> Result<Vec<PathBuf>> {\n        let vocab_file_name = match name {\n            Some(name) => format!(\"{name}-vocab.txt\"),\n            None => \"vocab.txt\".to_string(),\n        };\n\n        // Write vocab.txt\n        let vocab_path: PathBuf = [folder, Path::new(vocab_file_name.as_str())]\n            .iter()\n            .collect();\n        let mut vocab_file = File::create(&vocab_path)?;\n        let mut vocab: Vec<(&String, &u32)> = self.vocab.iter().collect();\n        vocab.sort_unstable_by_key(|k| *k.1);\n        vocab_file.write_all(\n            &vocab\n                .into_iter()\n                .flat_map(|(token, _)| format!(\"{token}\\n\").as_bytes().to_owned())\n                .collect::<Vec<_>>()[..],\n        )?;\n\n        Ok(vec![vocab_path])\n    }\n\n    fn get_trainer(&self) -> Self::Trainer {\n        WordPieceTrainer::builder().build()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_error_display() {\n        assert!(format!(\"{}\", Error::MissingUnkToken).contains(\"Missing [UNK] token\"));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/wordpiece/serialization.rs",
    "content": "use super::{super::OrderedVocabIter, WordPiece, WordPieceBuilder};\nuse ahash::{AHashMap, AHashSet};\nuse serde::{\n    de::{MapAccess, Visitor},\n    ser::SerializeStruct,\n    Deserialize, Deserializer, Serialize, Serializer,\n};\n\nimpl Serialize for WordPiece {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut model = serializer.serialize_struct(\"WordPiece\", 5)?;\n\n        // Small fields first\n        model.serialize_field(\"type\", \"WordPiece\")?;\n        model.serialize_field(\"unk_token\", &self.unk_token)?;\n        model.serialize_field(\"continuing_subword_prefix\", &self.continuing_subword_prefix)?;\n        model.serialize_field(\"max_input_chars_per_word\", &self.max_input_chars_per_word)?;\n\n        // Then large ones\n        let ordered_vocab = OrderedVocabIter::new(&self.vocab_r);\n        model.serialize_field(\"vocab\", &ordered_vocab)?;\n\n        model.end()\n    }\n}\n\nimpl<'de> Deserialize<'de> for WordPiece {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        deserializer.deserialize_struct(\n            \"WordPiece\",\n            &[\n                \"type\",\n                \"unk_token\",\n                \"continuing_subword_prefix\",\n                \"max_input_chars_per_word\",\n                \"vocab\",\n            ],\n            WordPieceVisitor,\n        )\n    }\n}\n\nstruct WordPieceVisitor;\nimpl<'de> Visitor<'de> for WordPieceVisitor {\n    type Value = WordPiece;\n\n    fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(fmt, \"struct WordPiece\")\n    }\n\n    fn visit_map<V>(self, mut map: V) -> std::result::Result<Self::Value, V::Error>\n    where\n        V: MapAccess<'de>,\n    {\n        let mut builder = WordPieceBuilder::new();\n        let mut missing_fields = vec![\n            // for retrocompatibility the \"type\" field is not mandatory\n            \"unk_token\",\n            \"continuing_subword_prefix\",\n            \"max_input_chars_per_word\",\n            \"vocab\",\n        ]\n        .into_iter()\n        .collect::<AHashSet<_>>();\n\n        while let Some(key) = map.next_key::<String>()? {\n            match key.as_ref() {\n                \"unk_token\" => builder = builder.unk_token(map.next_value()?),\n                \"continuing_subword_prefix\" => {\n                    builder = builder.continuing_subword_prefix(map.next_value()?)\n                }\n                \"max_input_chars_per_word\" => {\n                    builder = builder.max_input_chars_per_word(map.next_value()?)\n                }\n                \"vocab\" => {\n                    let vocab: AHashMap<String, u32> = map.next_value()?;\n                    builder = builder.vocab(vocab)\n                }\n                \"type\" => match map.next_value()? {\n                    \"WordPiece\" => {}\n                    u => {\n                        return Err(serde::de::Error::invalid_value(\n                            serde::de::Unexpected::Str(u),\n                            &\"WordPiece\",\n                        ))\n                    }\n                },\n                _ => {}\n            }\n            missing_fields.remove::<str>(&key);\n        }\n\n        if !missing_fields.is_empty() {\n            Err(serde::de::Error::missing_field(\n                missing_fields.iter().next().unwrap(),\n            ))\n        } else {\n            Ok(builder.build().map_err(serde::de::Error::custom)?)\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn serde() {\n        let wp = WordPiece::default();\n        let wp_s = \"{\\\n            \\\"type\\\":\\\"WordPiece\\\",\\\n            \\\"unk_token\\\":\\\"[UNK]\\\",\\\n            \\\"continuing_subword_prefix\\\":\\\"##\\\",\\\n            \\\"max_input_chars_per_word\\\":100,\\\n            \\\"vocab\\\":{}\\\n        }\";\n\n        assert_eq!(serde_json::to_string(&wp).unwrap(), wp_s);\n        assert_eq!(serde_json::from_str::<WordPiece>(wp_s).unwrap(), wp);\n    }\n\n    #[test]\n    fn deserialization_should_fail() {\n        let missing_unk = \"{\\\n            \\\"type\\\":\\\"WordPiece\\\",\\\n            \\\"continuing_subword_prefix\\\":\\\"##\\\",\\\n            \\\"max_input_chars_per_word\\\":100,\\\n            \\\"vocab\\\":{}\\\n        }\";\n        assert!(serde_json::from_str::<WordPiece>(missing_unk)\n            .unwrap_err()\n            .to_string()\n            .starts_with(\"missing field `unk_token`\"));\n\n        let wrong_type = \"{\\\n            \\\"type\\\":\\\"WordLevel\\\",\\\n            \\\"unk_token\\\":\\\"[UNK]\\\",\\\n            \\\"vocab\\\":{}\\\n        }\";\n        assert!(serde_json::from_str::<WordPiece>(wrong_type)\n            .unwrap_err()\n            .to_string()\n            .starts_with(\"invalid value: string \\\"WordLevel\\\", expected WordPiece\"));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/models/wordpiece/trainer.rs",
    "content": "use std::collections::HashSet;\n\nuse super::WordPiece;\nuse crate::models::bpe::{BpeTrainer, BpeTrainerBuilder, BPE};\nuse crate::tokenizer::{AddedToken, Result, Trainer};\nuse ahash::AHashSet;\nuse serde::{Deserialize, Serialize};\n\n/// A `WordPieceTrainerBuilder` can be used to create a `WordPieceTrainer` with a custom\n/// configuration.\npub struct WordPieceTrainerBuilder {\n    bpe_trainer_builder: BpeTrainerBuilder,\n}\n\nimpl Default for WordPieceTrainerBuilder {\n    fn default() -> Self {\n        Self {\n            bpe_trainer_builder: BpeTrainerBuilder::new().continuing_subword_prefix(\"##\".into()),\n        }\n    }\n}\n\nimpl WordPieceTrainerBuilder {\n    /// Constructs a new `WordPieceTrainerBuilder`\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set the expected minimum frequency\n    #[must_use]\n    pub fn min_frequency(mut self, frequency: u64) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.min_frequency(frequency);\n        self\n    }\n\n    /// Set the vocabulary size\n    #[must_use]\n    pub fn vocab_size(mut self, size: usize) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.vocab_size(size);\n        self\n    }\n\n    /// Set whether to show progress\n    #[must_use]\n    pub fn show_progress(mut self, show: bool) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.show_progress(show);\n        self\n    }\n\n    /// Set the special tokens\n    #[must_use]\n    pub fn special_tokens(mut self, tokens: Vec<AddedToken>) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.special_tokens(tokens);\n        self\n    }\n\n    /// Set whether to limit the alphabet\n    #[must_use]\n    pub fn limit_alphabet(mut self, limit: usize) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.limit_alphabet(limit);\n        self\n    }\n\n    /// Set the initial alphabet\n    #[must_use]\n    pub fn initial_alphabet(mut self, alphabet: HashSet<char>) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.initial_alphabet(alphabet);\n        self\n    }\n\n    /// Set the continuing_subword_prefix\n    #[must_use]\n    pub fn continuing_subword_prefix(mut self, prefix: String) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.continuing_subword_prefix(prefix);\n        self\n    }\n\n    /// Set the end_of_word_suffix\n    #[must_use]\n    pub fn end_of_word_suffix(mut self, suffix: String) -> Self {\n        self.bpe_trainer_builder = self.bpe_trainer_builder.end_of_word_suffix(suffix);\n        self\n    }\n\n    /// Constructs the final BpeTrainer\n    pub fn build(self) -> WordPieceTrainer {\n        let bpe_trainer = self.bpe_trainer_builder.build();\n        WordPieceTrainer { bpe_trainer }\n    }\n}\n\n/// Trains a `WordPiece` model.\n#[derive(Default, Clone, Deserialize, Serialize)]\npub struct WordPieceTrainer {\n    bpe_trainer: BpeTrainer,\n}\n\nimpl WordPieceTrainer {\n    pub fn min_frequency(&self) -> u64 {\n        self.bpe_trainer.min_frequency\n    }\n\n    pub fn set_min_frequency(&mut self, freq: u64) {\n        self.bpe_trainer.min_frequency = freq;\n    }\n\n    pub fn vocab_size(&self) -> usize {\n        self.bpe_trainer.vocab_size\n    }\n\n    pub fn set_vocab_size(&mut self, size: usize) {\n        self.bpe_trainer.vocab_size = size;\n    }\n\n    pub fn show_progress(&self) -> bool {\n        self.bpe_trainer.show_progress\n    }\n\n    pub fn set_show_progress(&mut self, show_progress: bool) {\n        self.bpe_trainer.show_progress = show_progress;\n    }\n\n    pub fn special_tokens(&self) -> &[AddedToken] {\n        &self.bpe_trainer.special_tokens\n    }\n\n    pub fn set_special_tokens(&mut self, special_tokens: Vec<AddedToken>) {\n        self.bpe_trainer.special_tokens = special_tokens;\n    }\n\n    pub fn limit_alphabet(&self) -> Option<usize> {\n        self.bpe_trainer.limit_alphabet\n    }\n\n    pub fn set_limit_alphabet(&mut self, limit: Option<usize>) {\n        self.bpe_trainer.limit_alphabet = limit;\n    }\n\n    pub fn initial_alphabet(&self) -> &AHashSet<char> {\n        &self.bpe_trainer.initial_alphabet\n    }\n\n    pub fn set_initial_alphabet(&mut self, alphabet: HashSet<char>) {\n        let mut initial_alphabet = AHashSet::with_capacity(alphabet.len());\n        initial_alphabet.extend(alphabet);\n        self.bpe_trainer.initial_alphabet = initial_alphabet;\n    }\n\n    pub fn continuing_subword_prefix(&self) -> &Option<String> {\n        &self.bpe_trainer.continuing_subword_prefix\n    }\n\n    pub fn set_continuing_subword_prefix(&mut self, prefix: Option<String>) {\n        self.bpe_trainer.continuing_subword_prefix = prefix;\n    }\n\n    pub fn end_of_word_suffix(&self) -> &Option<String> {\n        &self.bpe_trainer.end_of_word_suffix\n    }\n\n    pub fn set_end_of_word_suffix(&mut self, suffix: Option<String>) {\n        self.bpe_trainer.end_of_word_suffix = suffix;\n    }\n\n    pub fn builder() -> WordPieceTrainerBuilder {\n        WordPieceTrainerBuilder::default()\n    }\n\n    pub fn train(&self, model: &mut WordPiece) -> Result<Vec<AddedToken>> {\n        let mut bpe = BPE::default();\n        let special_tokens = self.bpe_trainer.train(&mut bpe)?;\n        let new_wordpiece = WordPiece::from_bpe(&bpe);\n\n        // Transfer the vocab\n        model.vocab = new_wordpiece.vocab;\n        model.vocab_r = new_wordpiece.vocab_r;\n        // The continuing_subword_prefix is the only other option to be overridden by the trainer\n        model.continuing_subword_prefix = new_wordpiece.continuing_subword_prefix;\n\n        Ok(special_tokens)\n    }\n}\n\nimpl Trainer for WordPieceTrainer {\n    type Model = WordPiece;\n\n    fn train(&self, model: &mut WordPiece) -> Result<Vec<AddedToken>> {\n        self.train(model)\n    }\n\n    fn should_show_progress(&self) -> bool {\n        self.bpe_trainer.should_show_progress()\n    }\n\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> Result<Vec<String>> + Sync,\n    {\n        self.bpe_trainer.feed(iterator, process)\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/bert.rs",
    "content": "use crate::tokenizer::{NormalizedString, Normalizer, Result};\n\nuse serde::{Deserialize, Serialize};\nuse unicode_categories::UnicodeCategories;\n\n/// Checks whether a character is whitespace\nfn is_whitespace(c: char) -> bool {\n    // These are technically control characters but we count them as whitespace\n    match c {\n        '\\t' | '\\n' | '\\r' => true,\n        _ => c.is_whitespace(),\n    }\n}\n\n/// Checks whether a character is a control character\nfn is_control(c: char) -> bool {\n    // These are technically control characters but we count them as whitespace\n    match c {\n        '\\t' | '\\n' | '\\r' => false,\n        // The definition of `is_control` here is quite large and contains also\n        // Cc, Cf, Cn or Co\n        // cf. https://unicode.org/reports/tr44/ (Table 12)\n        _ => c.is_other(),\n    }\n}\n\n/// Checks whether a character is chinese\n/// This defines a \"chinese character\" as anything in the CJK Unicode block:\n///   https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block)\n///\n/// Note that the CJK Unicode block is NOT all Japanese and Korean characters,\n/// despite its name. The modern Korean Hangul alphabet is a different block,\n/// as is Japanese Hiragana and Katakana. Those alphabets are used to write\n/// space-separated words, so they are not treated specially and handled\n/// like for all of the other languages.\nfn is_chinese_char(c: char) -> bool {\n    matches!(\n        c as usize,\n        0x4E00..=0x9FFF |\n        0x3400..=0x4DBF |\n        0x20000..=0x2A6DF |\n        0x2A700..=0x2B73F |\n        0x2B740..=0x2B81F |\n        0x2B920..=0x2CEAF |\n        0xF900..=0xFAFF |\n        0x2F800..=0x2FA1F\n    )\n}\n\n#[derive(Copy, Clone, Debug, Deserialize, Serialize)]\n#[serde(tag = \"type\")]\n#[non_exhaustive]\npub struct BertNormalizer {\n    /// Whether to do the bert basic cleaning:\n    ///   1. Remove any control characters\n    ///   2. Replace all sorts of whitespace by the classic one ` `\n    pub clean_text: bool,\n    /// Whether to put spaces around chinese characters so they get split\n    pub handle_chinese_chars: bool,\n    /// Whether to strip accents\n    pub strip_accents: Option<bool>,\n    /// Whether to lowercase the input\n    pub lowercase: bool,\n}\n\nimpl Default for BertNormalizer {\n    fn default() -> Self {\n        Self {\n            clean_text: true,\n            handle_chinese_chars: true,\n            strip_accents: None,\n            lowercase: true,\n        }\n    }\n}\n\nimpl BertNormalizer {\n    pub fn new(\n        clean_text: bool,\n        handle_chinese_chars: bool,\n        strip_accents: Option<bool>,\n        lowercase: bool,\n    ) -> Self {\n        Self {\n            clean_text,\n            handle_chinese_chars,\n            strip_accents,\n            lowercase,\n        }\n    }\n\n    fn do_clean_text(&self, normalized: &mut NormalizedString) {\n        normalized\n            .filter(|c| !(c as usize == 0 || c as usize == 0xfffd || is_control(c)))\n            .map(|c| if is_whitespace(c) { ' ' } else { c });\n    }\n\n    fn do_handle_chinese_chars(&self, normalized: &mut NormalizedString) {\n        let mut new_chars: Vec<(char, isize)> = vec![];\n        normalized.for_each(|c| {\n            if is_chinese_char(c) {\n                new_chars.extend([(' ', 0), (c, 1), (' ', 1)]);\n            } else {\n                new_chars.push((c, 0));\n            }\n        });\n        normalized.transform(new_chars, 0);\n    }\n\n    fn do_strip_accents(&self, normalized: &mut NormalizedString) {\n        normalized.nfd().filter(|c| !c.is_mark_nonspacing());\n    }\n\n    fn do_lowercase(&self, normalized: &mut NormalizedString) {\n        normalized.lowercase();\n    }\n}\n\nimpl Normalizer for BertNormalizer {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        if self.clean_text {\n            self.do_clean_text(normalized);\n        }\n        if self.handle_chinese_chars {\n            self.do_handle_chinese_chars(normalized);\n        }\n        let strip_accents = self.strip_accents.unwrap_or(self.lowercase);\n        if strip_accents {\n            self.do_strip_accents(normalized);\n        }\n        if self.lowercase {\n            self.do_lowercase(normalized);\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/byte_level.rs",
    "content": "use crate::processors::byte_level::bytes_char;\nuse crate::tokenizer::{NormalizedString, Normalizer, Result};\nuse crate::utils::macro_rules_attribute;\nuse ahash::{AHashMap, AHashSet};\nuse std::sync::LazyLock;\n\n#[derive(Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct ByteLevel;\n\nstatic BYTES_CHAR: LazyLock<AHashMap<u8, char>> = LazyLock::new(bytes_char);\n\nimpl Default for ByteLevel {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl ByteLevel {\n    pub fn new() -> Self {\n        Self {}\n    }\n\n    pub fn alphabet() -> AHashSet<char> {\n        BYTES_CHAR.values().copied().collect()\n    }\n}\n\nimpl Normalizer for ByteLevel {\n    /// Strip the normalized string inplace\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        if !normalized.is_empty() {\n            let s = normalized.get();\n            let mut transformations: Vec<(char, isize)> = Vec::with_capacity(s.len());\n            for (i, cur_char) in s.char_indices() {\n                let size = cur_char.len_utf8();\n                transformations.extend(\n                    s.as_bytes()[i..i + size]\n                        .iter()\n                        .enumerate()\n                        .map(|(i, b)| (BYTES_CHAR[b], isize::from(i > 0))),\n                );\n            }\n            normalized.transform(transformations, 0);\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n\n    use super::*;\n\n    #[test]\n    fn test_byte_level_normalize() {\n        let original = \"Hello 我今天能为你做什么\";\n        let normalized = \"HelloĠæĪĳä»Ĭå¤©èĥ½ä¸ºä½łåģļä»Ģä¹Ī\";\n        assert_ne!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        let byte_level = ByteLevel::new();\n        byte_level.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n        assert_eq!(\n            n,\n            NormalizedString::new(\n                original.to_string(),\n                normalized.to_string(),\n                vec![\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (5, 6),\n                    (6, 9),\n                    (6, 9),\n                    (6, 9),\n                    (6, 9),\n                    (6, 9),\n                    (6, 9),\n                    (9, 12),\n                    (9, 12),\n                    (9, 12),\n                    (9, 12),\n                    (9, 12),\n                    (9, 12),\n                    (12, 15),\n                    (12, 15),\n                    (12, 15),\n                    (12, 15),\n                    (12, 15),\n                    (12, 15),\n                    (15, 18),\n                    (15, 18),\n                    (15, 18),\n                    (15, 18),\n                    (15, 18),\n                    (15, 18),\n                    (18, 21),\n                    (18, 21),\n                    (18, 21),\n                    (18, 21),\n                    (18, 21),\n                    (18, 21),\n                    (21, 24),\n                    (21, 24),\n                    (21, 24),\n                    (21, 24),\n                    (21, 24),\n                    (21, 24),\n                    (24, 27),\n                    (24, 27),\n                    (24, 27),\n                    (24, 27),\n                    (24, 27),\n                    (24, 27),\n                    (27, 30),\n                    (27, 30),\n                    (27, 30),\n                    (27, 30),\n                    (27, 30),\n                    (27, 30),\n                    (30, 33),\n                    (30, 33),\n                    (30, 33),\n                    (30, 33),\n                    (30, 33),\n                    (30, 33)\n                ],\n                0\n            )\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 7),\n                (7, 13),\n                (7, 13),\n                (7, 13),\n                (13, 19),\n                (13, 19),\n                (13, 19),\n                (19, 25),\n                (19, 25),\n                (19, 25),\n                (25, 31),\n                (25, 31),\n                (25, 31),\n                (31, 37),\n                (31, 37),\n                (31, 37),\n                (37, 43),\n                (37, 43),\n                (37, 43),\n                (43, 49),\n                (43, 49),\n                (43, 49),\n                (49, 55),\n                (49, 55),\n                (49, 55),\n                (55, 61),\n                (55, 61),\n                (55, 61)\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/mod.rs",
    "content": "pub mod bert;\npub mod byte_level;\npub mod precompiled;\npub mod prepend;\npub mod replace;\npub mod strip;\npub mod unicode;\npub mod utils;\npub use crate::normalizers::bert::BertNormalizer;\npub use crate::normalizers::byte_level::ByteLevel;\npub use crate::normalizers::precompiled::Precompiled;\npub use crate::normalizers::prepend::Prepend;\npub use crate::normalizers::replace::Replace;\npub use crate::normalizers::strip::{Strip, StripAccents};\npub use crate::normalizers::unicode::{Nmt, NFC, NFD, NFKC, NFKD};\npub use crate::normalizers::utils::{Lowercase, Sequence};\nuse serde::{Deserialize, Deserializer, Serialize};\n\nuse crate::{NormalizedString, Normalizer};\n\n/// Wrapper for known Normalizers.\n#[derive(Clone, Debug, Serialize)]\n#[serde(untagged)]\npub enum NormalizerWrapper {\n    BertNormalizer(BertNormalizer),\n    StripNormalizer(Strip),\n    StripAccents(StripAccents),\n    NFC(NFC),\n    NFD(NFD),\n    NFKC(NFKC),\n    NFKD(NFKD),\n    Sequence(Sequence),\n    Lowercase(Lowercase),\n    Nmt(Nmt),\n    Precompiled(Precompiled),\n    Replace(Replace),\n    Prepend(Prepend),\n    ByteLevel(ByteLevel),\n}\n\nimpl<'de> Deserialize<'de> for NormalizerWrapper {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Debug, Deserialize)]\n        pub struct Tagged {\n            #[serde(rename = \"type\")]\n            variant: EnumType,\n            #[serde(flatten)]\n            rest: serde_json::Value,\n        }\n        #[derive(Debug, Serialize, Deserialize)]\n        pub enum EnumType {\n            Bert,\n            Strip,\n            StripAccents,\n            NFC,\n            NFD,\n            NFKC,\n            NFKD,\n            Sequence,\n            Lowercase,\n            Nmt,\n            Precompiled,\n            Replace,\n            Prepend,\n            ByteLevel,\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum NormalizerHelper {\n            Tagged(Tagged),\n            Legacy(serde_json::Value),\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum NormalizerUntagged {\n            BertNormalizer(BertNormalizer),\n            StripNormalizer(Strip),\n            StripAccents(StripAccents),\n            NFC(NFC),\n            NFD(NFD),\n            NFKC(NFKC),\n            NFKD(NFKD),\n            Sequence(Sequence),\n            Lowercase(Lowercase),\n            Nmt(Nmt),\n            Precompiled(Precompiled),\n            Replace(Replace),\n            Prepend(Prepend),\n            ByteLevel(ByteLevel),\n        }\n\n        let helper = NormalizerHelper::deserialize(deserializer)?;\n        Ok(match helper {\n            NormalizerHelper::Tagged(model) => {\n                let mut values: serde_json::Map<String, serde_json::Value> =\n                    serde_json::from_value(model.rest).expect(\"Parsed values\");\n                values.insert(\n                    \"type\".to_string(),\n                    serde_json::to_value(&model.variant).expect(\"Reinsert\"),\n                );\n                let values = serde_json::Value::Object(values);\n                match model.variant {\n                    EnumType::Bert => NormalizerWrapper::BertNormalizer(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Strip => NormalizerWrapper::StripNormalizer(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::StripAccents => NormalizerWrapper::StripAccents(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::NFC => NormalizerWrapper::NFC(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::NFD => NormalizerWrapper::NFD(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::NFKC => NormalizerWrapper::NFKC(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::NFKD => NormalizerWrapper::NFKD(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Sequence => NormalizerWrapper::Sequence(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Lowercase => NormalizerWrapper::Lowercase(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Nmt => NormalizerWrapper::Nmt(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Precompiled => NormalizerWrapper::Precompiled(\n                        serde_json::from_str(\n                            &serde_json::to_string(&values).expect(\"Can reserialize precompiled\"),\n                        )\n                        // .map_err(serde::de::Error::custom)\n                        .expect(\"Precompiled\"),\n                    ),\n                    EnumType::Replace => NormalizerWrapper::Replace(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Prepend => NormalizerWrapper::Prepend(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::ByteLevel => NormalizerWrapper::ByteLevel(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                }\n            }\n\n            NormalizerHelper::Legacy(value) => {\n                let untagged = serde_json::from_value(value).map_err(serde::de::Error::custom)?;\n                match untagged {\n                    NormalizerUntagged::BertNormalizer(bpe) => {\n                        NormalizerWrapper::BertNormalizer(bpe)\n                    }\n                    NormalizerUntagged::StripNormalizer(bpe) => {\n                        NormalizerWrapper::StripNormalizer(bpe)\n                    }\n                    NormalizerUntagged::StripAccents(bpe) => NormalizerWrapper::StripAccents(bpe),\n                    NormalizerUntagged::NFC(bpe) => NormalizerWrapper::NFC(bpe),\n                    NormalizerUntagged::NFD(bpe) => NormalizerWrapper::NFD(bpe),\n                    NormalizerUntagged::NFKC(bpe) => NormalizerWrapper::NFKC(bpe),\n                    NormalizerUntagged::NFKD(bpe) => NormalizerWrapper::NFKD(bpe),\n                    NormalizerUntagged::Sequence(seq) => NormalizerWrapper::Sequence(seq),\n                    NormalizerUntagged::Lowercase(bpe) => NormalizerWrapper::Lowercase(bpe),\n                    NormalizerUntagged::Nmt(bpe) => NormalizerWrapper::Nmt(bpe),\n                    NormalizerUntagged::Precompiled(bpe) => NormalizerWrapper::Precompiled(bpe),\n                    NormalizerUntagged::Replace(bpe) => NormalizerWrapper::Replace(bpe),\n                    NormalizerUntagged::Prepend(bpe) => NormalizerWrapper::Prepend(bpe),\n                    NormalizerUntagged::ByteLevel(bpe) => NormalizerWrapper::ByteLevel(bpe),\n                }\n            }\n        })\n    }\n}\n\nimpl Normalizer for NormalizerWrapper {\n    fn normalize(&self, normalized: &mut NormalizedString) -> crate::Result<()> {\n        match self {\n            Self::BertNormalizer(bn) => bn.normalize(normalized),\n            Self::StripNormalizer(sn) => sn.normalize(normalized),\n            Self::StripAccents(sn) => sn.normalize(normalized),\n            Self::NFC(nfc) => nfc.normalize(normalized),\n            Self::NFD(nfd) => nfd.normalize(normalized),\n            Self::NFKC(nfkc) => nfkc.normalize(normalized),\n            Self::NFKD(nfkd) => nfkd.normalize(normalized),\n            Self::Sequence(sequence) => sequence.normalize(normalized),\n            Self::Lowercase(lc) => lc.normalize(normalized),\n            Self::Nmt(lc) => lc.normalize(normalized),\n            Self::Precompiled(lc) => lc.normalize(normalized),\n            Self::Replace(lc) => lc.normalize(normalized),\n            Self::Prepend(lc) => lc.normalize(normalized),\n            Self::ByteLevel(lc) => lc.normalize(normalized),\n        }\n    }\n}\n\nimpl_enum_from!(BertNormalizer, NormalizerWrapper, BertNormalizer);\nimpl_enum_from!(NFKD, NormalizerWrapper, NFKD);\nimpl_enum_from!(NFKC, NormalizerWrapper, NFKC);\nimpl_enum_from!(NFC, NormalizerWrapper, NFC);\nimpl_enum_from!(NFD, NormalizerWrapper, NFD);\nimpl_enum_from!(Strip, NormalizerWrapper, StripNormalizer);\nimpl_enum_from!(StripAccents, NormalizerWrapper, StripAccents);\nimpl_enum_from!(Sequence, NormalizerWrapper, Sequence);\nimpl_enum_from!(Lowercase, NormalizerWrapper, Lowercase);\nimpl_enum_from!(Nmt, NormalizerWrapper, Nmt);\nimpl_enum_from!(Precompiled, NormalizerWrapper, Precompiled);\nimpl_enum_from!(Replace, NormalizerWrapper, Replace);\nimpl_enum_from!(Prepend, NormalizerWrapper, Prepend);\nimpl_enum_from!(ByteLevel, NormalizerWrapper, ByteLevel);\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[test]\n    fn post_processor_deserialization_no_type() {\n        let json = r#\"{\"strip_left\":false, \"strip_right\":true}\"#;\n        let reconstructed = serde_json::from_str::<NormalizerWrapper>(json);\n        assert!(matches!(\n            reconstructed.unwrap(),\n            NormalizerWrapper::StripNormalizer(_)\n        ));\n\n        let json = r#\"{\"trim_offsets\":true, \"add_prefix_space\":true}\"#;\n        let reconstructed = serde_json::from_str::<NormalizerWrapper>(json);\n        match reconstructed {\n            Err(err) => assert_eq!(\n                err.to_string(),\n                \"data did not match any variant of untagged enum NormalizerUntagged\"\n            ),\n            _ => panic!(\"Expected an error here\"),\n        }\n\n        let json = r#\"{\"prepend\":\"a\"}\"#;\n        let reconstructed = serde_json::from_str::<NormalizerWrapper>(json);\n        assert!(matches!(\n            reconstructed.unwrap(),\n            NormalizerWrapper::Prepend(_)\n        ));\n    }\n\n    #[test]\n    fn normalizer_serialization() {\n        let json = r#\"{\"type\":\"Sequence\",\"normalizers\":[]}\"#;\n        assert!(serde_json::from_str::<NormalizerWrapper>(json).is_ok());\n        let json = r#\"{\"type\":\"Sequence\",\"normalizers\":[{}]}\"#;\n        let parse = serde_json::from_str::<NormalizerWrapper>(json);\n        match parse {\n            Err(err) => assert_eq!(\n                format!(\"{err}\"),\n                \"data did not match any variant of untagged enum NormalizerUntagged\"\n            ),\n            _ => panic!(\"Expected error\"),\n        }\n\n        let json = r#\"{\"replacement\":\"▁\",\"prepend_scheme\":\"always\"}\"#;\n        let parse = serde_json::from_str::<NormalizerWrapper>(json);\n        match parse {\n            Err(err) => assert_eq!(\n                format!(\"{err}\"),\n                \"data did not match any variant of untagged enum NormalizerUntagged\"\n            ),\n            _ => panic!(\"Expected error\"),\n        }\n\n        let json = r#\"{\"type\":\"Sequence\",\"prepend_scheme\":\"always\"}\"#;\n        let parse = serde_json::from_str::<NormalizerWrapper>(json);\n        match parse {\n            Err(err) => assert_eq!(format!(\"{err}\"), \"missing field `normalizers`\"),\n            _ => panic!(\"Expected error\"),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/precompiled.rs",
    "content": "use crate::tokenizer::{NormalizedString, Normalizer, Result};\npub use spm_precompiled::Precompiled;\nuse std::cmp::Ordering;\nuse unicode_segmentation::UnicodeSegmentation;\n\nfn replace(transformations: &mut Vec<(char, isize)>, old_part: &str, new_part: &str) {\n    let old_count = old_part.chars().count() as isize;\n    let new_count = new_part.chars().count() as isize;\n    let diff = new_count - old_count;\n\n    // If we are just replacing characters, all changes should be == 0\n    transformations.extend(new_part.chars().map(|c| (c, 0)));\n\n    match diff.cmp(&0) {\n        // If we are adding some characters, the last DIFF characters should be == 1\n        Ordering::Greater => {\n            transformations\n                .iter_mut()\n                .rev()\n                .take(diff as usize)\n                .for_each(|(_, cs)| *cs = 1);\n        }\n        // If we are removing some characters, the last one should include the diff\n        Ordering::Less => {\n            if let Some((_, cs)) = transformations.last_mut() {\n                *cs += diff;\n            }\n        }\n        _ => {}\n    }\n}\n\nimpl Normalizer for Precompiled {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        let mut transformations = Vec::with_capacity(normalized.get().len());\n        // Future reader. From @Narsil.\n        // Yes, this is weird,\n        // Yes, this seems broken\n        // No, I don't know why Google did this.\n        // If you question this code, check this normalizer against\n        // XNLI database (all languages) with Unigram model against\n        // Mbart, XLMRoberta *AND* Marian. If you don't get 100% or\n        // break a single test.\n        // You don't pass.\n        let mut modified = false;\n        normalized.get().graphemes(true).for_each(|grapheme| {\n            if grapheme.len() < 6 {\n                if let Some(norm) = self.transform(grapheme) {\n                    modified = true;\n                    replace(&mut transformations, grapheme, norm);\n                    return;\n                }\n            }\n            for (char_index, c) in grapheme.char_indices() {\n                let part = &grapheme[char_index..char_index + c.len_utf8()];\n                if let Some(norm) = self.transform(part) {\n                    modified = true;\n                    replace(&mut transformations, part, norm);\n                } else {\n                    transformations.push((c, 0));\n                }\n            }\n        });\n        if modified {\n            normalized.transform(transformations, 0);\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn expansion_followed_by_removal() {\n        // Simulate transformations from \"™\\x1eg\" to \"TMg\"\n        let mut transformations = vec![];\n\n        let mut n = NormalizedString::from(\"™\\x1eg\");\n        replace(&mut transformations, \"™\", \"TM\");\n        replace(&mut transformations, \"\\x1e\", \"\");\n        transformations.push(('g', 0));\n\n        n.transform(transformations, 0);\n\n        assert_eq!(n.get(), \"TMg\");\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/prepend.rs",
    "content": "use crate::tokenizer::{NormalizedString, Normalizer, Result};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug, Deserialize, Serialize)]\n#[serde(tag = \"type\")]\npub struct Prepend {\n    pub prepend: String,\n}\n\nimpl Prepend {\n    pub fn new(prepend: String) -> Self {\n        Self { prepend }\n    }\n}\n\nimpl Normalizer for Prepend {\n    /// Strip the normalized string inplace\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        if !normalized.is_empty() {\n            normalized.prepend(&self.prepend);\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_prepend() {\n        let original = \"Hello\";\n        let normalized = \"▁Hello\";\n        assert_ne!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        let prepend = Prepend::new(\"▁\".to_string());\n        prepend.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n        assert_eq!(\n            n,\n            NormalizedString::new(\n                original.to_string(),\n                normalized.to_string(),\n                vec![\n                    (0, 1),\n                    (0, 1),\n                    (0, 1),\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5)\n                ],\n                0\n            )\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![(0, 4), (4, 5), (5, 6), (6, 7), (7, 8)]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/replace.rs",
    "content": "use crate::tokenizer::pattern::Pattern;\nuse crate::tokenizer::Decoder;\nuse crate::tokenizer::{NormalizedString, Normalizer, Result};\nuse crate::utils::SysRegex;\nuse serde::{Deserialize, Serialize};\n\n/// Represents the different patterns that `Replace` can use\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\npub enum ReplacePattern {\n    String(String),\n    Regex(String),\n}\n\nimpl From<String> for ReplacePattern {\n    fn from(v: String) -> Self {\n        Self::String(v)\n    }\n}\n\nimpl From<&str> for ReplacePattern {\n    fn from(v: &str) -> Self {\n        Self::String(v.to_owned())\n    }\n}\n\n/// We use this custom deserializer to provide the value for `regex` for `Replace`\n#[doc(hidden)]\n#[derive(Deserialize)]\n#[serde(tag = \"type\")]\nstruct ReplaceDeserializer {\n    pattern: ReplacePattern,\n    content: String,\n}\n\nimpl std::convert::TryFrom<ReplaceDeserializer> for Replace {\n    type Error = Box<dyn std::error::Error + Send + Sync>;\n\n    fn try_from(v: ReplaceDeserializer) -> Result<Self> {\n        Self::new(v.pattern, v.content)\n    }\n}\n\n/// This normalizer will take a `pattern` (for now only a String)\n/// and replace every occurrence with `content`.\n#[derive(Debug, Serialize, Deserialize)]\n#[serde(tag = \"type\", try_from = \"ReplaceDeserializer\")]\npub struct Replace {\n    pattern: ReplacePattern,\n    pub content: String,\n    #[serde(skip)]\n    regex: SysRegex,\n}\n\nimpl Clone for Replace {\n    fn clone(&self) -> Self {\n        Self::new(self.pattern.clone(), &self.content).unwrap()\n    }\n}\n\nimpl PartialEq for Replace {\n    fn eq(&self, other: &Self) -> bool {\n        self.pattern == other.pattern && self.content == other.content\n    }\n}\n\nimpl Replace {\n    pub fn new<I: Into<ReplacePattern>, C: Into<String>>(pattern: I, content: C) -> Result<Self> {\n        let pattern: ReplacePattern = pattern.into();\n        let regex = match &pattern {\n            ReplacePattern::String(s) => SysRegex::new(&regex::escape(s))?,\n            ReplacePattern::Regex(r) => SysRegex::new(r)?,\n        };\n\n        Ok(Self {\n            pattern,\n            content: content.into(),\n            regex,\n        })\n    }\n}\n\nimpl Normalizer for Replace {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.replace(&self.regex, &self.content)\n    }\n}\n\nimpl Decoder for Replace {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        tokens\n            .into_iter()\n            .map(|token| -> Result<String> {\n                let mut new_token = \"\".to_string();\n\n                for ((start, stop), is_match) in (&self.regex).find_matches(&token)? {\n                    if is_match {\n                        new_token.push_str(&self.content);\n                    } else {\n                        new_token.push_str(&token[start..stop]);\n                    }\n                }\n                Ok(new_token)\n            })\n            .collect()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_replace() {\n        let original = \"This is a ''test''\";\n        let normalized = \"This is a \\\"test\\\"\";\n\n        let mut n = NormalizedString::from(original);\n        Replace::new(\"''\", \"\\\"\").unwrap().normalize(&mut n).unwrap();\n\n        assert_eq!(&n.get(), &normalized);\n    }\n\n    #[test]\n    fn test_replace_regex() {\n        let original = \"This     is   a         test\";\n        let normalized = \"This is a test\";\n\n        let mut n = NormalizedString::from(original);\n        Replace::new(ReplacePattern::Regex(r\"\\s+\".into()), ' ')\n            .unwrap()\n            .normalize(&mut n)\n            .unwrap();\n\n        assert_eq!(&n.get(), &normalized);\n    }\n\n    #[test]\n    fn serialization() {\n        let replace = Replace::new(\"Hello\", \"Hey\").unwrap();\n        let replace_s = r#\"{\"type\":\"Replace\",\"pattern\":{\"String\":\"Hello\"},\"content\":\"Hey\"}\"#;\n        assert_eq!(serde_json::to_string(&replace).unwrap(), replace_s);\n        assert_eq!(serde_json::from_str::<Replace>(replace_s).unwrap(), replace);\n\n        let replace = Replace::new(ReplacePattern::Regex(r\"\\s+\".into()), ' ').unwrap();\n        let replace_s = r#\"{\"type\":\"Replace\",\"pattern\":{\"Regex\":\"\\\\s+\"},\"content\":\" \"}\"#;\n        assert_eq!(serde_json::to_string(&replace).unwrap(), replace_s);\n        assert_eq!(serde_json::from_str::<Replace>(replace_s).unwrap(), replace);\n    }\n\n    #[test]\n    fn test_replace_decode() {\n        let original = vec![\"hello\".to_string(), \"_hello\".to_string()];\n        let replace = Replace::new(\"_\", \" \").unwrap();\n        assert_eq!(\n            replace.decode_chain(original).unwrap(),\n            vec![\"hello\", \" hello\"]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/strip.rs",
    "content": "use crate::tokenizer::{NormalizedString, Normalizer, Result};\nuse crate::utils::macro_rules_attribute;\nuse serde::{Deserialize, Serialize};\nuse unicode_normalization_alignments::char::is_combining_mark;\n\n#[derive(Copy, Clone, Debug, Deserialize, Serialize)]\n#[serde(tag = \"type\")]\n#[non_exhaustive]\npub struct Strip {\n    pub strip_left: bool,\n    pub strip_right: bool,\n}\n\nimpl Strip {\n    pub fn new(strip_left: bool, strip_right: bool) -> Self {\n        Self {\n            strip_left,\n            strip_right,\n        }\n    }\n}\n\nimpl Normalizer for Strip {\n    /// Strip the normalized string inplace\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        if self.strip_left && self.strip_right {\n            // Fast path\n            normalized.strip();\n        } else {\n            if self.strip_left {\n                normalized.lstrip();\n            }\n\n            if self.strip_right {\n                normalized.rstrip();\n            }\n        }\n\n        Ok(())\n    }\n}\n\n// This normalizer removes combining marks from a normalized string\n// It's different from unidecode as it does not attempt to modify\n// non ascii languages.\n#[derive(Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct StripAccents;\n\nimpl Normalizer for StripAccents {\n    /// Strip the normalized string inplace\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.filter(|c| !is_combining_mark(c));\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::normalizer::NormalizedString;\n    use crate::normalizers::Lowercase;\n    use crate::normalizers::NFKD;\n    use unicode_normalization_alignments::UnicodeNormalization;\n\n    #[test]\n    fn test_strip_accents() {\n        // Unicode combining char\n        let original: String = \"Me llamó\".nfkd().map(|(c, _)| c).collect();\n        let normalized = \"Me llamo\";\n        assert_ne!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        StripAccents.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n\n        // Ignores regular ascii\n        let original = \"Me llamo\";\n        let normalized = \"Me llamo\";\n        assert_eq!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        StripAccents.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n\n        // Does not change chinese\n        let original: String = \"这很简单\".nfkd().map(|(c, _)| c).collect();\n        let normalized = \"这很简单\";\n        assert_eq!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        StripAccents.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n    }\n\n    #[test]\n    fn test_vietnamese_bug() {\n        let original: String = \"ậ…\".to_string();\n        let normalized = \"a...\".to_string();\n        assert_ne!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        NFKD.normalize(&mut n).unwrap();\n        StripAccents.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n        Lowercase.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n\n        let original: String = \"Cụ thể, bạn sẽ tham gia một nhóm các giám đốc điều hành tổ chức, các nhà lãnh đạo doanh nghiệp, các học giả, chuyên gia phát triển và tình nguyện viên riêng biệt trong lĩnh vực phi lợi nhuận…\".to_string();\n        let normalized = \"cu the, ban se tham gia mot nhom cac giam đoc đieu hanh to chuc, cac nha lanh đao doanh nghiep, cac hoc gia, chuyen gia phat trien va tinh nguyen vien rieng biet trong linh vuc phi loi nhuan...\".to_string();\n        let mut n = NormalizedString::from(original);\n        NFKD.normalize(&mut n).unwrap();\n        StripAccents.normalize(&mut n).unwrap();\n        Lowercase.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n    }\n\n    #[test]\n    fn test_thai_bug() {\n        let original = \"ำน\\u{e49}ำ3ลำ\".to_string();\n        let normalized = \"านา3ลา\".to_string();\n        assert_ne!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        NFKD.normalize(&mut n).unwrap();\n        StripAccents.normalize(&mut n).unwrap();\n        Lowercase.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n    }\n\n    #[test]\n    fn test_strip_accents_multiple() {\n        let original = \"e\\u{304}\\u{304}\\u{304}o\";\n        let normalized = \"eo\";\n        assert_ne!(original, normalized);\n        let mut n = NormalizedString::from(original);\n        StripAccents.normalize(&mut n).unwrap();\n        assert_eq!(&n.get(), &normalized);\n        assert_eq!(\n            n,\n            NormalizedString::new(\n                original.to_string(),\n                normalized.to_string(),\n                vec![(0, 1), (7, 8)],\n                0\n            )\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 1),\n                (1, 1),\n                (1, 1),\n                (1, 1),\n                (1, 1),\n                (1, 1),\n                (1, 1),\n                (1, 2)\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/unicode.rs",
    "content": "use crate::tokenizer::{NormalizedString, Normalizer, Result};\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Default, Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct NFD;\nimpl Normalizer for NFD {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.nfd();\n        Ok(())\n    }\n}\n\n#[derive(Default, Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct NFKD;\nimpl Normalizer for NFKD {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.nfkd();\n        Ok(())\n    }\n}\n\n#[derive(Default, Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct NFC;\nimpl Normalizer for NFC {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.nfc();\n        Ok(())\n    }\n}\n\n#[derive(Default, Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct NFKC;\nimpl Normalizer for NFKC {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.nfkc();\n        Ok(())\n    }\n}\n\nfn do_nmt(normalized: &mut NormalizedString) {\n    // Ascii Control characters\n    normalized\n        .filter(|c| {\n            !matches!(\n                c as u32,\n                0x0001..=0x0008 |\n                0x000B |\n                0x000E..=0x001F |\n                0x007F |\n                0x008F |\n                0x009F\n            )\n        })\n        // Other code points considered as whitespace.\n        .map(|c| match c as u32 {\n            0x0009 => ' ',\n            0x000A => ' ',\n            0x000C => ' ',\n            0x000D => ' ',\n            0x1680 => ' ',\n            0x200B..=0x200F => ' ',\n            0x2028 => ' ',\n            0x2029 => ' ',\n            0x2581 => ' ',\n            0xFEFF => ' ',\n            0xFFFD => ' ',\n            _ => c,\n        });\n}\n\n#[derive(Default, Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Nmt;\nimpl Normalizer for Nmt {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        do_nmt(normalized);\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_nfkc() {\n        let original = \"\\u{fb01}\".to_string();\n        let normalized = \"fi\".to_string();\n        let mut n = NormalizedString::from(original.clone());\n        NFKC.normalize(&mut n).unwrap();\n\n        assert_eq!(\n            n,\n            NormalizedString::new(original, normalized, vec![(0, 3), (0, 3)], 0)\n        );\n\n        assert_eq!(n.alignments_original(), vec![(0, 2), (0, 2), (0, 2)]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/normalizers/utils.rs",
    "content": "use serde::{Deserialize, Serialize};\n\nuse crate::normalizers::NormalizerWrapper;\nuse crate::tokenizer::{NormalizedString, Normalizer, Result};\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Clone, Deserialize, Debug, Serialize)]\n#[serde(tag = \"type\")]\n/// Allows concatenating multiple other Normalizer as a Sequence.\n/// All the normalizers run in sequence in the given order against the same NormalizedString.\npub struct Sequence {\n    normalizers: Vec<NormalizerWrapper>,\n}\n\nimpl Sequence {\n    pub fn new(normalizers: Vec<NormalizerWrapper>) -> Self {\n        Self { normalizers }\n    }\n}\n\nimpl AsRef<[NormalizerWrapper]> for Sequence {\n    fn as_ref(&self) -> &[NormalizerWrapper] {\n        &self.normalizers\n    }\n}\n\nimpl AsMut<[NormalizerWrapper]> for Sequence {\n    fn as_mut(&mut self) -> &mut [NormalizerWrapper] {\n        &mut self.normalizers\n    }\n}\n\nimpl IntoIterator for Sequence {\n    type Item = NormalizerWrapper;\n    type IntoIter = std::vec::IntoIter<Self::Item>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        self.normalizers.into_iter()\n    }\n}\n\nimpl Normalizer for Sequence {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        for normalizer in &self.normalizers {\n            normalizer.normalize(normalized)?;\n        }\n        Ok(())\n    }\n}\n\n/// Lowercases the input\n#[derive(Copy, Clone, Debug)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Lowercase;\nimpl Normalizer for Lowercase {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {\n        normalized.lowercase();\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/bert.rs",
    "content": "use crate::tokenizer::{PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior};\nuse crate::utils::macro_rules_attribute;\nuse unicode_categories::UnicodeCategories;\n\nfn is_bert_punc(x: char) -> bool {\n    char::is_ascii_punctuation(&x) || x.is_punctuation()\n}\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct BertPreTokenizer;\n\nimpl PreTokenizer for BertPreTokenizer {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        pretokenized.split(|_, s| s.split(char::is_whitespace, SplitDelimiterBehavior::Removed))?;\n        pretokenized.split(|_, s| s.split(is_bert_punc, SplitDelimiterBehavior::Isolated))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{NormalizedString, OffsetReferential, OffsetType};\n\n    #[test]\n    fn basic() {\n        let pretok = BertPreTokenizer;\n        let mut pretokenized: PreTokenizedString = \"Hey friend!     How are you?!?\".into();\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hey\", (0, 3)),\n                (\"friend\", (4, 10)),\n                (\"!\", (10, 11)),\n                (\"How\", (16, 19)),\n                (\"are\", (20, 23)),\n                (\"you\", (24, 27)),\n                (\"?\", (27, 28)),\n                (\"!\", (28, 29)),\n                (\"?\", (29, 30)),\n            ]\n        );\n    }\n\n    #[test]\n    fn chinese_chars() {\n        let mut n = NormalizedString::from(\"野口里佳 Noguchi Rika\");\n        n.transform(\n            n.get().to_owned().chars().flat_map(|c| {\n                if (c as usize) > 0x4E00 {\n                    vec![(' ', 0), (c, 1), (' ', 1)]\n                } else {\n                    vec![(c, 0)]\n                }\n            }),\n            0,\n        );\n        let mut pretokenized = n.into();\n        let pretok = BertPreTokenizer;\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"野\", (0, 3)),\n                (\"口\", (3, 6)),\n                (\"里\", (6, 9)),\n                (\"佳\", (9, 12)),\n                (\"Noguchi\", (13, 20)),\n                (\"Rika\", (21, 25))\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/byte_level.rs",
    "content": "use ahash::{AHashMap, AHashSet};\nuse std::sync::LazyLock;\n\nuse crate::utils::SysRegex;\nuse serde::{Deserialize, Serialize};\n\nuse crate::tokenizer::{\n    Decoder, Encoding, PostProcessor, PreTokenizedString, PreTokenizer, Result,\n    SplitDelimiterBehavior,\n};\nuse crate::utils::macro_rules_attribute;\n\n/// Converts bytes to unicode characters.\n/// See https://github.com/openai/gpt-2/blob/master/src/encoder.py#L9\npub(crate) fn bytes_char() -> AHashMap<u8, char> {\n    let mut bs: Vec<u8> = vec![];\n    bs.extend(b'!'..=b'~');\n    bs.extend(b'\\xA1'..=b'\\xAC');\n    bs.extend(b'\\xAE'..=b'\\xFF');\n\n    let mut cs: Vec<u32> = bs.iter().map(|i| *i as u32).collect();\n    let mut n = 0;\n\n    for b in 0..=255u8 {\n        if !bs.contains(&b) {\n            bs.push(b);\n            cs.push(u32::pow(2, 8) + n);\n            n += 1;\n        }\n    }\n\n    // Safety: cs contains all values from bs (between 0 and 255),\n    // and some values of value 2⁸ + n, where n is between 0 and 255. This is between 255 and 512.\n    // Both ranges are valid UTF-32 values (which is fully saturated until 0xD000)\n    bs.into_iter()\n        .zip(cs)\n        .map(|(f, t)| (f, unsafe { std::char::from_u32_unchecked(t) }))\n        .collect()\n}\n\n/// Regex that matches exactly one token.\n/// See https://github.com/openai/gpt-2/blob/master/src/encoder.py#L98\nstatic RE: LazyLock<SysRegex> = LazyLock::new(|| {\n    SysRegex::new(r\"'s|'t|'re|'ve|'m|'ll|'d| ?\\p{L}+| ?\\p{N}+| ?[^\\s\\p{L}\\p{N}]+|\\s+(?!\\S)|\\s+\")\n        .unwrap()\n});\nstatic BYTES_CHAR: LazyLock<AHashMap<u8, char>> = LazyLock::new(bytes_char);\nstatic CHAR_BYTES: LazyLock<AHashMap<char, u8>> =\n    LazyLock::new(|| bytes_char().into_iter().map(|(c, b)| (b, c)).collect());\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\n/// Provides all the necessary steps to handle the BPE tokenization at the byte-level. Takes care\n/// of all the required processing steps to transform a UTF-8 string as needed before and after the\n/// BPE model does its job.\n#[macro_rules_attribute(impl_serde_type!)]\n#[non_exhaustive]\npub struct ByteLevel {\n    /// Whether to add a leading space to the first word. This allows to treat the leading word\n    /// just as any other word.\n    pub add_prefix_space: bool,\n    /// Whether the post processing step should trim offsets to avoid including whitespaces.\n    pub trim_offsets: bool,\n\n    /// Whether to use the standard GPT2 regex for whitespace splitting\n    /// Set it to False if you want to use your own splitting.\n    #[serde(default = \"default_true\")]\n    pub use_regex: bool,\n}\n\nfn default_true() -> bool {\n    true\n}\n\nimpl Default for ByteLevel {\n    fn default() -> Self {\n        Self {\n            add_prefix_space: true,\n            trim_offsets: true,\n            use_regex: true,\n        }\n    }\n}\n\nimpl ByteLevel {\n    pub fn new(add_prefix_space: bool, trim_offsets: bool, use_regex: bool) -> Self {\n        Self {\n            add_prefix_space,\n            trim_offsets,\n            use_regex,\n        }\n    }\n\n    pub fn alphabet() -> AHashSet<char> {\n        BYTES_CHAR.values().copied().collect()\n    }\n\n    #[must_use]\n    pub fn add_prefix_space(mut self, v: bool) -> Self {\n        self.add_prefix_space = v;\n        self\n    }\n\n    #[must_use]\n    pub fn trim_offsets(mut self, v: bool) -> Self {\n        self.trim_offsets = v;\n        self\n    }\n\n    #[must_use]\n    pub fn use_regex(mut self, v: bool) -> Self {\n        self.use_regex = v;\n        self\n    }\n}\n\n/// As a `PreTokenizer`, `ByteLevel` is in charge of transforming all the unicode characters into\n/// their byte-level counterpart. It also splits the input according to the configured regex.\n// TODO: Give the ability to modify this regex\nimpl PreTokenizer for ByteLevel {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        let re_ref: &SysRegex = &RE;\n        pretokenized.split(|_, mut normalized| {\n            if self.add_prefix_space && !normalized.get().starts_with(' ') {\n                normalized.prepend(\" \");\n            }\n            if self.use_regex {\n                normalized.split(re_ref, SplitDelimiterBehavior::Isolated)\n            } else {\n                Ok(vec![normalized])\n            }\n        })?;\n        pretokenized.normalize(|normalized| {\n            let s = normalized.get();\n            let mut transformations: Vec<(char, isize)> = Vec::with_capacity(s.len());\n            for (i, cur_char) in s.char_indices() {\n                let size = cur_char.len_utf8();\n                transformations.extend(\n                    s.as_bytes()[i..i + size]\n                        .iter()\n                        .enumerate()\n                        .map(|(i, b)| (BYTES_CHAR[b], isize::from(i > 0))),\n                );\n            }\n            normalized.transform(transformations, 0);\n            Ok(())\n        })\n    }\n}\n\n/// As a `Decoder`, `ByteLevel` is in charge of converting any byte-level characters to their\n/// unicode counterpart, before merging everything back into a single String.\n/// This decoder will consume the tokens and merge them in one step to alleviate\n/// the fact that single token decoded might be a byte not representable as\n/// as String.\nimpl Decoder for ByteLevel {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        let toks = tokens\n            .into_iter()\n            .flat_map(|t| {\n                t.chars()\n                    .try_fold(vec![], |mut acc, c| {\n                        CHAR_BYTES.get(&c).map(|b| {\n                            acc.push(*b);\n                            acc\n                        })\n                    })\n                    .unwrap_or_else(|| t.as_bytes().to_vec())\n            })\n            .collect::<Vec<u8>>();\n        Ok(vec![String::from_utf8_lossy(&toks).to_string()])\n    }\n}\n\n/// As a `PostProcessor`, `ByteLevel` is in charge of trimming the offsets if necessary.\nimpl PostProcessor for ByteLevel {\n    fn added_tokens(&self, _is_pair: bool) -> usize {\n        0\n    }\n\n    fn process_encodings(\n        &self,\n        mut encodings: Vec<Encoding>,\n        _add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        if self.trim_offsets {\n            for encoding in encodings.iter_mut() {\n                process_offsets(encoding, self.add_prefix_space);\n                encoding\n                    .get_overflowing_mut()\n                    .iter_mut()\n                    .for_each(|encoding| process_offsets(encoding, self.add_prefix_space));\n            }\n        }\n        for (i, encoding) in encodings.iter_mut().enumerate() {\n            encoding.set_sequence_id(i);\n        }\n        Ok(encodings)\n        //<dyn PostProcessor>::default_process(encodings, add_special_tokens)\n    }\n}\n\npub fn process_offsets(encoding: &mut Encoding, add_prefix_space: bool) {\n    encoding.process_tokens_with_offsets_mut(|(i, (token, offsets))| {\n        let mut leading_spaces = token\n            .chars()\n            .take_while(|c| *c == BYTES_CHAR[&b' '] || c.is_whitespace())\n            .count();\n        let trailing_spaces = token\n            .chars()\n            .rev()\n            .take_while(|c| *c == BYTES_CHAR[&b' '] || c.is_whitespace())\n            .count();\n\n        if leading_spaces > 0 || trailing_spaces > 0 {\n            if leading_spaces > 0 {\n                // If user uses `is_pretokenized=True` we might have\n                // offsets that might begin at the start of the string but are\n                // NOT the first token.\n                let is_first = i == 0 || offsets.0 == 0;\n                if is_first && add_prefix_space && leading_spaces == 1 {\n                    // If we are processing the first pair of offsets, with `add_prefix_space`,\n                    // then we shouldn't remove anything we added. If there are more than one\n                    // leading spaces though, it means we didn't add them, and they should be\n                    // removed.\n                    leading_spaces = 0;\n                }\n                offsets.0 = std::cmp::min(offsets.0 + leading_spaces, offsets.1);\n            }\n            if trailing_spaces > 0 && offsets.1 >= trailing_spaces {\n                offsets.1 = std::cmp::max(offsets.1 - trailing_spaces, offsets.0);\n            }\n        }\n    });\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::tokenizer::{\n        Decoder, Encoding, OffsetReferential, OffsetType, PostProcessor, PreTokenizedString,\n        PreTokenizer,\n    };\n    use std::iter::FromIterator;\n\n    #[test]\n    fn pre_tokenization() {\n        let bytelevel = ByteLevel::default().add_prefix_space(false);\n        let mut pretokenized: PreTokenizedString = \"Hello my friend, how is your day going?\".into();\n        bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hello\", (0, 5)),\n                (\"Ġmy\", (5, 8)),\n                (\"Ġfriend\", (8, 15)),\n                (\",\", (15, 16)),\n                (\"Ġhow\", (16, 20)),\n                (\"Ġis\", (20, 23)),\n                (\"Ġyour\", (23, 28)),\n                (\"Ġday\", (28, 32)),\n                (\"Ġgoing\", (32, 38)),\n                (\"?\", (38, 39))\n            ]\n        );\n    }\n\n    #[test]\n    fn pre_tokenization_no_regex() {\n        let bytelevel = ByteLevel::default().use_regex(false);\n        let mut pretokenized: PreTokenizedString = \"Hello my friend, how is your day going?\".into();\n        bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"ĠHelloĠmyĠfriend,ĠhowĠisĠyourĠdayĠgoing?\", (0, 39))]\n        );\n    }\n\n    #[test]\n    fn decoding() {\n        let bytelevel = ByteLevel::default().add_prefix_space(false);\n        assert_eq!(\n            bytelevel\n                .decode_chain(\n                    vec![\n                        \"Hello\", \"Ġmy\", \"Ġfriend\", \",\", \"Ġhow\", \"Ġis\", \"Ġyour\", \"Ġday\", \"Ġgoing\",\n                        \"?\"\n                    ]\n                    .into_iter()\n                    .map(|s| s.into())\n                    .collect::<Vec<String>>()\n                )\n                .unwrap(),\n            vec![\"Hello my friend, how is your day going?\"]\n        );\n    }\n\n    #[test]\n    fn add_prefix_space() {\n        let bytelevel = ByteLevel::default().add_prefix_space(true);\n        for s in &[\n            \" Hello my friend, how is your day going?\",\n            \"Hello my friend, how is your day going?\",\n        ] {\n            let mut pretokenized = PreTokenizedString::from(*s);\n            bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n            assert_eq!(\n                pretokenized\n                    .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                    .into_iter()\n                    .map(|(s, o, _)| (s, o))\n                    .collect::<Vec<_>>(),\n                vec![\n                    (\"ĠHello\", (0, 7)),\n                    (\"Ġmy\", (7, 11)),\n                    (\"Ġfriend\", (11, 19)),\n                    (\",\", (19, 20)),\n                    (\"Ġhow\", (20, 25)),\n                    (\"Ġis\", (25, 29)),\n                    (\"Ġyour\", (29, 35)),\n                    (\"Ġday\", (35, 40)),\n                    (\"Ġgoing\", (40, 47)),\n                    (\"?\", (47, 48))\n                ]\n            );\n        }\n    }\n\n    #[test]\n    fn decode_works_on_separated_tokens() {\n        let samples = vec![\n            \"A Nuskhuri abbreviation of იესუ ქრისტე ( iesu kriste ) \\\" Jesus Christ \\\"\",\n            \"An equal number have descenders , like p or q in English \\\n                 : გ , დ , ე , ვ , კ , ლ , ჟ , ტ , უ , ფ , ღ , ყ , ც\",\n        ];\n\n        let bytelevel = ByteLevel::default().add_prefix_space(false);\n        for sample in samples {\n            let mut pretokenized = PreTokenizedString::from(sample);\n            bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n            let separated_tokens = pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .iter()\n                .flat_map(|(s, _, _)| s.split(\"\").map(|t| t.into()))\n                .collect::<Vec<_>>();\n            assert_eq!(\n                sample,\n                bytelevel.decode_chain(separated_tokens).unwrap().join(\"\")\n            );\n        }\n    }\n\n    #[test]\n    fn handling_of_newlines() {\n        let mut pretokenized = PreTokenizedString::from(\"Hello there\\nHello there\");\n        let bytelevel = ByteLevel::default().add_prefix_space(false);\n        bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hello\", (0, 5)),\n                (\"Ġthere\", (5, 11)),\n                (\"Ċ\", (11, 12)),\n                (\"Hello\", (12, 17)),\n                (\"Ġthere\", (17, 23))\n            ]\n        );\n    }\n\n    #[test]\n    fn handling_of_multiple_whitespaces() {\n        let mut pretokenized = PreTokenizedString::from(\"Hello there       dear\");\n        let bytelevel = ByteLevel::default().add_prefix_space(false);\n        bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hello\", (0, 5)),\n                (\"Ġthere\", (5, 11)),\n                (\"ĠĠĠĠĠĠ\", (11, 17)),\n                (\"Ġdear\", (17, 22))\n            ]\n        );\n    }\n\n    #[test]\n    fn offsets_when_char_split_up() {\n        let input = \"i⭢j\";\n        let mut pretokenized = PreTokenizedString::from(input);\n        let bytelevel = ByteLevel::default().add_prefix_space(false);\n        bytelevel.pre_tokenize(&mut pretokenized).unwrap();\n\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"i\", (0, 1)), (\"âŃ¢\", (1, 4)), (\"j\", (4, 5))]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"i\", (0, 1)), (\"âŃ¢\", (1, 7)), (\"j\", (7, 8))]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(_, o, _)| &input[o.0..o.1])\n                .collect::<Vec<_>>(),\n            vec![\"i\", \"⭢\", \"j\"]\n        );\n    }\n\n    #[test]\n    fn processor_trims_offsets_pre_tokenized() {\n        // If user uses `is_pretokenized=True` we might have\n        // offsets that might begin at the start of the string but are\n        // NOT the first token.\n        let mut encoding = Encoding::new(\n            vec![0; 5],\n            vec![],\n            vec![\"Ġl\".into(), \"ove\".into(), \"Ġl\".into(), \"ove\".into()],\n            vec![],\n            vec![(0, 1), (1, 4), (0, 1), (1, 4)],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::new(),\n        );\n        process_offsets(&mut encoding, true);\n        assert_eq!(\n            encoding,\n            Encoding::new(\n                vec![0; 5],\n                vec![],\n                vec![\"Ġl\".into(), \"ove\".into(), \"Ġl\".into(), \"ove\".into()],\n                vec![],\n                vec![(0, 1), (1, 4), (0, 1), (1, 4)],\n                vec![],\n                vec![],\n                vec![],\n                AHashMap::new(),\n            )\n        );\n    }\n\n    #[test]\n    fn processor_trims_offsets() {\n        let start = Encoding::new(\n            vec![0; 5],\n            vec![],\n            vec![\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n            ],\n            vec![],\n            vec![(0, 1), (0, 11), (11, 18), (18, 25), (25, 29)],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::new(),\n        );\n        let expected = Encoding::new(\n            vec![0; 5],\n            vec![0; 5],\n            vec![\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n            ],\n            vec![],\n            vec![(0, 0), (4, 9), (13, 18), (18, 23), (29, 29)],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::from_iter(vec![(0, 0..5)]),\n        );\n\n        let bytelevel = ByteLevel::default().trim_offsets(true);\n        assert_eq!(\n            expected,\n            bytelevel.process(start.clone(), None, false).unwrap()\n        );\n\n        let pair_expected = Encoding::new(\n            vec![0; 10],\n            vec![0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n            vec![\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n            ],\n            vec![],\n            vec![\n                (0, 0),\n                (4, 9),\n                (13, 18),\n                (18, 23),\n                (29, 29),\n                (0, 0),\n                (4, 9),\n                (13, 18),\n                (18, 23),\n                (29, 29),\n            ],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::from_iter(vec![(0, 0..5), (1, 5..10)]),\n        );\n        assert_eq!(\n            pair_expected,\n            bytelevel\n                .process(start.clone(), Some(start), false)\n                .unwrap()\n        );\n    }\n\n    #[test]\n    fn decode_unknown_characters() {\n        let byte_level = ByteLevel::default();\n        assert_eq!(\n            byte_level\n                .decode_chain(vec![\n                    \"Hello\".into(),\n                    \"Ġthere\".into(),\n                    \"Ġdear\".into(),\n                    \"Ġfriend!\".into(),\n                    \"Ġ\".into(),\n                    \"[PA D]\".into()\n                ])\n                .unwrap(),\n            vec![\"Hello there dear friend! [PA D]\"]\n        );\n    }\n\n    #[test]\n    fn deserialization() {\n        // Before use_regex\n        let byte_level: ByteLevel = serde_json::from_str(\n            r#\"{\"type\": \"ByteLevel\", \"add_prefix_space\": true, \"trim_offsets\": false}\"#,\n        )\n        .unwrap();\n        assert!(byte_level.use_regex);\n\n        // Loading works, new future BC test.\n        let byte_level: ByteLevel = serde_json::from_str(\n            r#\"{\"type\": \"ByteLevel\", \"add_prefix_space\": true, \"trim_offsets\": false, \"use_regex\": true}\"#,\n        )\n        .unwrap();\n        assert!(byte_level.use_regex);\n\n        let byte_level: ByteLevel = serde_json::from_str(\n            r#\"{\"type\": \"ByteLevel\", \"add_prefix_space\": true, \"trim_offsets\": false, \"use_regex\": false}\"#,\n        )\n        .unwrap();\n        assert!(!byte_level.use_regex);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/delimiter.rs",
    "content": "use serde::{Deserialize, Serialize};\n\nuse crate::tokenizer::{PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior};\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\n#[non_exhaustive]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct CharDelimiterSplit {\n    pub delimiter: char,\n}\n\nimpl CharDelimiterSplit {\n    pub fn new(delimiter: char) -> Self {\n        Self { delimiter }\n    }\n}\n\nimpl PreTokenizer for CharDelimiterSplit {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        // TODO: Maybe add the option to specify the behavior\n        pretokenized.split(|_, normalized| {\n            normalized.split(self.delimiter, SplitDelimiterBehavior::Removed)\n        })\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/digits.rs",
    "content": "use serde::{Deserialize, Serialize};\n\nuse crate::tokenizer::{PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior};\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Clone, Debug, PartialEq, Eq)]\n/// Pre tokenizes the numbers into single tokens. If individual_digits is set\n/// to true, then all digits are splitted into individual tokens.\n#[non_exhaustive]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Digits {\n    pub individual_digits: bool,\n}\n\nimpl Digits {\n    pub fn new(individual_digits: bool) -> Self {\n        Self { individual_digits }\n    }\n}\n\nimpl Default for Digits {\n    fn default() -> Self {\n        Self::new(false)\n    }\n}\n\nimpl PreTokenizer for Digits {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        if self.individual_digits {\n            pretokenized.split(|_, normalized| {\n                normalized.split(char::is_numeric, SplitDelimiterBehavior::Isolated)\n            })\n        } else {\n            pretokenized.split(|_, normalized| {\n                normalized.split(char::is_numeric, SplitDelimiterBehavior::Contiguous)\n            })\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{OffsetReferential, OffsetType};\n\n    #[test]\n    fn numbers() {\n        let pretok = Digits::new(false);\n        let mut pretokenized = PreTokenizedString::from(\"Hey 123 friend!\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"Hey \", (0, 4)), (\"123\", (4, 7)), (\" friend!\", (7, 15))]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"Hey \", (0, 4)), (\"123\", (4, 7)), (\" friend!\", (7, 15))]\n        );\n    }\n    #[test]\n    fn individual_digits() {\n        let pretok = Digits::new(true);\n        let mut pretokenized = PreTokenizedString::from(\"Hey 123 friend!\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hey \", (0, 4)),\n                (\"1\", (4, 5)),\n                (\"2\", (5, 6)),\n                (\"3\", (6, 7)),\n                (\" friend!\", (7, 15))\n            ]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hey \", (0, 4)),\n                (\"1\", (4, 5)),\n                (\"2\", (5, 6)),\n                (\"3\", (6, 7)),\n                (\" friend!\", (7, 15))\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/fixed_length.rs",
    "content": "use crate::normalizer::Range;\nuse crate::tokenizer::{PreTokenizedString, PreTokenizer, Result};\nuse serde::{Deserialize, Serialize};\n\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct FixedLength {\n    #[serde(default = \"default_length\")]\n    pub length: usize,\n}\n\nimpl FixedLength {\n    pub fn new(length: usize) -> Self {\n        Self { length }\n    }\n}\n\nfn default_length() -> usize {\n    5\n}\n\nimpl PreTokenizer for FixedLength {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        pretokenized.split(|_, normalized| {\n            let text = normalized.get();\n            if text.is_empty() {\n                return Ok(vec![]);\n            }\n\n            let mut splits = Vec::new();\n            let char_positions: Vec<_> = text.char_indices().collect();\n            for chunk in char_positions.chunks(self.length) {\n                let start = chunk.first().map(|(i, _)| *i).unwrap_or(0);\n                let end = chunk\n                    .last()\n                    .map(|(i, c)| i + c.len_utf8())\n                    .unwrap_or(text.len());\n                splits.push(\n                    normalized\n                        .slice(Range::Normalized(start..end))\n                        .ok_or(\"Failed to slice normalized text\")?,\n                );\n            }\n\n            Ok(splits)\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{OffsetReferential, OffsetType, PreTokenizer};\n\n    #[test]\n    fn basic() {\n        let tests = vec![\n            (\n                \"Hello world\",\n                vec![(\"Hello\", (0, 5)), (\" worl\", (5, 10)), (\"d\", (10, 11))],\n            ),\n            (\"Short\", vec![(\"Short\", (0, 5))]),\n            (\"\", vec![]),\n        ];\n        let pretok = FixedLength { length: 5 };\n        for (s, res) in tests {\n            let mut pretokenized = PreTokenizedString::from(s);\n            pretok.pre_tokenize(&mut pretokenized).unwrap();\n            assert_eq!(\n                pretokenized\n                    .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                    .into_iter()\n                    .map(|(s, o, _)| (s, o))\n                    .collect::<Vec<_>>(),\n                res\n            );\n        }\n    }\n\n    #[test]\n    fn custom_length() {\n        let pretok = FixedLength { length: 3 };\n        let mut pretokenized = PreTokenizedString::from(\"Hello world\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hel\", (0, 3)),\n                (\"lo \", (3, 6)),\n                (\"wor\", (6, 9)),\n                (\"ld\", (9, 11)),\n            ]\n        );\n    }\n\n    #[test]\n    fn utf8_characters() {\n        let pretok = FixedLength { length: 3 };\n        let mut pretokenized = PreTokenizedString::from(\"Hello 👋 world\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hel\", (0, 3)),\n                (\"lo \", (3, 6)),\n                (\"👋 w\", (6, 12)),\n                (\"orl\", (12, 15)),\n                (\"d\", (15, 16)),\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/metaspace.rs",
    "content": "use crate::tokenizer::{Decoder, PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior};\nuse serde::{de, Deserialize, Deserializer, Serialize};\n\n/// Enum representing options for the metaspace prepending scheme.\n#[derive(Debug, Clone, PartialEq, Serialize, Eq, Deserialize, Copy)]\n#[serde(rename_all = \"snake_case\")]\npub enum PrependScheme {\n    /// Specifies that the scheme should be prepended only once, on the first split.\n    First,\n    /// Specifies that the space should not be prepended.\n    Never,\n    /// Specifies that the scheme should always be prepended.\n    Always,\n}\n\nimpl std::fmt::Display for PrependScheme {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.serialize(f)\n    }\n}\n\n#[derive(Debug, Clone, PartialEq, Serialize, Eq)]\n/// Replaces all the whitespaces by the provided meta character and then\n/// splits on this character\n#[serde(tag = \"type\")]\npub struct Metaspace {\n    replacement: char,\n    pub prepend_scheme: PrependScheme,\n    pub split: bool,\n    #[serde(skip)]\n    str_rep: String,\n}\n\nimpl<'de> Deserialize<'de> for Metaspace {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        enum Type {\n            Metaspace,\n        }\n\n        fn default_prepend_scheme_value() -> PrependScheme {\n            PrependScheme::Always\n        }\n\n        #[derive(Deserialize)]\n        pub struct MetaspaceHelper {\n            #[serde(rename = \"type\")]\n            _type: Type,\n            replacement: char,\n\n            pub add_prefix_space: Option<bool>,\n            #[serde(default = \"default_prepend_scheme_value\")]\n            pub prepend_scheme: PrependScheme,\n            pub split: Option<bool>,\n            #[serde(rename = \"str_rep\")]\n            _str_rep: Option<String>,\n        }\n\n        let mut helper = MetaspaceHelper::deserialize(deserializer)?;\n        if let Some(false) = helper.add_prefix_space {\n            if helper.prepend_scheme != PrependScheme::Never {\n                return Err(de::Error::custom(\n                    \"add_prefix_space does not match declared prepend_scheme\",\n                ));\n            }\n            helper.prepend_scheme = PrependScheme::Never;\n        }\n        let instance = Self::new(\n            helper.replacement,\n            helper.prepend_scheme,\n            helper.split.unwrap_or(true),\n        );\n        Ok(instance)\n    }\n}\n\nimpl Metaspace {\n    pub fn new(replacement: char, prepend_scheme: PrependScheme, split: bool) -> Self {\n        Self {\n            replacement,\n            str_rep: replacement.to_string(),\n            prepend_scheme,\n            split,\n        }\n    }\n\n    pub fn get_replacement(&self) -> char {\n        self.replacement\n    }\n\n    pub fn set_replacement(&mut self, replacement: char) {\n        self.replacement = replacement;\n        self.str_rep = replacement.to_string();\n    }\n\n    pub fn get_split(&self) -> bool {\n        self.split\n    }\n\n    pub fn set_split(&mut self, split: bool) {\n        self.split = split;\n    }\n\n    pub fn get_prepend_scheme(&self) -> PrependScheme {\n        self.prepend_scheme\n    }\n\n    pub fn set_prepend_scheme(&mut self, scheme: PrependScheme) {\n        self.prepend_scheme = scheme;\n    }\n}\n\nimpl Default for Metaspace {\n    fn default() -> Self {\n        Self::new('▁', PrependScheme::Always, true)\n    }\n}\n\nimpl PreTokenizer for Metaspace {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        pretokenized.split(|_, mut normalized| {\n            normalized.replace(' ', &self.str_rep)?;\n            match self.prepend_scheme {\n                PrependScheme::Always => {\n                    if !normalized.get().starts_with(self.replacement) {\n                        normalized.prepend(&self.str_rep);\n                    }\n                }\n                PrependScheme::First => {\n                    if !normalized.get().starts_with(self.replacement)\n                        && normalized.offsets_original().0 == 0\n                    {\n                        normalized.prepend(&self.str_rep);\n                    }\n                }\n                PrependScheme::Never => {}\n            };\n            if self.split {\n                normalized.split(self.replacement, SplitDelimiterBehavior::MergedWithNext)\n            } else {\n                Ok(vec![normalized])\n            }\n        })\n    }\n}\n\nimpl Decoder for Metaspace {\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {\n        Ok(tokens\n            .iter()\n            .enumerate()\n            .map(|(i, token)| {\n                token\n                    .chars()\n                    .flat_map(|c| {\n                        if c == self.replacement {\n                            if i == 0 && self.prepend_scheme != PrependScheme::Never {\n                                None\n                            } else {\n                                Some(' ')\n                            }\n                        } else {\n                            Some(c)\n                        }\n                    })\n                    .collect::<String>()\n            })\n            .collect())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use regex::Regex;\n\n    use super::*;\n    use crate::{OffsetReferential, OffsetType};\n\n    #[test]\n    fn serialization() {\n        let metaspace = Metaspace::new('_', PrependScheme::Always, true);\n        let metaspace_s =\n            r#\"{\"type\":\"Metaspace\",\"replacement\":\"_\",\"prepend_scheme\":\"always\",\"split\":true}\"#;\n        assert_eq!(serde_json::to_string(&metaspace).unwrap(), metaspace_s);\n        assert_eq!(\n            serde_json::from_str::<Metaspace>(metaspace_s).unwrap(),\n            metaspace\n        );\n\n        // Also check it can deserialize previous versions\n        let metaspace_s = r#\"{\"type\":\"Metaspace\",\"replacement\":\"_\",\"add_prefix_space\":false,\"prepend_scheme\":\"always\"}\"#;\n        assert!(serde_json::from_str::<Metaspace>(metaspace_s).is_err(),);\n\n        let metaspace = Metaspace::new('_', PrependScheme::Always, true);\n        let metaspace_s = r#\"{\"type\":\"Metaspace\",\"str_rep\":\"_\",\"replacement\":\"_\",\"add_prefix_space\":true,\"prepend_scheme\":\"always\"}\"#;\n        assert_eq!(\n            serde_json::from_str::<Metaspace>(metaspace_s).unwrap(),\n            metaspace\n        );\n\n        let metaspace_parsed: Metaspace = serde_json::from_str(\n            r#\"{\"type\":\"Metaspace\",\"replacement\":\"_\",\"add_prefix_space\":true}\"#,\n        )\n        .unwrap();\n        assert_eq!(metaspace_parsed, metaspace);\n    }\n\n    #[test]\n    fn basic() {\n        let pretok = Metaspace::new('▁', PrependScheme::Always, true);\n        let mut pretokenized = PreTokenizedString::from(\"Hey friend!\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"▁Hey\", (0, 6)), (\"▁friend!\", (6, 16))]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"▁Hey\", (0, 3)), (\"▁friend!\", (3, 11))]\n        );\n    }\n\n    #[test]\n    fn multiple_spaces() {\n        let pretok = Metaspace::new('▁', PrependScheme::Always, true);\n        let mut pretokenized = PreTokenizedString::from(\"Hey   friend!\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"▁Hey\", (0, 6)),\n                (\"▁\", (6, 9)),\n                (\"▁\", (9, 12)),\n                (\"▁friend!\", (12, 22)),\n            ]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"▁Hey\", (0, 3)),\n                (\"▁\", (3, 4)),\n                (\"▁\", (4, 5)),\n                (\"▁friend!\", (5, 13)),\n            ]\n        );\n    }\n\n    #[test]\n    fn non_legacy_meta_space() {\n        let mut pretok = Metaspace::new('▁', PrependScheme::Always, true);\n        pretok.set_prepend_scheme(PrependScheme::Always);\n        assert_eq!(pretok, Metaspace::new('▁', PrependScheme::Always, true));\n\n        pretok.set_prepend_scheme(PrependScheme::Never);\n        assert_eq!(pretok, Metaspace::new('▁', PrependScheme::Never, true));\n\n        pretok.set_prepend_scheme(PrependScheme::First);\n        assert_eq!(pretok, Metaspace::new('▁', PrependScheme::First, true));\n\n        let pretok = Metaspace::new('▁', PrependScheme::First, false);\n        let mut pretokenized = PreTokenizedString::from(\"Hey my friend <s>how▁are you\");\n        let re_ref = Regex::new(r\"(<s>)\").unwrap();\n        pretokenized\n            .split(|_, sequence| sequence.split(&re_ref, SplitDelimiterBehavior::Isolated))\n            .expect(\"Bad split\");\n\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"▁Hey▁my▁friend▁\", (0, 23)),\n                (\"<s>\", (23, 26)),\n                (\"how▁are▁you\", (26, 41))\n            ]\n        );\n        let pretok = Metaspace::new('▁', PrependScheme::Always, true);\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"▁Hey\", (0, 6)),\n                (\"▁my\", (6, 11)),\n                (\"▁friend\", (11, 20)),\n                (\"▁\", (20, 23)),\n                (\"▁<s>\", (23, 29)),\n                (\"▁how\", (29, 35)),\n                (\"▁are\", (35, 41)),\n                (\"▁you\", (41, 47))\n            ]\n        );\n\n        let pretok = Metaspace::new('▁', PrependScheme::First, false);\n        let mut pretokenized = PreTokenizedString::from(\" Hey <s>how\"); // test with prefix\n        pretokenized\n            .split(|_, sequence| sequence.split(&re_ref, SplitDelimiterBehavior::Isolated))\n            .expect(\"Bad split\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"▁Hey▁\", (0, 9)), (\"<s>\", (9, 12)), (\"how\", (12, 15))]\n        );\n\n        let mut pretokenized = PreTokenizedString::from(\" Hey <s>how <s>are <s> you\"); // test with many splits\n        pretokenized\n            .split(|_, sequence| sequence.split(&re_ref, SplitDelimiterBehavior::Isolated))\n            .expect(\"Bad split\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"▁Hey▁\", (0, 9)),\n                (\"<s>\", (9, 12)),\n                (\"how▁\", (12, 18)),\n                (\"<s>\", (18, 21)),\n                (\"are▁\", (21, 27)),\n                (\"<s>\", (27, 30)),\n                (\"▁you\", (30, 36))\n            ]\n        );\n    }\n    #[test]\n    fn decode() {\n        let decoder = Metaspace::new('▁', PrependScheme::Always, true);\n        let res = decoder\n            .decode_chain(vec![\"▁Hey\".into(), \"▁friend!\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\"Hey\", \" friend!\"]);\n\n        let decoder = Metaspace::new('▁', PrependScheme::Never, true);\n        let res = decoder\n            .decode_chain(vec![\"▁Hey\".into(), \"▁friend!\".into()])\n            .unwrap();\n        assert_eq!(res, vec![\" Hey\", \" friend!\"]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/mod.rs",
    "content": "pub mod bert;\npub mod byte_level;\npub mod delimiter;\npub mod digits;\npub mod fixed_length;\npub mod metaspace;\npub mod punctuation;\npub mod sequence;\npub mod split;\npub mod unicode_scripts;\npub mod whitespace;\n\nuse serde::{Deserialize, Deserializer, Serialize};\n\nuse crate::pre_tokenizers::bert::BertPreTokenizer;\nuse crate::pre_tokenizers::byte_level::ByteLevel;\nuse crate::pre_tokenizers::delimiter::CharDelimiterSplit;\nuse crate::pre_tokenizers::digits::Digits;\nuse crate::pre_tokenizers::fixed_length::FixedLength;\nuse crate::pre_tokenizers::metaspace::Metaspace;\nuse crate::pre_tokenizers::punctuation::Punctuation;\nuse crate::pre_tokenizers::sequence::Sequence;\nuse crate::pre_tokenizers::split::Split;\nuse crate::pre_tokenizers::unicode_scripts::UnicodeScripts;\nuse crate::pre_tokenizers::whitespace::{Whitespace, WhitespaceSplit};\nuse crate::{PreTokenizedString, PreTokenizer};\n\n#[derive(Serialize, Clone, Debug, PartialEq)]\n#[serde(untagged)]\npub enum PreTokenizerWrapper {\n    BertPreTokenizer(BertPreTokenizer),\n    ByteLevel(ByteLevel),\n    Delimiter(CharDelimiterSplit),\n    Metaspace(Metaspace),\n    Whitespace(Whitespace),\n    Sequence(Sequence),\n    Split(Split),\n    Punctuation(Punctuation),\n    WhitespaceSplit(WhitespaceSplit),\n    Digits(Digits),\n    UnicodeScripts(UnicodeScripts),\n    FixedLength(FixedLength),\n}\n\nimpl PreTokenizer for PreTokenizerWrapper {\n    fn pre_tokenize(&self, normalized: &mut PreTokenizedString) -> crate::Result<()> {\n        match self {\n            Self::BertPreTokenizer(bpt) => bpt.pre_tokenize(normalized),\n            Self::ByteLevel(bpt) => bpt.pre_tokenize(normalized),\n            Self::Delimiter(dpt) => dpt.pre_tokenize(normalized),\n            Self::Metaspace(mspt) => mspt.pre_tokenize(normalized),\n            Self::Whitespace(wspt) => wspt.pre_tokenize(normalized),\n            Self::Punctuation(tok) => tok.pre_tokenize(normalized),\n            Self::Sequence(tok) => tok.pre_tokenize(normalized),\n            Self::Split(tok) => tok.pre_tokenize(normalized),\n            Self::WhitespaceSplit(wspt) => wspt.pre_tokenize(normalized),\n            Self::Digits(wspt) => wspt.pre_tokenize(normalized),\n            Self::UnicodeScripts(us) => us.pre_tokenize(normalized),\n            Self::FixedLength(fl) => fl.pre_tokenize(normalized),\n        }\n    }\n}\n\nimpl<'de> Deserialize<'de> for PreTokenizerWrapper {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        pub struct Tagged {\n            #[serde(rename = \"type\")]\n            variant: EnumType,\n            #[serde(flatten)]\n            rest: serde_json::Value,\n        }\n        #[derive(Deserialize, Serialize)]\n        pub enum EnumType {\n            BertPreTokenizer,\n            ByteLevel,\n            Delimiter,\n            Metaspace,\n            Whitespace,\n            Sequence,\n            Split,\n            Punctuation,\n            WhitespaceSplit,\n            Digits,\n            UnicodeScripts,\n            FixedLength,\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum PreTokenizerHelper {\n            Tagged(Tagged),\n            Legacy(serde_json::Value),\n        }\n\n        #[derive(Deserialize)]\n        #[serde(untagged)]\n        pub enum PreTokenizerUntagged {\n            BertPreTokenizer(BertPreTokenizer),\n            ByteLevel(ByteLevel),\n            Delimiter(CharDelimiterSplit),\n            Metaspace(Metaspace),\n            Whitespace(Whitespace),\n            Sequence(Sequence),\n            Split(Split),\n            Punctuation(Punctuation),\n            WhitespaceSplit(WhitespaceSplit),\n            Digits(Digits),\n            UnicodeScripts(UnicodeScripts),\n            FixedLength(FixedLength),\n        }\n\n        let helper = PreTokenizerHelper::deserialize(deserializer)?;\n\n        Ok(match helper {\n            PreTokenizerHelper::Tagged(pretok) => {\n                let mut values: serde_json::Map<String, serde_json::Value> =\n                    serde_json::from_value(pretok.rest).map_err(serde::de::Error::custom)?;\n                values.insert(\n                    \"type\".to_string(),\n                    serde_json::to_value(&pretok.variant).map_err(serde::de::Error::custom)?,\n                );\n                let values = serde_json::Value::Object(values);\n                match pretok.variant {\n                    EnumType::BertPreTokenizer => PreTokenizerWrapper::BertPreTokenizer(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::ByteLevel => PreTokenizerWrapper::ByteLevel(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Delimiter => PreTokenizerWrapper::Delimiter(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Metaspace => PreTokenizerWrapper::Metaspace(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Whitespace => PreTokenizerWrapper::Whitespace(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Sequence => PreTokenizerWrapper::Sequence(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Split => PreTokenizerWrapper::Split(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Punctuation => PreTokenizerWrapper::Punctuation(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::WhitespaceSplit => PreTokenizerWrapper::WhitespaceSplit(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::Digits => PreTokenizerWrapper::Digits(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::UnicodeScripts => PreTokenizerWrapper::UnicodeScripts(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                    EnumType::FixedLength => PreTokenizerWrapper::FixedLength(\n                        serde_json::from_value(values).map_err(serde::de::Error::custom)?,\n                    ),\n                }\n            }\n\n            PreTokenizerHelper::Legacy(value) => {\n                let untagged = serde_json::from_value(value).map_err(serde::de::Error::custom)?;\n                match untagged {\n                    PreTokenizerUntagged::BertPreTokenizer(bert) => {\n                        PreTokenizerWrapper::BertPreTokenizer(bert)\n                    }\n                    PreTokenizerUntagged::ByteLevel(byte_level) => {\n                        PreTokenizerWrapper::ByteLevel(byte_level)\n                    }\n                    PreTokenizerUntagged::Delimiter(delimiter) => {\n                        PreTokenizerWrapper::Delimiter(delimiter)\n                    }\n                    PreTokenizerUntagged::Metaspace(metaspace) => {\n                        PreTokenizerWrapper::Metaspace(metaspace)\n                    }\n                    PreTokenizerUntagged::Whitespace(whitespace) => {\n                        PreTokenizerWrapper::Whitespace(whitespace)\n                    }\n                    PreTokenizerUntagged::Sequence(sequence) => {\n                        PreTokenizerWrapper::Sequence(sequence)\n                    }\n                    PreTokenizerUntagged::Split(split) => PreTokenizerWrapper::Split(split),\n                    PreTokenizerUntagged::Punctuation(punctuation) => {\n                        PreTokenizerWrapper::Punctuation(punctuation)\n                    }\n                    PreTokenizerUntagged::WhitespaceSplit(whitespace_split) => {\n                        PreTokenizerWrapper::WhitespaceSplit(whitespace_split)\n                    }\n                    PreTokenizerUntagged::Digits(digits) => PreTokenizerWrapper::Digits(digits),\n                    PreTokenizerUntagged::UnicodeScripts(unicode_scripts) => {\n                        PreTokenizerWrapper::UnicodeScripts(unicode_scripts)\n                    }\n                    PreTokenizerUntagged::FixedLength(fixed_length) => {\n                        PreTokenizerWrapper::FixedLength(fixed_length)\n                    }\n                }\n            }\n        })\n    }\n}\n\nimpl_enum_from!(BertPreTokenizer, PreTokenizerWrapper, BertPreTokenizer);\nimpl_enum_from!(ByteLevel, PreTokenizerWrapper, ByteLevel);\nimpl_enum_from!(CharDelimiterSplit, PreTokenizerWrapper, Delimiter);\nimpl_enum_from!(Whitespace, PreTokenizerWrapper, Whitespace);\nimpl_enum_from!(Punctuation, PreTokenizerWrapper, Punctuation);\nimpl_enum_from!(Sequence, PreTokenizerWrapper, Sequence);\nimpl_enum_from!(Split, PreTokenizerWrapper, Split);\nimpl_enum_from!(Metaspace, PreTokenizerWrapper, Metaspace);\nimpl_enum_from!(WhitespaceSplit, PreTokenizerWrapper, WhitespaceSplit);\nimpl_enum_from!(Digits, PreTokenizerWrapper, Digits);\nimpl_enum_from!(UnicodeScripts, PreTokenizerWrapper, UnicodeScripts);\nimpl_enum_from!(FixedLength, PreTokenizerWrapper, FixedLength);\n\n#[cfg(test)]\nmod tests {\n    use super::metaspace::PrependScheme;\n    use super::*;\n\n    #[test]\n    fn test_deserialize() {\n        let pre_tokenizer: PreTokenizerWrapper = serde_json::from_str(r#\"{\"type\":\"Sequence\",\"pretokenizers\":[{\"type\":\"WhitespaceSplit\"},{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"str_rep\":\"▁\",\"add_prefix_space\":true}]}\"#).unwrap();\n\n        assert_eq!(\n            pre_tokenizer,\n            PreTokenizerWrapper::Sequence(Sequence::new(vec![\n                PreTokenizerWrapper::WhitespaceSplit(WhitespaceSplit {}),\n                PreTokenizerWrapper::Metaspace(Metaspace::new('▁', PrependScheme::Always, true))\n            ]))\n        );\n\n        let pre_tokenizer: PreTokenizerWrapper = serde_json::from_str(\n            r#\"{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"add_prefix_space\":true}\"#,\n        )\n        .unwrap();\n\n        assert_eq!(\n            pre_tokenizer,\n            PreTokenizerWrapper::Metaspace(Metaspace::new('▁', PrependScheme::Always, true))\n        );\n\n        let pre_tokenizer: PreTokenizerWrapper = serde_json::from_str(r#\"{\"type\":\"Sequence\",\"pretokenizers\":[{\"type\":\"WhitespaceSplit\"},{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"add_prefix_space\":true}]}\"#).unwrap();\n\n        assert_eq!(\n            pre_tokenizer,\n            PreTokenizerWrapper::Sequence(Sequence::new(vec![\n                PreTokenizerWrapper::WhitespaceSplit(WhitespaceSplit {}),\n                PreTokenizerWrapper::Metaspace(Metaspace::new('▁', PrependScheme::Always, true))\n            ]))\n        );\n\n        let pre_tokenizer: PreTokenizerWrapper = serde_json::from_str(\n            r#\"{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"add_prefix_space\":true, \"prepend_scheme\":\"first\"}\"#,\n        )\n        .unwrap();\n\n        assert_eq!(\n            pre_tokenizer,\n            PreTokenizerWrapper::Metaspace(Metaspace::new(\n                '▁',\n                metaspace::PrependScheme::First,\n                true\n            ))\n        );\n\n        let pre_tokenizer: PreTokenizerWrapper = serde_json::from_str(\n            r#\"{\"type\":\"Metaspace\",\"replacement\":\"▁\",\"add_prefix_space\":true, \"prepend_scheme\":\"always\"}\"#,\n        )\n        .unwrap();\n\n        assert_eq!(\n            pre_tokenizer,\n            PreTokenizerWrapper::Metaspace(Metaspace::new(\n                '▁',\n                metaspace::PrependScheme::Always,\n                true\n            ))\n        );\n    }\n\n    #[test]\n    fn test_deserialize_whitespace_split() {\n        let pre_tokenizer: PreTokenizerWrapper =\n            serde_json::from_str(r#\"{\"type\":\"WhitespaceSplit\"}\"#).unwrap();\n        assert_eq!(\n            pre_tokenizer,\n            PreTokenizerWrapper::WhitespaceSplit(WhitespaceSplit {})\n        );\n    }\n\n    #[test]\n    fn pre_tokenizer_deserialization_no_type() {\n        let json = r#\"{\"replacement\":\"▁\",\"add_prefix_space\":true, \"prepend_scheme\":\"always\"}}\"#;\n        let reconstructed = serde_json::from_str::<PreTokenizerWrapper>(json);\n        match reconstructed {\n            Err(err) => assert_eq!(\n                err.to_string(),\n                \"data did not match any variant of untagged enum PreTokenizerUntagged\"\n            ),\n            _ => panic!(\"Expected an error here\"),\n        }\n\n        let json = r#\"{\"type\":\"Metaspace\", \"replacement\":\"▁\" }\"#;\n        let reconstructed = serde_json::from_str::<PreTokenizerWrapper>(json).unwrap();\n        assert_eq!(\n            reconstructed,\n            PreTokenizerWrapper::Metaspace(Metaspace::default())\n        );\n\n        let json = r#\"{\"type\":\"Metaspace\", \"add_prefix_space\":true }\"#;\n        let reconstructed = serde_json::from_str::<PreTokenizerWrapper>(json);\n        match reconstructed {\n            Err(err) => assert_eq!(err.to_string(), \"missing field `replacement`\"),\n            _ => panic!(\"Expected an error here\"),\n        }\n        let json = r#\"{\"behavior\":\"default_split\"}\"#;\n        let reconstructed = serde_json::from_str::<PreTokenizerWrapper>(json);\n        match reconstructed {\n            Err(err) => assert_eq!(\n                err.to_string(),\n                \"data did not match any variant of untagged enum PreTokenizerUntagged\"\n            ),\n            _ => panic!(\"Expected an error here\"),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/punctuation.rs",
    "content": "use serde::{Deserialize, Serialize};\n\nuse crate::tokenizer::{PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior};\nuse crate::utils::macro_rules_attribute;\nuse unicode_categories::UnicodeCategories;\n\nfn is_punc(x: char) -> bool {\n    char::is_ascii_punctuation(&x) || x.is_punctuation()\n}\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Punctuation {\n    #[serde(default = \"default_split\")]\n    pub behavior: SplitDelimiterBehavior,\n}\n\nfn default_split() -> SplitDelimiterBehavior {\n    SplitDelimiterBehavior::Isolated\n}\n\nimpl Punctuation {\n    pub fn new(behavior: SplitDelimiterBehavior) -> Self {\n        Self { behavior }\n    }\n}\n\nimpl Default for Punctuation {\n    fn default() -> Self {\n        Self::new(SplitDelimiterBehavior::Isolated)\n    }\n}\n\nimpl PreTokenizer for Punctuation {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        pretokenized.split(|_, s| s.split(is_punc, self.behavior))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{OffsetReferential, OffsetType};\n\n    #[test]\n    fn punctuation_basic() {\n        let pretok = Punctuation::default();\n        let mut pretokenized: PreTokenizedString = \"Hey friend!     How are you?!?\".into();\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hey friend\", (0, 10)),\n                (\"!\", (10, 11)),\n                (\"     How are you\", (11, 27)),\n                (\"?\", (27, 28)),\n                (\"!\", (28, 29)),\n                (\"?\", (29, 30)),\n            ]\n        );\n    }\n\n    #[test]\n    fn deserialization() {\n        let punctuation: Punctuation = serde_json::from_str(r#\"{\"type\": \"Punctuation\"}\"#).unwrap();\n        assert_eq!(punctuation, Punctuation::default());\n        assert_eq!(\n            punctuation,\n            Punctuation::new(SplitDelimiterBehavior::Isolated)\n        );\n    }\n\n    #[test]\n    #[should_panic]\n    fn deserialization_erroneous() {\n        let _punctuation: Punctuation =\n            serde_json::from_str(r#\"{\"type\": \"WhitespaceSplit\"}\"#).unwrap();\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/sequence.rs",
    "content": "use crate::pre_tokenizers::PreTokenizerWrapper;\nuse crate::tokenizer::{PreTokenizedString, PreTokenizer, Result};\nuse crate::utils::macro_rules_attribute;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug, PartialEq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Sequence {\n    pretokenizers: Vec<PreTokenizerWrapper>,\n}\n\nimpl Sequence {\n    pub fn new(pretokenizers: Vec<PreTokenizerWrapper>) -> Self {\n        Self { pretokenizers }\n    }\n}\n\nimpl AsRef<[PreTokenizerWrapper]> for Sequence {\n    fn as_ref(&self) -> &[PreTokenizerWrapper] {\n        &self.pretokenizers\n    }\n}\n\nimpl AsMut<[PreTokenizerWrapper]> for Sequence {\n    fn as_mut(&mut self) -> &mut [PreTokenizerWrapper] {\n        &mut self.pretokenizers\n    }\n}\n\nimpl IntoIterator for Sequence {\n    type Item = PreTokenizerWrapper;\n    type IntoIter = std::vec::IntoIter<Self::Item>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        self.pretokenizers.into_iter()\n    }\n}\n\nimpl PreTokenizer for Sequence {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        for pretokenizer in &self.pretokenizers {\n            pretokenizer.pre_tokenize(pretokenized)?;\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::pre_tokenizers::{punctuation::Punctuation, whitespace::WhitespaceSplit};\n    use crate::{OffsetReferential, OffsetType};\n\n    #[test]\n    fn sequence_basic() {\n        let pretokenizers = vec![\n            PreTokenizerWrapper::WhitespaceSplit(WhitespaceSplit),\n            PreTokenizerWrapper::Punctuation(Punctuation::default()),\n        ];\n        let pretok = Sequence::new(pretokenizers);\n        let mut pretokenized: PreTokenizedString = \"Hey friend!     How are you?!?\".into();\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"Hey\", (0, 3)),\n                (\"friend\", (4, 10)),\n                (\"!\", (10, 11)),\n                (\"How\", (16, 19)),\n                (\"are\", (20, 23)),\n                (\"you\", (24, 27)),\n                (\"?\", (27, 28)),\n                (\"!\", (28, 29)),\n                (\"?\", (29, 30)),\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/split.rs",
    "content": "use crate::utils::SysRegex;\nuse serde::{Deserialize, Deserializer, Serialize};\n\nuse crate::tokenizer::{\n    pattern::Invert, PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior,\n};\n\n/// Represents the different patterns that `Split` can use\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\npub enum SplitPattern {\n    String(String),\n    Regex(String),\n}\n\nimpl From<String> for SplitPattern {\n    fn from(v: String) -> Self {\n        Self::String(v)\n    }\n}\n\nimpl From<&str> for SplitPattern {\n    fn from(v: &str) -> Self {\n        Self::String(v.to_owned())\n    }\n}\n\n#[derive(Debug, Serialize)]\n#[serde(tag = \"type\")]\npub struct Split {\n    pub pattern: SplitPattern,\n    #[serde(skip)]\n    pub regex: SysRegex,\n    pub behavior: SplitDelimiterBehavior,\n    pub invert: bool,\n}\n\nimpl<'de> Deserialize<'de> for Split {\n    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        #[derive(Deserialize)]\n        enum Type {\n            Split,\n        }\n\n        #[derive(Deserialize)]\n        pub struct SplitHelper {\n            #[serde(rename = \"type\")]\n            _type: Type,\n            pattern: SplitPattern,\n            behavior: SplitDelimiterBehavior,\n            invert: bool,\n        }\n\n        let helper = SplitHelper::deserialize(deserializer)?;\n        Self::new(helper.pattern, helper.behavior, helper.invert).map_err(serde::de::Error::custom)\n    }\n}\n\nimpl Clone for Split {\n    fn clone(&self) -> Self {\n        Self::new(self.pattern.clone(), self.behavior, self.invert).unwrap()\n    }\n}\n\nimpl PartialEq for Split {\n    fn eq(&self, other: &Self) -> bool {\n        self.pattern == other.pattern\n            && self.behavior == other.behavior\n            && self.invert == other.invert\n    }\n}\n\nimpl Split {\n    pub fn new<I: Into<SplitPattern>>(\n        pattern: I,\n        behavior: SplitDelimiterBehavior,\n        invert: bool,\n    ) -> Result<Self> {\n        let pattern: SplitPattern = pattern.into();\n        let regex = match &pattern {\n            SplitPattern::String(s) => SysRegex::new(&regex::escape(s))?,\n            SplitPattern::Regex(r) => SysRegex::new(r)?,\n        };\n\n        Ok(Self {\n            pattern,\n            regex,\n            behavior,\n            invert,\n        })\n    }\n}\n\nimpl PreTokenizer for Split {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        if self.invert {\n            pretokenized.split(|_, normalized| normalized.split(Invert(&self.regex), self.behavior))\n        } else {\n            pretokenized.split(|_, normalized| normalized.split(&self.regex, self.behavior))\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{OffsetReferential, OffsetType, PreTokenizer};\n    use SplitDelimiterBehavior::*;\n\n    #[test]\n    fn basic() {\n        let tests = vec![\n            (\n                Removed,\n                \"How are you doing?\",\n                vec![\n                    (\"How\", (0, 3)),\n                    (\"are\", (4, 7)),\n                    (\"you\", (8, 11)),\n                    (\"doing\", (12, 17)),\n                    (\"?\", (17, 18)),\n                ],\n            ),\n            (\n                Isolated,\n                \"How are you doing?\",\n                vec![\n                    (\"How\", (0, 3)),\n                    (\" \", (3, 4)),\n                    (\"are\", (4, 7)),\n                    (\" \", (7, 8)),\n                    (\"you\", (8, 11)),\n                    (\" \", (11, 12)),\n                    (\"doing\", (12, 17)),\n                    (\"?\", (17, 18)),\n                ],\n            ),\n            (\n                MergedWithPrevious,\n                \"How are you doing?\",\n                vec![\n                    (\"How \", (0, 4)),\n                    (\"are \", (4, 8)),\n                    (\"you \", (8, 12)),\n                    (\"doing\", (12, 17)),\n                    (\"?\", (17, 18)),\n                ],\n            ),\n            (\n                MergedWithNext,\n                \"How are you doing?\",\n                vec![\n                    (\"How\", (0, 3)),\n                    (\" are\", (3, 7)),\n                    (\" you\", (7, 11)),\n                    (\" doing\", (11, 17)),\n                    (\"?\", (17, 18)),\n                ],\n            ),\n            (\n                Contiguous,\n                \"How are you doing?\",\n                vec![\n                    (\"How\", (0, 3)),\n                    (\" \", (3, 4)),\n                    (\"are\", (4, 7)),\n                    (\" \", (7, 8)),\n                    (\"you\", (8, 11)),\n                    (\" \", (11, 12)),\n                    (\"doing?\", (12, 18)),\n                ],\n            ),\n        ];\n\n        // use whitespace regex\n        let regex = SplitPattern::Regex(r\"\\w+|[^\\w\\s]+\".into());\n\n        for (behavior, s, res) in tests {\n            let mut pretokenized = PreTokenizedString::from(s);\n            let pretok = Split::new(regex.clone(), behavior, true).unwrap();\n            pretok.pre_tokenize(&mut pretokenized).unwrap();\n            assert_eq!(\n                pretokenized\n                    .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                    .into_iter()\n                    .map(|(s, o, _)| (s, o))\n                    .collect::<Vec<_>>(),\n                res\n            );\n        }\n    }\n\n    #[test]\n    fn regex_string() {\n        let mut pretok_str_for_regex = PreTokenizedString::from(\"Hey, man!\");\n        let mut pretok_str_for_string = pretok_str_for_regex.clone();\n\n        // pre-tokenizer splits on \" \" - one from Regex, one from string\n        let pretokenizer_regex = Split::new(\n            SplitPattern::Regex(r\"\\s+\".into()),\n            SplitDelimiterBehavior::Removed,\n            false,\n        )\n        .unwrap();\n        let pretokenizer_string = Split::new(\" \", SplitDelimiterBehavior::Removed, false).unwrap();\n\n        pretokenizer_regex\n            .pre_tokenize(&mut pretok_str_for_regex)\n            .unwrap();\n        pretokenizer_string\n            .pre_tokenize(&mut pretok_str_for_string)\n            .unwrap();\n\n        assert_eq!(pretok_str_for_regex, pretok_str_for_string);\n    }\n\n    #[test]\n    fn invert() {\n        let mut pretok_str = PreTokenizedString::from(\"Hello Hello Hello\");\n        let mut pretok_str_for_invert = pretok_str.clone();\n\n        // one pre-tokenizer splits on \" \" - one splits inverted on \"Hello\"\n        let pretokenizer = Split::new(\" \", SplitDelimiterBehavior::Removed, false).unwrap();\n        let pretokenizer_invert =\n            Split::new(\"Hello\", SplitDelimiterBehavior::Removed, true).unwrap();\n\n        pretokenizer.pre_tokenize(&mut pretok_str).unwrap();\n        pretokenizer_invert\n            .pre_tokenize(&mut pretok_str_for_invert)\n            .unwrap();\n\n        assert_eq!(pretok_str, pretok_str_for_invert);\n    }\n\n    #[test]\n    fn serialization() {\n        use SplitDelimiterBehavior::*;\n\n        let split = Split::new(\"Hello\", Removed, true).unwrap();\n        let split_s =\n            r#\"{\"type\":\"Split\",\"pattern\":{\"String\":\"Hello\"},\"behavior\":\"Removed\",\"invert\":true}\"#;\n        assert_eq!(serde_json::to_string(&split).unwrap(), split_s);\n        assert_eq!(serde_json::from_str::<Split>(split_s).unwrap(), split);\n\n        let split = Split::new(SplitPattern::Regex(r\"\\s+\".into()), Isolated, false).unwrap();\n        let split_s =\n            r#\"{\"type\":\"Split\",\"pattern\":{\"Regex\":\"\\\\s+\"},\"behavior\":\"Isolated\",\"invert\":false}\"#;\n        assert_eq!(serde_json::to_string(&split).unwrap(), split_s);\n        assert_eq!(serde_json::from_str::<Split>(split_s).unwrap(), split);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/unicode_scripts/mod.rs",
    "content": "mod pre_tokenizer;\nmod scripts;\n\n// Re-export the PreTokenizer\npub use pre_tokenizer::UnicodeScripts;\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/unicode_scripts/pre_tokenizer.rs",
    "content": "use crate::pre_tokenizers::unicode_scripts::scripts::{get_script, Script};\nuse crate::tokenizer::{normalizer::Range, PreTokenizedString, PreTokenizer, Result};\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct UnicodeScripts;\n\nimpl UnicodeScripts {\n    pub fn new() -> Self {\n        Self {}\n    }\n}\n\nimpl Default for UnicodeScripts {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n// This code exists in the Unigram default IsValidSentencePiece.\n// It could be integrated directly within `get_script` but I\n// think it's kind of tricky to see those modifications later\n// I am guessing release mode will optimize this away anyway.\nfn fixed_script(c: char) -> Script {\n    let raw_script = get_script(c);\n    if c as u32 == 0x30FC {\n        Script::Han\n    } else if c == ' ' {\n        Script::Any\n    } else {\n        match raw_script {\n            Script::Hiragana => Script::Han,\n            Script::Katakana => Script::Han,\n            script => script,\n        }\n    }\n}\n\nimpl PreTokenizer for UnicodeScripts {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        pretokenized.split(|_, normalized| {\n            let mut last_script = None;\n            let mut offset = 0;\n            let mut ranges: Vec<_> = normalized\n                .get()\n                .chars()\n                .filter_map(|c| {\n                    let script = Some(fixed_script(c));\n                    let result = if script != Some(Script::Any)\n                        && last_script != Some(Script::Any)\n                        && last_script != script\n                    {\n                        Some(offset)\n                    } else {\n                        None\n                    };\n                    offset += c.len_utf8();\n                    if script != Some(Script::Any) {\n                        last_script = script;\n                    }\n\n                    result\n                })\n                .collect();\n            ranges.push(normalized.get().len());\n            Ok(ranges\n                .windows(2)\n                .map(|item| {\n                    normalized\n                        .slice(Range::Normalized(item[0]..item[1]))\n                        .expect(\"NormalizedString bad split\")\n                })\n                .collect::<Vec<_>>())\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::OffsetReferential;\n    use crate::OffsetType;\n\n    #[test]\n    fn basic() {\n        let pretok = UnicodeScripts {};\n        let mut pretokenized = PreTokenizedString::from(\"どこで生れ。Yes\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"どこで生れ\", (0, 15)), (\"。\", (15, 18)), (\"Yes\", (18, 21))]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"どこで生れ\", (0, 15)), (\"。\", (15, 18)), (\"Yes\", (18, 21))]\n        );\n    }\n\n    #[test]\n    fn spaces_are_included_in_every_script() {\n        let pretok = UnicodeScripts {};\n        let mut pretokenized = PreTokenizedString::from(\"Apples are りんご 林檎\");\n        pretok.pre_tokenize(&mut pretokenized).unwrap();\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Normalized, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"Apples are \", (0, 11)), (\"りんご 林檎\", (11, 27))]\n        );\n        assert_eq!(\n            pretokenized\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, o, _)| (s, o))\n                .collect::<Vec<_>>(),\n            vec![(\"Apples are \", (0, 11)), (\"りんご 林檎\", (11, 27))]\n        );\n    }\n\n    #[test]\n    fn test_unicode_script() {\n        assert_eq!(Script::Han, fixed_script('京'));\n        assert_eq!(Script::Han, fixed_script('太'));\n        assert_eq!(Script::Han, fixed_script('い'));\n        assert_eq!(Script::Han, fixed_script('グ'));\n        assert_eq!(Script::Han, fixed_script('ー'));\n        assert_eq!(Script::Latin, fixed_script('a'));\n        assert_eq!(Script::Latin, fixed_script('A'));\n        assert_eq!(Script::Common, fixed_script('0'));\n        assert_eq!(Script::Common, fixed_script('$'));\n        assert_eq!(Script::Common, fixed_script('@'));\n        assert_eq!(Script::Common, fixed_script('-'));\n        assert_eq!(Script::Any, fixed_script(' '));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/unicode_scripts/scripts.rs",
    "content": "// Generated by modified Perl script at https://github.com/google/sentencepiece/blob/master/data/gen_unicode_scripts_code.pl\n// Unicode scripts : https://gist.github.com/Narsil/07556f26dc84a6baeff4d499e68d3cd2\n// Rust adaptation : https://gist.github.com/Narsil/1df9fbbf5296a8d4d62de55dcb2fe700\n\n#[derive(PartialEq, Debug, Clone, Copy, Eq)]\npub enum Script {\n    Any,\n    Adlam,\n    Ahom,\n    AnatolianHieroglyphs,\n    Arabic,\n    Armenian,\n    Avestan,\n    Balinese,\n    Bamum,\n    BassaVah,\n    Batak,\n    Bengali,\n    Bhaiksuki,\n    Bopomofo,\n    Brahmi,\n    Braille,\n    Buginese,\n    Buhid,\n    CanadianAboriginal,\n    Carian,\n    CaucasianAlbanian,\n    Chakma,\n    Cham,\n    Cherokee,\n    Common,\n    Coptic,\n    Cuneiform,\n    Cypriot,\n    Cyrillic,\n    Deseret,\n    Devanagari,\n    Duployan,\n    EgyptianHieroglyphs,\n    Elbasan,\n    Ethiopic,\n    Georgian,\n    Glagolitic,\n    Gothic,\n    Grantha,\n    Greek,\n    Gujarati,\n    Gurmukhi,\n    Han,\n    Hangul,\n    Hanunoo,\n    Hatran,\n    Hebrew,\n    Hiragana,\n    ImperialAramaic,\n    Inherited,\n    InscriptionalPahlavi,\n    InscriptionalParthian,\n    Javanese,\n    Kaithi,\n    Kannada,\n    Katakana,\n    KayahLi,\n    Kharoshthi,\n    Khmer,\n    Khojki,\n    Khudawadi,\n    Lao,\n    Latin,\n    Lepcha,\n    Limbu,\n    LinearA,\n    LinearB,\n    Lisu,\n    Lycian,\n    Lydian,\n    Mahajani,\n    Malayalam,\n    Mandaic,\n    Manichaean,\n    Marchen,\n    MeeteiMayek,\n    MendeKikakui,\n    MeroiticCursive,\n    MeroiticHieroglyphs,\n    Miao,\n    Modi,\n    Mongolian,\n    Mro,\n    Multani,\n    Myanmar,\n    Nabataean,\n    NewTaiLue,\n    Newa,\n    Nko,\n    Ogham,\n    OlChiki,\n    OldHungarian,\n    OldItalic,\n    OldNorthArabian,\n    OldPermic,\n    OldPersian,\n    OldSouthArabian,\n    OldTurkic,\n    Oriya,\n    Osage,\n    Osmanya,\n    PahawhHmong,\n    Palmyrene,\n    PauCinHau,\n    PhagsPa,\n    Phoenician,\n    PsalterPahlavi,\n    Rejang,\n    Runic,\n    Samaritan,\n    Saurashtra,\n    Sharada,\n    Shavian,\n    Siddham,\n    SignWriting,\n    Sinhala,\n    SoraSompeng,\n    Sundanese,\n    SylotiNagri,\n    Syriac,\n    Tagalog,\n    Tagbanwa,\n    TaiLe,\n    TaiTham,\n    TaiViet,\n    Takri,\n    Tamil,\n    Tangut,\n    Telugu,\n    Thaana,\n    Thai,\n    Tibetan,\n    Tifinagh,\n    Tirhuta,\n    Ugaritic,\n    Vai,\n    WarangCiti,\n    Yi,\n}\n\npub fn get_script(c: char) -> Script {\n    match c as u32 {\n        0x0000..=0x001F => Script::Common,\n        0x0020 => Script::Common,\n        0x0021..=0x0023 => Script::Common,\n        0x0024 => Script::Common,\n        0x0025..=0x0027 => Script::Common,\n        0x0028 => Script::Common,\n        0x0029 => Script::Common,\n        0x002A => Script::Common,\n        0x002B => Script::Common,\n        0x002C => Script::Common,\n        0x002D => Script::Common,\n        0x002E..=0x002F => Script::Common,\n        0x0030..=0x0039 => Script::Common,\n        0x003A..=0x003B => Script::Common,\n        0x003C..=0x003E => Script::Common,\n        0x003F..=0x0040 => Script::Common,\n        0x005B => Script::Common,\n        0x005C => Script::Common,\n        0x005D => Script::Common,\n        0x005E => Script::Common,\n        0x005F => Script::Common,\n        0x0060 => Script::Common,\n        0x007B => Script::Common,\n        0x007C => Script::Common,\n        0x007D => Script::Common,\n        0x007E => Script::Common,\n        0x007F..=0x009F => Script::Common,\n        0x00A0 => Script::Common,\n        0x00A1 => Script::Common,\n        0x00A2..=0x00A5 => Script::Common,\n        0x00A6 => Script::Common,\n        0x00A7 => Script::Common,\n        0x00A8 => Script::Common,\n        0x00A9 => Script::Common,\n        0x00AB => Script::Common,\n        0x00AC => Script::Common,\n        0x00AD => Script::Common,\n        0x00AE => Script::Common,\n        0x00AF => Script::Common,\n        0x00B0 => Script::Common,\n        0x00B1 => Script::Common,\n        0x00B2..=0x00B3 => Script::Common,\n        0x00B4 => Script::Common,\n        0x00B5 => Script::Common,\n        0x00B6..=0x00B7 => Script::Common,\n        0x00B8 => Script::Common,\n        0x00B9 => Script::Common,\n        0x00BB => Script::Common,\n        0x00BC..=0x00BE => Script::Common,\n        0x00BF => Script::Common,\n        0x00D7 => Script::Common,\n        0x00F7 => Script::Common,\n        0x02B9..=0x02C1 => Script::Common,\n        0x02C2..=0x02C5 => Script::Common,\n        0x02C6..=0x02D1 => Script::Common,\n        0x02D2..=0x02DF => Script::Common,\n        0x02E5..=0x02E9 => Script::Common,\n        0x02EC => Script::Common,\n        0x02ED => Script::Common,\n        0x02EE => Script::Common,\n        0x02EF..=0x02FF => Script::Common,\n        0x0374 => Script::Common,\n        0x037E => Script::Common,\n        0x0385 => Script::Common,\n        0x0387 => Script::Common,\n        0x0589 => Script::Common,\n        0x0605 => Script::Common,\n        0x060C => Script::Common,\n        0x061B => Script::Common,\n        0x061C => Script::Common,\n        0x061F => Script::Common,\n        0x0640 => Script::Common,\n        0x06DD => Script::Common,\n        0x08E2 => Script::Common,\n        0x0964..=0x0965 => Script::Common,\n        0x0E3F => Script::Common,\n        0x0FD5..=0x0FD8 => Script::Common,\n        0x10FB => Script::Common,\n        0x16EB..=0x16ED => Script::Common,\n        0x1735..=0x1736 => Script::Common,\n        0x1802..=0x1803 => Script::Common,\n        0x1805 => Script::Common,\n        0x1CD3 => Script::Common,\n        0x1CE1 => Script::Common,\n        0x1CE9..=0x1CEC => Script::Common,\n        0x1CEE..=0x1CF1 => Script::Common,\n        0x1CF2..=0x1CF3 => Script::Common,\n        0x1CF5..=0x1CF6 => Script::Common,\n        0x2000..=0x200A => Script::Common,\n        0x200B => Script::Common,\n        0x200E..=0x200F => Script::Common,\n        0x2010..=0x2015 => Script::Common,\n        0x2016..=0x2017 => Script::Common,\n        0x2018 => Script::Common,\n        0x2019 => Script::Common,\n        0x201A => Script::Common,\n        0x201B..=0x201C => Script::Common,\n        0x201D => Script::Common,\n        0x201E => Script::Common,\n        0x201F => Script::Common,\n        0x2020..=0x2027 => Script::Common,\n        0x2028 => Script::Common,\n        0x2029 => Script::Common,\n        0x202A..=0x202E => Script::Common,\n        0x202F => Script::Common,\n        0x2030..=0x2038 => Script::Common,\n        0x2039 => Script::Common,\n        0x203A => Script::Common,\n        0x203B..=0x203E => Script::Common,\n        0x203F..=0x2040 => Script::Common,\n        0x2041..=0x2043 => Script::Common,\n        0x2044 => Script::Common,\n        0x2045 => Script::Common,\n        0x2046 => Script::Common,\n        0x2047..=0x2051 => Script::Common,\n        0x2052 => Script::Common,\n        0x2053 => Script::Common,\n        0x2054 => Script::Common,\n        0x2055..=0x205E => Script::Common,\n        0x205F => Script::Common,\n        0x2060..=0x2064 => Script::Common,\n        0x2066..=0x206F => Script::Common,\n        0x2070 => Script::Common,\n        0x2074..=0x2079 => Script::Common,\n        0x207A..=0x207C => Script::Common,\n        0x207D => Script::Common,\n        0x207E => Script::Common,\n        0x2080..=0x2089 => Script::Common,\n        0x208A..=0x208C => Script::Common,\n        0x208D => Script::Common,\n        0x208E => Script::Common,\n        0x20A0..=0x20BE => Script::Common,\n        0x2100..=0x2101 => Script::Common,\n        0x2102 => Script::Common,\n        0x2103..=0x2106 => Script::Common,\n        0x2107 => Script::Common,\n        0x2108..=0x2109 => Script::Common,\n        0x210A..=0x2113 => Script::Common,\n        0x2114 => Script::Common,\n        0x2115 => Script::Common,\n        0x2116..=0x2117 => Script::Common,\n        0x2118 => Script::Common,\n        0x2119..=0x211D => Script::Common,\n        0x211E..=0x2123 => Script::Common,\n        0x2124 => Script::Common,\n        0x2125 => Script::Common,\n        0x2127 => Script::Common,\n        0x2128 => Script::Common,\n        0x2129 => Script::Common,\n        0x212C..=0x212D => Script::Common,\n        0x212E => Script::Common,\n        0x212F..=0x2131 => Script::Common,\n        0x2133..=0x2134 => Script::Common,\n        0x2135..=0x2138 => Script::Common,\n        0x2139 => Script::Common,\n        0x213A..=0x213B => Script::Common,\n        0x213C..=0x213F => Script::Common,\n        0x2140..=0x2144 => Script::Common,\n        0x2145..=0x2149 => Script::Common,\n        0x214A => Script::Common,\n        0x214B => Script::Common,\n        0x214C..=0x214D => Script::Common,\n        0x214F => Script::Common,\n        0x2150..=0x215F => Script::Common,\n        0x2189 => Script::Common,\n        0x218A..=0x218B => Script::Common,\n        0x2190..=0x2194 => Script::Common,\n        0x2195..=0x2199 => Script::Common,\n        0x219A..=0x219B => Script::Common,\n        0x219C..=0x219F => Script::Common,\n        0x21A0 => Script::Common,\n        0x21A1..=0x21A2 => Script::Common,\n        0x21A3 => Script::Common,\n        0x21A4..=0x21A5 => Script::Common,\n        0x21A6 => Script::Common,\n        0x21A7..=0x21AD => Script::Common,\n        0x21AE => Script::Common,\n        0x21AF..=0x21CD => Script::Common,\n        0x21CE..=0x21CF => Script::Common,\n        0x21D0..=0x21D1 => Script::Common,\n        0x21D2 => Script::Common,\n        0x21D3 => Script::Common,\n        0x21D4 => Script::Common,\n        0x21D5..=0x21F3 => Script::Common,\n        0x21F4..=0x22FF => Script::Common,\n        0x2300..=0x2307 => Script::Common,\n        0x2308 => Script::Common,\n        0x2309 => Script::Common,\n        0x230A => Script::Common,\n        0x230B => Script::Common,\n        0x230C..=0x231F => Script::Common,\n        0x2320..=0x2321 => Script::Common,\n        0x2322..=0x2328 => Script::Common,\n        0x2329 => Script::Common,\n        0x232A => Script::Common,\n        0x232B..=0x237B => Script::Common,\n        0x237C => Script::Common,\n        0x237D..=0x239A => Script::Common,\n        0x239B..=0x23B3 => Script::Common,\n        0x23B4..=0x23DB => Script::Common,\n        0x23DC..=0x23E1 => Script::Common,\n        0x23E2..=0x23FE => Script::Common,\n        0x2400..=0x2426 => Script::Common,\n        0x2440..=0x244A => Script::Common,\n        0x2460..=0x249B => Script::Common,\n        0x249C..=0x24E9 => Script::Common,\n        0x24EA..=0x24FF => Script::Common,\n        0x2500..=0x25B6 => Script::Common,\n        0x25B7 => Script::Common,\n        0x25B8..=0x25C0 => Script::Common,\n        0x25C1 => Script::Common,\n        0x25C2..=0x25F7 => Script::Common,\n        0x25F8..=0x25FF => Script::Common,\n        0x2600..=0x266E => Script::Common,\n        0x266F => Script::Common,\n        0x2670..=0x2767 => Script::Common,\n        0x2768 => Script::Common,\n        0x2769 => Script::Common,\n        0x276A => Script::Common,\n        0x276B => Script::Common,\n        0x276C => Script::Common,\n        0x276D => Script::Common,\n        0x276E => Script::Common,\n        0x276F => Script::Common,\n        0x2770 => Script::Common,\n        0x2771 => Script::Common,\n        0x2772 => Script::Common,\n        0x2773 => Script::Common,\n        0x2774 => Script::Common,\n        0x2775 => Script::Common,\n        0x2776..=0x2793 => Script::Common,\n        0x2794..=0x27BF => Script::Common,\n        0x27C0..=0x27C4 => Script::Common,\n        0x27C5 => Script::Common,\n        0x27C6 => Script::Common,\n        0x27C7..=0x27E5 => Script::Common,\n        0x27E6 => Script::Common,\n        0x27E7 => Script::Common,\n        0x27E8 => Script::Common,\n        0x27E9 => Script::Common,\n        0x27EA => Script::Common,\n        0x27EB => Script::Common,\n        0x27EC => Script::Common,\n        0x27ED => Script::Common,\n        0x27EE => Script::Common,\n        0x27EF => Script::Common,\n        0x27F0..=0x27FF => Script::Common,\n        0x2900..=0x2982 => Script::Common,\n        0x2983 => Script::Common,\n        0x2984 => Script::Common,\n        0x2985 => Script::Common,\n        0x2986 => Script::Common,\n        0x2987 => Script::Common,\n        0x2988 => Script::Common,\n        0x2989 => Script::Common,\n        0x298A => Script::Common,\n        0x298B => Script::Common,\n        0x298C => Script::Common,\n        0x298D => Script::Common,\n        0x298E => Script::Common,\n        0x298F => Script::Common,\n        0x2990 => Script::Common,\n        0x2991 => Script::Common,\n        0x2992 => Script::Common,\n        0x2993 => Script::Common,\n        0x2994 => Script::Common,\n        0x2995 => Script::Common,\n        0x2996 => Script::Common,\n        0x2997 => Script::Common,\n        0x2998 => Script::Common,\n        0x2999..=0x29D7 => Script::Common,\n        0x29D8 => Script::Common,\n        0x29D9 => Script::Common,\n        0x29DA => Script::Common,\n        0x29DB => Script::Common,\n        0x29DC..=0x29FB => Script::Common,\n        0x29FC => Script::Common,\n        0x29FD => Script::Common,\n        0x29FE..=0x2AFF => Script::Common,\n        0x2B00..=0x2B2F => Script::Common,\n        0x2B30..=0x2B44 => Script::Common,\n        0x2B45..=0x2B46 => Script::Common,\n        0x2B47..=0x2B4C => Script::Common,\n        0x2B4D..=0x2B73 => Script::Common,\n        0x2B76..=0x2B95 => Script::Common,\n        0x2B98..=0x2BB9 => Script::Common,\n        0x2BBD..=0x2BC8 => Script::Common,\n        0x2BCA..=0x2BD1 => Script::Common,\n        0x2BEC..=0x2BEF => Script::Common,\n        0x2E00..=0x2E01 => Script::Common,\n        0x2E02 => Script::Common,\n        0x2E03 => Script::Common,\n        0x2E04 => Script::Common,\n        0x2E05 => Script::Common,\n        0x2E06..=0x2E08 => Script::Common,\n        0x2E09 => Script::Common,\n        0x2E0A => Script::Common,\n        0x2E0B => Script::Common,\n        0x2E0C => Script::Common,\n        0x2E0D => Script::Common,\n        0x2E0E..=0x2E16 => Script::Common,\n        0x2E17 => Script::Common,\n        0x2E18..=0x2E19 => Script::Common,\n        0x2E1A => Script::Common,\n        0x2E1B => Script::Common,\n        0x2E1C => Script::Common,\n        0x2E1D => Script::Common,\n        0x2E1E..=0x2E1F => Script::Common,\n        0x2E20 => Script::Common,\n        0x2E21 => Script::Common,\n        0x2E22 => Script::Common,\n        0x2E23 => Script::Common,\n        0x2E24 => Script::Common,\n        0x2E25 => Script::Common,\n        0x2E26 => Script::Common,\n        0x2E27 => Script::Common,\n        0x2E28 => Script::Common,\n        0x2E29 => Script::Common,\n        0x2E2A..=0x2E2E => Script::Common,\n        0x2E2F => Script::Common,\n        0x2E30..=0x2E39 => Script::Common,\n        0x2E3A..=0x2E3B => Script::Common,\n        0x2E3C..=0x2E3F => Script::Common,\n        0x2E40 => Script::Common,\n        0x2E41 => Script::Common,\n        0x2E42 => Script::Common,\n        0x2E43..=0x2E44 => Script::Common,\n        0x2FF0..=0x2FFB => Script::Common,\n        0x3000 => Script::Common,\n        0x3001..=0x3003 => Script::Common,\n        0x3004 => Script::Common,\n        0x3006 => Script::Common,\n        0x3008 => Script::Common,\n        0x3009 => Script::Common,\n        0x300A => Script::Common,\n        0x300B => Script::Common,\n        0x300C => Script::Common,\n        0x300D => Script::Common,\n        0x300E => Script::Common,\n        0x300F => Script::Common,\n        0x3010 => Script::Common,\n        0x3011 => Script::Common,\n        0x3012..=0x3013 => Script::Common,\n        0x3014 => Script::Common,\n        0x3015 => Script::Common,\n        0x3016 => Script::Common,\n        0x3017 => Script::Common,\n        0x3018 => Script::Common,\n        0x3019 => Script::Common,\n        0x301A => Script::Common,\n        0x301B => Script::Common,\n        0x301C => Script::Common,\n        0x301D => Script::Common,\n        0x301E..=0x301F => Script::Common,\n        0x3020 => Script::Common,\n        0x3030 => Script::Common,\n        0x3031..=0x3035 => Script::Common,\n        0x3036..=0x3037 => Script::Common,\n        0x303C => Script::Common,\n        0x303D => Script::Common,\n        0x303E..=0x303F => Script::Common,\n        0x309B..=0x309C => Script::Common,\n        0x30A0 => Script::Common,\n        0x30FB => Script::Common,\n        0x30FC => Script::Common,\n        0x3190..=0x3191 => Script::Common,\n        0x3192..=0x3195 => Script::Common,\n        0x3196..=0x319F => Script::Common,\n        0x31C0..=0x31E3 => Script::Common,\n        0x3220..=0x3229 => Script::Common,\n        0x322A..=0x3247 => Script::Common,\n        0x3248..=0x324F => Script::Common,\n        0x3250 => Script::Common,\n        0x3251..=0x325F => Script::Common,\n        0x327F => Script::Common,\n        0x3280..=0x3289 => Script::Common,\n        0x328A..=0x32B0 => Script::Common,\n        0x32B1..=0x32BF => Script::Common,\n        0x32C0..=0x32CF => Script::Common,\n        0x3358..=0x33FF => Script::Common,\n        0x4DC0..=0x4DFF => Script::Common,\n        0xA700..=0xA716 => Script::Common,\n        0xA717..=0xA71F => Script::Common,\n        0xA720..=0xA721 => Script::Common,\n        0xA788 => Script::Common,\n        0xA789..=0xA78A => Script::Common,\n        0xA830..=0xA835 => Script::Common,\n        0xA836..=0xA837 => Script::Common,\n        0xA838 => Script::Common,\n        0xA839 => Script::Common,\n        0xA92E => Script::Common,\n        0xA9CF => Script::Common,\n        0xAB5B => Script::Common,\n        0xFD3E => Script::Common,\n        0xFD3F => Script::Common,\n        0xFE10..=0xFE16 => Script::Common,\n        0xFE17 => Script::Common,\n        0xFE18 => Script::Common,\n        0xFE19 => Script::Common,\n        0xFE30 => Script::Common,\n        0xFE31..=0xFE32 => Script::Common,\n        0xFE33..=0xFE34 => Script::Common,\n        0xFE35 => Script::Common,\n        0xFE36 => Script::Common,\n        0xFE37 => Script::Common,\n        0xFE38 => Script::Common,\n        0xFE39 => Script::Common,\n        0xFE3A => Script::Common,\n        0xFE3B => Script::Common,\n        0xFE3C => Script::Common,\n        0xFE3D => Script::Common,\n        0xFE3E => Script::Common,\n        0xFE3F => Script::Common,\n        0xFE40 => Script::Common,\n        0xFE41 => Script::Common,\n        0xFE42 => Script::Common,\n        0xFE43 => Script::Common,\n        0xFE44 => Script::Common,\n        0xFE45..=0xFE46 => Script::Common,\n        0xFE47 => Script::Common,\n        0xFE48 => Script::Common,\n        0xFE49..=0xFE4C => Script::Common,\n        0xFE4D..=0xFE4F => Script::Common,\n        0xFE50..=0xFE52 => Script::Common,\n        0xFE54..=0xFE57 => Script::Common,\n        0xFE58 => Script::Common,\n        0xFE59 => Script::Common,\n        0xFE5A => Script::Common,\n        0xFE5B => Script::Common,\n        0xFE5C => Script::Common,\n        0xFE5D => Script::Common,\n        0xFE5E => Script::Common,\n        0xFE5F..=0xFE61 => Script::Common,\n        0xFE62 => Script::Common,\n        0xFE63 => Script::Common,\n        0xFE64..=0xFE66 => Script::Common,\n        0xFE68 => Script::Common,\n        0xFE69 => Script::Common,\n        0xFE6A..=0xFE6B => Script::Common,\n        0xFEFF => Script::Common,\n        0xFF01..=0xFF03 => Script::Common,\n        0xFF04 => Script::Common,\n        0xFF05..=0xFF07 => Script::Common,\n        0xFF08 => Script::Common,\n        0xFF09 => Script::Common,\n        0xFF0A => Script::Common,\n        0xFF0B => Script::Common,\n        0xFF0C => Script::Common,\n        0xFF0D => Script::Common,\n        0xFF0E..=0xFF0F => Script::Common,\n        0xFF10..=0xFF19 => Script::Common,\n        0xFF1A..=0xFF1B => Script::Common,\n        0xFF1C..=0xFF1E => Script::Common,\n        0xFF1F..=0xFF20 => Script::Common,\n        0xFF3B => Script::Common,\n        0xFF3C => Script::Common,\n        0xFF3D => Script::Common,\n        0xFF3E => Script::Common,\n        0xFF3F => Script::Common,\n        0xFF40 => Script::Common,\n        0xFF5B => Script::Common,\n        0xFF5C => Script::Common,\n        0xFF5D => Script::Common,\n        0xFF5E => Script::Common,\n        0xFF5F => Script::Common,\n        0xFF60 => Script::Common,\n        0xFF61 => Script::Common,\n        0xFF62 => Script::Common,\n        0xFF63 => Script::Common,\n        0xFF64..=0xFF65 => Script::Common,\n        0xFF70 => Script::Common,\n        0xFF9E..=0xFF9F => Script::Common,\n        0xFFE0..=0xFFE1 => Script::Common,\n        0xFFE2 => Script::Common,\n        0xFFE3 => Script::Common,\n        0xFFE4 => Script::Common,\n        0xFFE5..=0xFFE6 => Script::Common,\n        0xFFE8 => Script::Common,\n        0xFFE9..=0xFFEC => Script::Common,\n        0xFFED..=0xFFEE => Script::Common,\n        0xFFF9..=0xFFFB => Script::Common,\n        0xFFFC..=0xFFFD => Script::Common,\n        0x10100..=0x10102 => Script::Common,\n        0x10107..=0x10133 => Script::Common,\n        0x10137..=0x1013F => Script::Common,\n        0x10190..=0x1019B => Script::Common,\n        0x101D0..=0x101FC => Script::Common,\n        0x102E1..=0x102FB => Script::Common,\n        0x1BCA0..=0x1BCA3 => Script::Common,\n        0x1D000..=0x1D0F5 => Script::Common,\n        0x1D100..=0x1D126 => Script::Common,\n        0x1D129..=0x1D164 => Script::Common,\n        0x1D165..=0x1D166 => Script::Common,\n        0x1D16A..=0x1D16C => Script::Common,\n        0x1D16D..=0x1D172 => Script::Common,\n        0x1D173..=0x1D17A => Script::Common,\n        0x1D183..=0x1D184 => Script::Common,\n        0x1D18C..=0x1D1A9 => Script::Common,\n        0x1D1AE..=0x1D1E8 => Script::Common,\n        0x1D300..=0x1D356 => Script::Common,\n        0x1D360..=0x1D371 => Script::Common,\n        0x1D400..=0x1D454 => Script::Common,\n        0x1D456..=0x1D49C => Script::Common,\n        0x1D49E..=0x1D49F => Script::Common,\n        0x1D4A2 => Script::Common,\n        0x1D4A5..=0x1D4A6 => Script::Common,\n        0x1D4A9..=0x1D4AC => Script::Common,\n        0x1D4AE..=0x1D4B9 => Script::Common,\n        0x1D4BB => Script::Common,\n        0x1D4BD..=0x1D4C3 => Script::Common,\n        0x1D4C5..=0x1D505 => Script::Common,\n        0x1D507..=0x1D50A => Script::Common,\n        0x1D50D..=0x1D514 => Script::Common,\n        0x1D516..=0x1D51C => Script::Common,\n        0x1D51E..=0x1D539 => Script::Common,\n        0x1D53B..=0x1D53E => Script::Common,\n        0x1D540..=0x1D544 => Script::Common,\n        0x1D546 => Script::Common,\n        0x1D54A..=0x1D550 => Script::Common,\n        0x1D552..=0x1D6A5 => Script::Common,\n        0x1D6A8..=0x1D6C0 => Script::Common,\n        0x1D6C1 => Script::Common,\n        0x1D6C2..=0x1D6DA => Script::Common,\n        0x1D6DB => Script::Common,\n        0x1D6DC..=0x1D6FA => Script::Common,\n        0x1D6FB => Script::Common,\n        0x1D6FC..=0x1D714 => Script::Common,\n        0x1D715 => Script::Common,\n        0x1D716..=0x1D734 => Script::Common,\n        0x1D735 => Script::Common,\n        0x1D736..=0x1D74E => Script::Common,\n        0x1D74F => Script::Common,\n        0x1D750..=0x1D76E => Script::Common,\n        0x1D76F => Script::Common,\n        0x1D770..=0x1D788 => Script::Common,\n        0x1D789 => Script::Common,\n        0x1D78A..=0x1D7A8 => Script::Common,\n        0x1D7A9 => Script::Common,\n        0x1D7AA..=0x1D7C2 => Script::Common,\n        0x1D7C3 => Script::Common,\n        0x1D7C4..=0x1D7CB => Script::Common,\n        0x1D7CE..=0x1D7FF => Script::Common,\n        0x1F000..=0x1F02B => Script::Common,\n        0x1F030..=0x1F093 => Script::Common,\n        0x1F0A0..=0x1F0AE => Script::Common,\n        0x1F0B1..=0x1F0BF => Script::Common,\n        0x1F0C1..=0x1F0CF => Script::Common,\n        0x1F0D1..=0x1F0F5 => Script::Common,\n        0x1F100..=0x1F10C => Script::Common,\n        0x1F110..=0x1F12E => Script::Common,\n        0x1F130..=0x1F16B => Script::Common,\n        0x1F170..=0x1F1AC => Script::Common,\n        0x1F1E6..=0x1F1FF => Script::Common,\n        0x1F201..=0x1F202 => Script::Common,\n        0x1F210..=0x1F23B => Script::Common,\n        0x1F240..=0x1F248 => Script::Common,\n        0x1F250..=0x1F251 => Script::Common,\n        0x1F300..=0x1F3FA => Script::Common,\n        0x1F3FB..=0x1F3FF => Script::Common,\n        0x1F400..=0x1F6D2 => Script::Common,\n        0x1F6E0..=0x1F6EC => Script::Common,\n        0x1F6F0..=0x1F6F6 => Script::Common,\n        0x1F700..=0x1F773 => Script::Common,\n        0x1F780..=0x1F7D4 => Script::Common,\n        0x1F800..=0x1F80B => Script::Common,\n        0x1F810..=0x1F847 => Script::Common,\n        0x1F850..=0x1F859 => Script::Common,\n        0x1F860..=0x1F887 => Script::Common,\n        0x1F890..=0x1F8AD => Script::Common,\n        0x1F910..=0x1F91E => Script::Common,\n        0x1F920..=0x1F927 => Script::Common,\n        0x1F930 => Script::Common,\n        0x1F933..=0x1F93E => Script::Common,\n        0x1F940..=0x1F94B => Script::Common,\n        0x1F950..=0x1F95E => Script::Common,\n        0x1F980..=0x1F991 => Script::Common,\n        0x1F9C0 => Script::Common,\n        0xE0001 => Script::Common,\n        0xE0020..=0xE007F => Script::Common,\n        0x0041..=0x005A => Script::Latin,\n        0x0061..=0x007A => Script::Latin,\n        0x00AA => Script::Latin,\n        0x00BA => Script::Latin,\n        0x00C0..=0x00D6 => Script::Latin,\n        0x00D8..=0x00F6 => Script::Latin,\n        0x00F8..=0x01BA => Script::Latin,\n        0x01BB => Script::Latin,\n        0x01BC..=0x01BF => Script::Latin,\n        0x01C0..=0x01C3 => Script::Latin,\n        0x01C4..=0x0293 => Script::Latin,\n        0x0294 => Script::Latin,\n        0x0295..=0x02AF => Script::Latin,\n        0x02B0..=0x02B8 => Script::Latin,\n        0x02E0..=0x02E4 => Script::Latin,\n        0x1D00..=0x1D25 => Script::Latin,\n        0x1D2C..=0x1D5C => Script::Latin,\n        0x1D62..=0x1D65 => Script::Latin,\n        0x1D6B..=0x1D77 => Script::Latin,\n        0x1D79..=0x1D9A => Script::Latin,\n        0x1D9B..=0x1DBE => Script::Latin,\n        0x1E00..=0x1EFF => Script::Latin,\n        0x2071 => Script::Latin,\n        0x207F => Script::Latin,\n        0x2090..=0x209C => Script::Latin,\n        0x212A..=0x212B => Script::Latin,\n        0x2132 => Script::Latin,\n        0x214E => Script::Latin,\n        0x2160..=0x2182 => Script::Latin,\n        0x2183..=0x2184 => Script::Latin,\n        0x2185..=0x2188 => Script::Latin,\n        0x2C60..=0x2C7B => Script::Latin,\n        0x2C7C..=0x2C7D => Script::Latin,\n        0x2C7E..=0x2C7F => Script::Latin,\n        0xA722..=0xA76F => Script::Latin,\n        0xA770 => Script::Latin,\n        0xA771..=0xA787 => Script::Latin,\n        0xA78B..=0xA78E => Script::Latin,\n        0xA78F => Script::Latin,\n        0xA790..=0xA7AE => Script::Latin,\n        0xA7B0..=0xA7B7 => Script::Latin,\n        0xA7F7 => Script::Latin,\n        0xA7F8..=0xA7F9 => Script::Latin,\n        0xA7FA => Script::Latin,\n        0xA7FB..=0xA7FF => Script::Latin,\n        0xAB30..=0xAB5A => Script::Latin,\n        0xAB5C..=0xAB5F => Script::Latin,\n        0xAB60..=0xAB64 => Script::Latin,\n        0xFB00..=0xFB06 => Script::Latin,\n        0xFF21..=0xFF3A => Script::Latin,\n        0xFF41..=0xFF5A => Script::Latin,\n        0x0370..=0x0373 => Script::Greek,\n        0x0375 => Script::Greek,\n        0x0376..=0x0377 => Script::Greek,\n        0x037A => Script::Greek,\n        0x037B..=0x037D => Script::Greek,\n        0x037F => Script::Greek,\n        0x0384 => Script::Greek,\n        0x0386 => Script::Greek,\n        0x0388..=0x038A => Script::Greek,\n        0x038C => Script::Greek,\n        0x038E..=0x03A1 => Script::Greek,\n        0x03A3..=0x03E1 => Script::Greek,\n        0x03F0..=0x03F5 => Script::Greek,\n        0x03F6 => Script::Greek,\n        0x03F7..=0x03FF => Script::Greek,\n        0x1D26..=0x1D2A => Script::Greek,\n        0x1D5D..=0x1D61 => Script::Greek,\n        0x1D66..=0x1D6A => Script::Greek,\n        0x1DBF => Script::Greek,\n        0x1F00..=0x1F15 => Script::Greek,\n        0x1F18..=0x1F1D => Script::Greek,\n        0x1F20..=0x1F45 => Script::Greek,\n        0x1F48..=0x1F4D => Script::Greek,\n        0x1F50..=0x1F57 => Script::Greek,\n        0x1F59 => Script::Greek,\n        0x1F5B => Script::Greek,\n        0x1F5D => Script::Greek,\n        0x1F5F..=0x1F7D => Script::Greek,\n        0x1F80..=0x1FB4 => Script::Greek,\n        0x1FB6..=0x1FBC => Script::Greek,\n        0x1FBD => Script::Greek,\n        0x1FBE => Script::Greek,\n        0x1FBF..=0x1FC1 => Script::Greek,\n        0x1FC2..=0x1FC4 => Script::Greek,\n        0x1FC6..=0x1FCC => Script::Greek,\n        0x1FCD..=0x1FCF => Script::Greek,\n        0x1FD0..=0x1FD3 => Script::Greek,\n        0x1FD6..=0x1FDB => Script::Greek,\n        0x1FDD..=0x1FDF => Script::Greek,\n        0x1FE0..=0x1FEC => Script::Greek,\n        0x1FED..=0x1FEF => Script::Greek,\n        0x1FF2..=0x1FF4 => Script::Greek,\n        0x1FF6..=0x1FFC => Script::Greek,\n        0x1FFD..=0x1FFE => Script::Greek,\n        0x2126 => Script::Greek,\n        0xAB65 => Script::Greek,\n        0x10140..=0x10174 => Script::Greek,\n        0x10175..=0x10178 => Script::Greek,\n        0x10179..=0x10189 => Script::Greek,\n        0x1018A..=0x1018B => Script::Greek,\n        0x1018C..=0x1018E => Script::Greek,\n        0x101A0 => Script::Greek,\n        0x1D200..=0x1D241 => Script::Greek,\n        0x1D242..=0x1D244 => Script::Greek,\n        0x1D245 => Script::Greek,\n        0x0400..=0x0481 => Script::Cyrillic,\n        0x0482 => Script::Cyrillic,\n        0x0483..=0x0484 => Script::Cyrillic,\n        0x0487 => Script::Cyrillic,\n        0x0488..=0x0489 => Script::Cyrillic,\n        0x048A..=0x052F => Script::Cyrillic,\n        0x1C80..=0x1C88 => Script::Cyrillic,\n        0x1D2B => Script::Cyrillic,\n        0x1D78 => Script::Cyrillic,\n        0x2DE0..=0x2DFF => Script::Cyrillic,\n        0xA640..=0xA66D => Script::Cyrillic,\n        0xA66E => Script::Cyrillic,\n        0xA66F => Script::Cyrillic,\n        0xA670..=0xA672 => Script::Cyrillic,\n        0xA673 => Script::Cyrillic,\n        0xA674..=0xA67D => Script::Cyrillic,\n        0xA67E => Script::Cyrillic,\n        0xA67F => Script::Cyrillic,\n        0xA680..=0xA69B => Script::Cyrillic,\n        0xA69C..=0xA69D => Script::Cyrillic,\n        0xA69E..=0xA69F => Script::Cyrillic,\n        0xFE2E..=0xFE2F => Script::Cyrillic,\n        0x0531..=0x0556 => Script::Armenian,\n        0x0559 => Script::Armenian,\n        0x055A..=0x055F => Script::Armenian,\n        0x0561..=0x0587 => Script::Armenian,\n        0x058A => Script::Armenian,\n        0x058D..=0x058E => Script::Armenian,\n        0x058F => Script::Armenian,\n        0xFB13..=0xFB17 => Script::Armenian,\n        0x0591..=0x05BD => Script::Hebrew,\n        0x05BE => Script::Hebrew,\n        0x05BF => Script::Hebrew,\n        0x05C0 => Script::Hebrew,\n        0x05C1..=0x05C2 => Script::Hebrew,\n        0x05C3 => Script::Hebrew,\n        0x05C4..=0x05C5 => Script::Hebrew,\n        0x05C6 => Script::Hebrew,\n        0x05C7 => Script::Hebrew,\n        0x05D0..=0x05EA => Script::Hebrew,\n        0x05F0..=0x05F2 => Script::Hebrew,\n        0x05F3..=0x05F4 => Script::Hebrew,\n        0xFB1D => Script::Hebrew,\n        0xFB1E => Script::Hebrew,\n        0xFB1F..=0xFB28 => Script::Hebrew,\n        0xFB29 => Script::Hebrew,\n        0xFB2A..=0xFB36 => Script::Hebrew,\n        0xFB38..=0xFB3C => Script::Hebrew,\n        0xFB3E => Script::Hebrew,\n        0xFB40..=0xFB41 => Script::Hebrew,\n        0xFB43..=0xFB44 => Script::Hebrew,\n        0xFB46..=0xFB4F => Script::Hebrew,\n        0x0600..=0x0604 => Script::Arabic,\n        0x0606..=0x0608 => Script::Arabic,\n        0x0609..=0x060A => Script::Arabic,\n        0x060B => Script::Arabic,\n        0x060D => Script::Arabic,\n        0x060E..=0x060F => Script::Arabic,\n        0x0610..=0x061A => Script::Arabic,\n        0x061E => Script::Arabic,\n        0x0620..=0x063F => Script::Arabic,\n        0x0641..=0x064A => Script::Arabic,\n        0x0656..=0x065F => Script::Arabic,\n        0x0660..=0x0669 => Script::Arabic,\n        0x066A..=0x066D => Script::Arabic,\n        0x066E..=0x066F => Script::Arabic,\n        0x0671..=0x06D3 => Script::Arabic,\n        0x06D4 => Script::Arabic,\n        0x06D5 => Script::Arabic,\n        0x06D6..=0x06DC => Script::Arabic,\n        0x06DE => Script::Arabic,\n        0x06DF..=0x06E4 => Script::Arabic,\n        0x06E5..=0x06E6 => Script::Arabic,\n        0x06E7..=0x06E8 => Script::Arabic,\n        0x06E9 => Script::Arabic,\n        0x06EA..=0x06ED => Script::Arabic,\n        0x06EE..=0x06EF => Script::Arabic,\n        0x06F0..=0x06F9 => Script::Arabic,\n        0x06FA..=0x06FC => Script::Arabic,\n        0x06FD..=0x06FE => Script::Arabic,\n        0x06FF => Script::Arabic,\n        0x0750..=0x077F => Script::Arabic,\n        0x08A0..=0x08B4 => Script::Arabic,\n        0x08B6..=0x08BD => Script::Arabic,\n        0x08D4..=0x08E1 => Script::Arabic,\n        0x08E3..=0x08FF => Script::Arabic,\n        0xFB50..=0xFBB1 => Script::Arabic,\n        0xFBB2..=0xFBC1 => Script::Arabic,\n        0xFBD3..=0xFD3D => Script::Arabic,\n        0xFD50..=0xFD8F => Script::Arabic,\n        0xFD92..=0xFDC7 => Script::Arabic,\n        0xFDF0..=0xFDFB => Script::Arabic,\n        0xFDFC => Script::Arabic,\n        0xFDFD => Script::Arabic,\n        0xFE70..=0xFE74 => Script::Arabic,\n        0xFE76..=0xFEFC => Script::Arabic,\n        0x10E60..=0x10E7E => Script::Arabic,\n        0x1EE00..=0x1EE03 => Script::Arabic,\n        0x1EE05..=0x1EE1F => Script::Arabic,\n        0x1EE21..=0x1EE22 => Script::Arabic,\n        0x1EE24 => Script::Arabic,\n        0x1EE27 => Script::Arabic,\n        0x1EE29..=0x1EE32 => Script::Arabic,\n        0x1EE34..=0x1EE37 => Script::Arabic,\n        0x1EE39 => Script::Arabic,\n        0x1EE3B => Script::Arabic,\n        0x1EE42 => Script::Arabic,\n        0x1EE47 => Script::Arabic,\n        0x1EE49 => Script::Arabic,\n        0x1EE4B => Script::Arabic,\n        0x1EE4D..=0x1EE4F => Script::Arabic,\n        0x1EE51..=0x1EE52 => Script::Arabic,\n        0x1EE54 => Script::Arabic,\n        0x1EE57 => Script::Arabic,\n        0x1EE59 => Script::Arabic,\n        0x1EE5B => Script::Arabic,\n        0x1EE5D => Script::Arabic,\n        0x1EE5F => Script::Arabic,\n        0x1EE61..=0x1EE62 => Script::Arabic,\n        0x1EE64 => Script::Arabic,\n        0x1EE67..=0x1EE6A => Script::Arabic,\n        0x1EE6C..=0x1EE72 => Script::Arabic,\n        0x1EE74..=0x1EE77 => Script::Arabic,\n        0x1EE79..=0x1EE7C => Script::Arabic,\n        0x1EE7E => Script::Arabic,\n        0x1EE80..=0x1EE89 => Script::Arabic,\n        0x1EE8B..=0x1EE9B => Script::Arabic,\n        0x1EEA1..=0x1EEA3 => Script::Arabic,\n        0x1EEA5..=0x1EEA9 => Script::Arabic,\n        0x1EEAB..=0x1EEBB => Script::Arabic,\n        0x1EEF0..=0x1EEF1 => Script::Arabic,\n        0x0700..=0x070D => Script::Syriac,\n        0x070F => Script::Syriac,\n        0x0710 => Script::Syriac,\n        0x0711 => Script::Syriac,\n        0x0712..=0x072F => Script::Syriac,\n        0x0730..=0x074A => Script::Syriac,\n        0x074D..=0x074F => Script::Syriac,\n        0x0780..=0x07A5 => Script::Thaana,\n        0x07A6..=0x07B0 => Script::Thaana,\n        0x07B1 => Script::Thaana,\n        0x0900..=0x0902 => Script::Devanagari,\n        0x0903 => Script::Devanagari,\n        0x0904..=0x0939 => Script::Devanagari,\n        0x093A => Script::Devanagari,\n        0x093B => Script::Devanagari,\n        0x093C => Script::Devanagari,\n        0x093D => Script::Devanagari,\n        0x093E..=0x0940 => Script::Devanagari,\n        0x0941..=0x0948 => Script::Devanagari,\n        0x0949..=0x094C => Script::Devanagari,\n        0x094D => Script::Devanagari,\n        0x094E..=0x094F => Script::Devanagari,\n        0x0950 => Script::Devanagari,\n        0x0953..=0x0957 => Script::Devanagari,\n        0x0958..=0x0961 => Script::Devanagari,\n        0x0962..=0x0963 => Script::Devanagari,\n        0x0966..=0x096F => Script::Devanagari,\n        0x0970 => Script::Devanagari,\n        0x0971 => Script::Devanagari,\n        0x0972..=0x097F => Script::Devanagari,\n        0xA8E0..=0xA8F1 => Script::Devanagari,\n        0xA8F2..=0xA8F7 => Script::Devanagari,\n        0xA8F8..=0xA8FA => Script::Devanagari,\n        0xA8FB => Script::Devanagari,\n        0xA8FC => Script::Devanagari,\n        0xA8FD => Script::Devanagari,\n        0x0980 => Script::Bengali,\n        0x0981 => Script::Bengali,\n        0x0982..=0x0983 => Script::Bengali,\n        0x0985..=0x098C => Script::Bengali,\n        0x098F..=0x0990 => Script::Bengali,\n        0x0993..=0x09A8 => Script::Bengali,\n        0x09AA..=0x09B0 => Script::Bengali,\n        0x09B2 => Script::Bengali,\n        0x09B6..=0x09B9 => Script::Bengali,\n        0x09BC => Script::Bengali,\n        0x09BD => Script::Bengali,\n        0x09BE..=0x09C0 => Script::Bengali,\n        0x09C1..=0x09C4 => Script::Bengali,\n        0x09C7..=0x09C8 => Script::Bengali,\n        0x09CB..=0x09CC => Script::Bengali,\n        0x09CD => Script::Bengali,\n        0x09CE => Script::Bengali,\n        0x09D7 => Script::Bengali,\n        0x09DC..=0x09DD => Script::Bengali,\n        0x09DF..=0x09E1 => Script::Bengali,\n        0x09E2..=0x09E3 => Script::Bengali,\n        0x09E6..=0x09EF => Script::Bengali,\n        0x09F0..=0x09F1 => Script::Bengali,\n        0x09F2..=0x09F3 => Script::Bengali,\n        0x09F4..=0x09F9 => Script::Bengali,\n        0x09FA => Script::Bengali,\n        0x09FB => Script::Bengali,\n        0x0A01..=0x0A02 => Script::Gurmukhi,\n        0x0A03 => Script::Gurmukhi,\n        0x0A05..=0x0A0A => Script::Gurmukhi,\n        0x0A0F..=0x0A10 => Script::Gurmukhi,\n        0x0A13..=0x0A28 => Script::Gurmukhi,\n        0x0A2A..=0x0A30 => Script::Gurmukhi,\n        0x0A32..=0x0A33 => Script::Gurmukhi,\n        0x0A35..=0x0A36 => Script::Gurmukhi,\n        0x0A38..=0x0A39 => Script::Gurmukhi,\n        0x0A3C => Script::Gurmukhi,\n        0x0A3E..=0x0A40 => Script::Gurmukhi,\n        0x0A41..=0x0A42 => Script::Gurmukhi,\n        0x0A47..=0x0A48 => Script::Gurmukhi,\n        0x0A4B..=0x0A4D => Script::Gurmukhi,\n        0x0A51 => Script::Gurmukhi,\n        0x0A59..=0x0A5C => Script::Gurmukhi,\n        0x0A5E => Script::Gurmukhi,\n        0x0A66..=0x0A6F => Script::Gurmukhi,\n        0x0A70..=0x0A71 => Script::Gurmukhi,\n        0x0A72..=0x0A74 => Script::Gurmukhi,\n        0x0A75 => Script::Gurmukhi,\n        0x0A81..=0x0A82 => Script::Gujarati,\n        0x0A83 => Script::Gujarati,\n        0x0A85..=0x0A8D => Script::Gujarati,\n        0x0A8F..=0x0A91 => Script::Gujarati,\n        0x0A93..=0x0AA8 => Script::Gujarati,\n        0x0AAA..=0x0AB0 => Script::Gujarati,\n        0x0AB2..=0x0AB3 => Script::Gujarati,\n        0x0AB5..=0x0AB9 => Script::Gujarati,\n        0x0ABC => Script::Gujarati,\n        0x0ABD => Script::Gujarati,\n        0x0ABE..=0x0AC0 => Script::Gujarati,\n        0x0AC1..=0x0AC5 => Script::Gujarati,\n        0x0AC7..=0x0AC8 => Script::Gujarati,\n        0x0AC9 => Script::Gujarati,\n        0x0ACB..=0x0ACC => Script::Gujarati,\n        0x0ACD => Script::Gujarati,\n        0x0AD0 => Script::Gujarati,\n        0x0AE0..=0x0AE1 => Script::Gujarati,\n        0x0AE2..=0x0AE3 => Script::Gujarati,\n        0x0AE6..=0x0AEF => Script::Gujarati,\n        0x0AF0 => Script::Gujarati,\n        0x0AF1 => Script::Gujarati,\n        0x0AF9 => Script::Gujarati,\n        0x0B01 => Script::Oriya,\n        0x0B02..=0x0B03 => Script::Oriya,\n        0x0B05..=0x0B0C => Script::Oriya,\n        0x0B0F..=0x0B10 => Script::Oriya,\n        0x0B13..=0x0B28 => Script::Oriya,\n        0x0B2A..=0x0B30 => Script::Oriya,\n        0x0B32..=0x0B33 => Script::Oriya,\n        0x0B35..=0x0B39 => Script::Oriya,\n        0x0B3C => Script::Oriya,\n        0x0B3D => Script::Oriya,\n        0x0B3E => Script::Oriya,\n        0x0B3F => Script::Oriya,\n        0x0B40 => Script::Oriya,\n        0x0B41..=0x0B44 => Script::Oriya,\n        0x0B47..=0x0B48 => Script::Oriya,\n        0x0B4B..=0x0B4C => Script::Oriya,\n        0x0B4D => Script::Oriya,\n        0x0B56 => Script::Oriya,\n        0x0B57 => Script::Oriya,\n        0x0B5C..=0x0B5D => Script::Oriya,\n        0x0B5F..=0x0B61 => Script::Oriya,\n        0x0B62..=0x0B63 => Script::Oriya,\n        0x0B66..=0x0B6F => Script::Oriya,\n        0x0B70 => Script::Oriya,\n        0x0B71 => Script::Oriya,\n        0x0B72..=0x0B77 => Script::Oriya,\n        0x0B82 => Script::Tamil,\n        0x0B83 => Script::Tamil,\n        0x0B85..=0x0B8A => Script::Tamil,\n        0x0B8E..=0x0B90 => Script::Tamil,\n        0x0B92..=0x0B95 => Script::Tamil,\n        0x0B99..=0x0B9A => Script::Tamil,\n        0x0B9C => Script::Tamil,\n        0x0B9E..=0x0B9F => Script::Tamil,\n        0x0BA3..=0x0BA4 => Script::Tamil,\n        0x0BA8..=0x0BAA => Script::Tamil,\n        0x0BAE..=0x0BB9 => Script::Tamil,\n        0x0BBE..=0x0BBF => Script::Tamil,\n        0x0BC0 => Script::Tamil,\n        0x0BC1..=0x0BC2 => Script::Tamil,\n        0x0BC6..=0x0BC8 => Script::Tamil,\n        0x0BCA..=0x0BCC => Script::Tamil,\n        0x0BCD => Script::Tamil,\n        0x0BD0 => Script::Tamil,\n        0x0BD7 => Script::Tamil,\n        0x0BE6..=0x0BEF => Script::Tamil,\n        0x0BF0..=0x0BF2 => Script::Tamil,\n        0x0BF3..=0x0BF8 => Script::Tamil,\n        0x0BF9 => Script::Tamil,\n        0x0BFA => Script::Tamil,\n        0x0C00 => Script::Telugu,\n        0x0C01..=0x0C03 => Script::Telugu,\n        0x0C05..=0x0C0C => Script::Telugu,\n        0x0C0E..=0x0C10 => Script::Telugu,\n        0x0C12..=0x0C28 => Script::Telugu,\n        0x0C2A..=0x0C39 => Script::Telugu,\n        0x0C3D => Script::Telugu,\n        0x0C3E..=0x0C40 => Script::Telugu,\n        0x0C41..=0x0C44 => Script::Telugu,\n        0x0C46..=0x0C48 => Script::Telugu,\n        0x0C4A..=0x0C4D => Script::Telugu,\n        0x0C55..=0x0C56 => Script::Telugu,\n        0x0C58..=0x0C5A => Script::Telugu,\n        0x0C60..=0x0C61 => Script::Telugu,\n        0x0C62..=0x0C63 => Script::Telugu,\n        0x0C66..=0x0C6F => Script::Telugu,\n        0x0C78..=0x0C7E => Script::Telugu,\n        0x0C7F => Script::Telugu,\n        0x0C80 => Script::Kannada,\n        0x0C81 => Script::Kannada,\n        0x0C82..=0x0C83 => Script::Kannada,\n        0x0C85..=0x0C8C => Script::Kannada,\n        0x0C8E..=0x0C90 => Script::Kannada,\n        0x0C92..=0x0CA8 => Script::Kannada,\n        0x0CAA..=0x0CB3 => Script::Kannada,\n        0x0CB5..=0x0CB9 => Script::Kannada,\n        0x0CBC => Script::Kannada,\n        0x0CBD => Script::Kannada,\n        0x0CBE => Script::Kannada,\n        0x0CBF => Script::Kannada,\n        0x0CC0..=0x0CC4 => Script::Kannada,\n        0x0CC6 => Script::Kannada,\n        0x0CC7..=0x0CC8 => Script::Kannada,\n        0x0CCA..=0x0CCB => Script::Kannada,\n        0x0CCC..=0x0CCD => Script::Kannada,\n        0x0CD5..=0x0CD6 => Script::Kannada,\n        0x0CDE => Script::Kannada,\n        0x0CE0..=0x0CE1 => Script::Kannada,\n        0x0CE2..=0x0CE3 => Script::Kannada,\n        0x0CE6..=0x0CEF => Script::Kannada,\n        0x0CF1..=0x0CF2 => Script::Kannada,\n        0x0D01 => Script::Malayalam,\n        0x0D02..=0x0D03 => Script::Malayalam,\n        0x0D05..=0x0D0C => Script::Malayalam,\n        0x0D0E..=0x0D10 => Script::Malayalam,\n        0x0D12..=0x0D3A => Script::Malayalam,\n        0x0D3D => Script::Malayalam,\n        0x0D3E..=0x0D40 => Script::Malayalam,\n        0x0D41..=0x0D44 => Script::Malayalam,\n        0x0D46..=0x0D48 => Script::Malayalam,\n        0x0D4A..=0x0D4C => Script::Malayalam,\n        0x0D4D => Script::Malayalam,\n        0x0D4E => Script::Malayalam,\n        0x0D4F => Script::Malayalam,\n        0x0D54..=0x0D56 => Script::Malayalam,\n        0x0D57 => Script::Malayalam,\n        0x0D58..=0x0D5E => Script::Malayalam,\n        0x0D5F..=0x0D61 => Script::Malayalam,\n        0x0D62..=0x0D63 => Script::Malayalam,\n        0x0D66..=0x0D6F => Script::Malayalam,\n        0x0D70..=0x0D78 => Script::Malayalam,\n        0x0D79 => Script::Malayalam,\n        0x0D7A..=0x0D7F => Script::Malayalam,\n        0x0D82..=0x0D83 => Script::Sinhala,\n        0x0D85..=0x0D96 => Script::Sinhala,\n        0x0D9A..=0x0DB1 => Script::Sinhala,\n        0x0DB3..=0x0DBB => Script::Sinhala,\n        0x0DBD => Script::Sinhala,\n        0x0DC0..=0x0DC6 => Script::Sinhala,\n        0x0DCA => Script::Sinhala,\n        0x0DCF..=0x0DD1 => Script::Sinhala,\n        0x0DD2..=0x0DD4 => Script::Sinhala,\n        0x0DD6 => Script::Sinhala,\n        0x0DD8..=0x0DDF => Script::Sinhala,\n        0x0DE6..=0x0DEF => Script::Sinhala,\n        0x0DF2..=0x0DF3 => Script::Sinhala,\n        0x0DF4 => Script::Sinhala,\n        0x111E1..=0x111F4 => Script::Sinhala,\n        0x0E01..=0x0E30 => Script::Thai,\n        0x0E31 => Script::Thai,\n        0x0E32..=0x0E33 => Script::Thai,\n        0x0E34..=0x0E3A => Script::Thai,\n        0x0E40..=0x0E45 => Script::Thai,\n        0x0E46 => Script::Thai,\n        0x0E47..=0x0E4E => Script::Thai,\n        0x0E4F => Script::Thai,\n        0x0E50..=0x0E59 => Script::Thai,\n        0x0E5A..=0x0E5B => Script::Thai,\n        0x0E81..=0x0E82 => Script::Lao,\n        0x0E84 => Script::Lao,\n        0x0E87..=0x0E88 => Script::Lao,\n        0x0E8A => Script::Lao,\n        0x0E8D => Script::Lao,\n        0x0E94..=0x0E97 => Script::Lao,\n        0x0E99..=0x0E9F => Script::Lao,\n        0x0EA1..=0x0EA3 => Script::Lao,\n        0x0EA5 => Script::Lao,\n        0x0EA7 => Script::Lao,\n        0x0EAA..=0x0EAB => Script::Lao,\n        0x0EAD..=0x0EB0 => Script::Lao,\n        0x0EB1 => Script::Lao,\n        0x0EB2..=0x0EB3 => Script::Lao,\n        0x0EB4..=0x0EB9 => Script::Lao,\n        0x0EBB..=0x0EBC => Script::Lao,\n        0x0EBD => Script::Lao,\n        0x0EC0..=0x0EC4 => Script::Lao,\n        0x0EC6 => Script::Lao,\n        0x0EC8..=0x0ECD => Script::Lao,\n        0x0ED0..=0x0ED9 => Script::Lao,\n        0x0EDC..=0x0EDF => Script::Lao,\n        0x0F00 => Script::Tibetan,\n        0x0F01..=0x0F03 => Script::Tibetan,\n        0x0F04..=0x0F12 => Script::Tibetan,\n        0x0F13 => Script::Tibetan,\n        0x0F14 => Script::Tibetan,\n        0x0F15..=0x0F17 => Script::Tibetan,\n        0x0F18..=0x0F19 => Script::Tibetan,\n        0x0F1A..=0x0F1F => Script::Tibetan,\n        0x0F20..=0x0F29 => Script::Tibetan,\n        0x0F2A..=0x0F33 => Script::Tibetan,\n        0x0F34 => Script::Tibetan,\n        0x0F35 => Script::Tibetan,\n        0x0F36 => Script::Tibetan,\n        0x0F37 => Script::Tibetan,\n        0x0F38 => Script::Tibetan,\n        0x0F39 => Script::Tibetan,\n        0x0F3A => Script::Tibetan,\n        0x0F3B => Script::Tibetan,\n        0x0F3C => Script::Tibetan,\n        0x0F3D => Script::Tibetan,\n        0x0F3E..=0x0F3F => Script::Tibetan,\n        0x0F40..=0x0F47 => Script::Tibetan,\n        0x0F49..=0x0F6C => Script::Tibetan,\n        0x0F71..=0x0F7E => Script::Tibetan,\n        0x0F7F => Script::Tibetan,\n        0x0F80..=0x0F84 => Script::Tibetan,\n        0x0F85 => Script::Tibetan,\n        0x0F86..=0x0F87 => Script::Tibetan,\n        0x0F88..=0x0F8C => Script::Tibetan,\n        0x0F8D..=0x0F97 => Script::Tibetan,\n        0x0F99..=0x0FBC => Script::Tibetan,\n        0x0FBE..=0x0FC5 => Script::Tibetan,\n        0x0FC6 => Script::Tibetan,\n        0x0FC7..=0x0FCC => Script::Tibetan,\n        0x0FCE..=0x0FCF => Script::Tibetan,\n        0x0FD0..=0x0FD4 => Script::Tibetan,\n        0x0FD9..=0x0FDA => Script::Tibetan,\n        0x1000..=0x102A => Script::Myanmar,\n        0x102B..=0x102C => Script::Myanmar,\n        0x102D..=0x1030 => Script::Myanmar,\n        0x1031 => Script::Myanmar,\n        0x1032..=0x1037 => Script::Myanmar,\n        0x1038 => Script::Myanmar,\n        0x1039..=0x103A => Script::Myanmar,\n        0x103B..=0x103C => Script::Myanmar,\n        0x103D..=0x103E => Script::Myanmar,\n        0x103F => Script::Myanmar,\n        0x1040..=0x1049 => Script::Myanmar,\n        0x104A..=0x104F => Script::Myanmar,\n        0x1050..=0x1055 => Script::Myanmar,\n        0x1056..=0x1057 => Script::Myanmar,\n        0x1058..=0x1059 => Script::Myanmar,\n        0x105A..=0x105D => Script::Myanmar,\n        0x105E..=0x1060 => Script::Myanmar,\n        0x1061 => Script::Myanmar,\n        0x1062..=0x1064 => Script::Myanmar,\n        0x1065..=0x1066 => Script::Myanmar,\n        0x1067..=0x106D => Script::Myanmar,\n        0x106E..=0x1070 => Script::Myanmar,\n        0x1071..=0x1074 => Script::Myanmar,\n        0x1075..=0x1081 => Script::Myanmar,\n        0x1082 => Script::Myanmar,\n        0x1083..=0x1084 => Script::Myanmar,\n        0x1085..=0x1086 => Script::Myanmar,\n        0x1087..=0x108C => Script::Myanmar,\n        0x108D => Script::Myanmar,\n        0x108E => Script::Myanmar,\n        0x108F => Script::Myanmar,\n        0x1090..=0x1099 => Script::Myanmar,\n        0x109A..=0x109C => Script::Myanmar,\n        0x109D => Script::Myanmar,\n        0x109E..=0x109F => Script::Myanmar,\n        0xA9E0..=0xA9E4 => Script::Myanmar,\n        0xA9E5 => Script::Myanmar,\n        0xA9E6 => Script::Myanmar,\n        0xA9E7..=0xA9EF => Script::Myanmar,\n        0xA9F0..=0xA9F9 => Script::Myanmar,\n        0xA9FA..=0xA9FE => Script::Myanmar,\n        0xAA60..=0xAA6F => Script::Myanmar,\n        0xAA70 => Script::Myanmar,\n        0xAA71..=0xAA76 => Script::Myanmar,\n        0xAA77..=0xAA79 => Script::Myanmar,\n        0xAA7A => Script::Myanmar,\n        0xAA7B => Script::Myanmar,\n        0xAA7C => Script::Myanmar,\n        0xAA7D => Script::Myanmar,\n        0xAA7E..=0xAA7F => Script::Myanmar,\n        0x10A0..=0x10C5 => Script::Georgian,\n        0x10C7 => Script::Georgian,\n        0x10CD => Script::Georgian,\n        0x10D0..=0x10FA => Script::Georgian,\n        0x10FC => Script::Georgian,\n        0x10FD..=0x10FF => Script::Georgian,\n        0x2D00..=0x2D25 => Script::Georgian,\n        0x2D27 => Script::Georgian,\n        0x2D2D => Script::Georgian,\n        0x1100..=0x11FF => Script::Hangul,\n        0x302E..=0x302F => Script::Hangul,\n        0x3131..=0x318E => Script::Hangul,\n        0x3200..=0x321E => Script::Hangul,\n        0x3260..=0x327E => Script::Hangul,\n        0xA960..=0xA97C => Script::Hangul,\n        0xAC00..=0xD7A3 => Script::Hangul,\n        0xD7B0..=0xD7C6 => Script::Hangul,\n        0xD7CB..=0xD7FB => Script::Hangul,\n        0xFFA0..=0xFFBE => Script::Hangul,\n        0xFFC2..=0xFFC7 => Script::Hangul,\n        0xFFCA..=0xFFCF => Script::Hangul,\n        0xFFD2..=0xFFD7 => Script::Hangul,\n        0xFFDA..=0xFFDC => Script::Hangul,\n        0x1200..=0x1248 => Script::Ethiopic,\n        0x124A..=0x124D => Script::Ethiopic,\n        0x1250..=0x1256 => Script::Ethiopic,\n        0x1258 => Script::Ethiopic,\n        0x125A..=0x125D => Script::Ethiopic,\n        0x1260..=0x1288 => Script::Ethiopic,\n        0x128A..=0x128D => Script::Ethiopic,\n        0x1290..=0x12B0 => Script::Ethiopic,\n        0x12B2..=0x12B5 => Script::Ethiopic,\n        0x12B8..=0x12BE => Script::Ethiopic,\n        0x12C0 => Script::Ethiopic,\n        0x12C2..=0x12C5 => Script::Ethiopic,\n        0x12C8..=0x12D6 => Script::Ethiopic,\n        0x12D8..=0x1310 => Script::Ethiopic,\n        0x1312..=0x1315 => Script::Ethiopic,\n        0x1318..=0x135A => Script::Ethiopic,\n        0x135D..=0x135F => Script::Ethiopic,\n        0x1360..=0x1368 => Script::Ethiopic,\n        0x1369..=0x137C => Script::Ethiopic,\n        0x1380..=0x138F => Script::Ethiopic,\n        0x1390..=0x1399 => Script::Ethiopic,\n        0x2D80..=0x2D96 => Script::Ethiopic,\n        0x2DA0..=0x2DA6 => Script::Ethiopic,\n        0x2DA8..=0x2DAE => Script::Ethiopic,\n        0x2DB0..=0x2DB6 => Script::Ethiopic,\n        0x2DB8..=0x2DBE => Script::Ethiopic,\n        0x2DC0..=0x2DC6 => Script::Ethiopic,\n        0x2DC8..=0x2DCE => Script::Ethiopic,\n        0x2DD0..=0x2DD6 => Script::Ethiopic,\n        0x2DD8..=0x2DDE => Script::Ethiopic,\n        0xAB01..=0xAB06 => Script::Ethiopic,\n        0xAB09..=0xAB0E => Script::Ethiopic,\n        0xAB11..=0xAB16 => Script::Ethiopic,\n        0xAB20..=0xAB26 => Script::Ethiopic,\n        0xAB28..=0xAB2E => Script::Ethiopic,\n        0x13A0..=0x13F5 => Script::Cherokee,\n        0x13F8..=0x13FD => Script::Cherokee,\n        0xAB70..=0xABBF => Script::Cherokee,\n        0x1400 => Script::CanadianAboriginal,\n        0x1401..=0x166C => Script::CanadianAboriginal,\n        0x166D..=0x166E => Script::CanadianAboriginal,\n        0x166F..=0x167F => Script::CanadianAboriginal,\n        0x18B0..=0x18F5 => Script::CanadianAboriginal,\n        0x1680 => Script::Ogham,\n        0x1681..=0x169A => Script::Ogham,\n        0x169B => Script::Ogham,\n        0x169C => Script::Ogham,\n        0x16A0..=0x16EA => Script::Runic,\n        0x16EE..=0x16F0 => Script::Runic,\n        0x16F1..=0x16F8 => Script::Runic,\n        0x1780..=0x17B3 => Script::Khmer,\n        0x17B4..=0x17B5 => Script::Khmer,\n        0x17B6 => Script::Khmer,\n        0x17B7..=0x17BD => Script::Khmer,\n        0x17BE..=0x17C5 => Script::Khmer,\n        0x17C6 => Script::Khmer,\n        0x17C7..=0x17C8 => Script::Khmer,\n        0x17C9..=0x17D3 => Script::Khmer,\n        0x17D4..=0x17D6 => Script::Khmer,\n        0x17D7 => Script::Khmer,\n        0x17D8..=0x17DA => Script::Khmer,\n        0x17DB => Script::Khmer,\n        0x17DC => Script::Khmer,\n        0x17DD => Script::Khmer,\n        0x17E0..=0x17E9 => Script::Khmer,\n        0x17F0..=0x17F9 => Script::Khmer,\n        0x19E0..=0x19FF => Script::Khmer,\n        0x1800..=0x1801 => Script::Mongolian,\n        0x1804 => Script::Mongolian,\n        0x1806 => Script::Mongolian,\n        0x1807..=0x180A => Script::Mongolian,\n        0x180B..=0x180D => Script::Mongolian,\n        0x180E => Script::Mongolian,\n        0x1810..=0x1819 => Script::Mongolian,\n        0x1820..=0x1842 => Script::Mongolian,\n        0x1843 => Script::Mongolian,\n        0x1844..=0x1877 => Script::Mongolian,\n        0x1880..=0x1884 => Script::Mongolian,\n        0x1885..=0x1886 => Script::Mongolian,\n        0x1887..=0x18A8 => Script::Mongolian,\n        0x18A9 => Script::Mongolian,\n        0x18AA => Script::Mongolian,\n        0x11660..=0x1166C => Script::Mongolian,\n        0x3041..=0x3096 => Script::Hiragana,\n        0x309D..=0x309E => Script::Hiragana,\n        0x309F => Script::Hiragana,\n        0x1B001 => Script::Hiragana,\n        0x1F200 => Script::Hiragana,\n        0x30A1..=0x30FA => Script::Katakana,\n        0x30FD..=0x30FE => Script::Katakana,\n        0x30FF => Script::Katakana,\n        0x31F0..=0x31FF => Script::Katakana,\n        0x32D0..=0x32FE => Script::Katakana,\n        0x3300..=0x3357 => Script::Katakana,\n        0xFF66..=0xFF6F => Script::Katakana,\n        0xFF71..=0xFF9D => Script::Katakana,\n        0x1B000 => Script::Katakana,\n        0x02EA..=0x02EB => Script::Bopomofo,\n        0x3105..=0x312D => Script::Bopomofo,\n        0x31A0..=0x31BA => Script::Bopomofo,\n        0x2E80..=0x2E99 => Script::Han,\n        0x2E9B..=0x2EF3 => Script::Han,\n        0x2F00..=0x2FD5 => Script::Han,\n        0x3005 => Script::Han,\n        0x3007 => Script::Han,\n        0x3021..=0x3029 => Script::Han,\n        0x3038..=0x303A => Script::Han,\n        0x303B => Script::Han,\n        0x3400..=0x4DB5 => Script::Han,\n        0x4E00..=0x9FD5 => Script::Han,\n        0xF900..=0xFA6D => Script::Han,\n        0xFA70..=0xFAD9 => Script::Han,\n        0x20000..=0x2A6D6 => Script::Han,\n        0x2A700..=0x2B734 => Script::Han,\n        0x2B740..=0x2B81D => Script::Han,\n        0x2B820..=0x2CEA1 => Script::Han,\n        0x2F800..=0x2FA1D => Script::Han,\n        0xA000..=0xA014 => Script::Yi,\n        0xA015 => Script::Yi,\n        0xA016..=0xA48C => Script::Yi,\n        0xA490..=0xA4C6 => Script::Yi,\n        0x10300..=0x1031F => Script::OldItalic,\n        0x10320..=0x10323 => Script::OldItalic,\n        0x10330..=0x10340 => Script::Gothic,\n        0x10341 => Script::Gothic,\n        0x10342..=0x10349 => Script::Gothic,\n        0x1034A => Script::Gothic,\n        0x10400..=0x1044F => Script::Deseret,\n        0x0300..=0x036F => Script::Inherited,\n        0x0485..=0x0486 => Script::Inherited,\n        0x064B..=0x0655 => Script::Inherited,\n        0x0670 => Script::Inherited,\n        0x0951..=0x0952 => Script::Inherited,\n        0x1AB0..=0x1ABD => Script::Inherited,\n        0x1ABE => Script::Inherited,\n        0x1CD0..=0x1CD2 => Script::Inherited,\n        0x1CD4..=0x1CE0 => Script::Inherited,\n        0x1CE2..=0x1CE8 => Script::Inherited,\n        0x1CED => Script::Inherited,\n        0x1CF4 => Script::Inherited,\n        0x1CF8..=0x1CF9 => Script::Inherited,\n        0x1DC0..=0x1DF5 => Script::Inherited,\n        0x1DFB..=0x1DFF => Script::Inherited,\n        0x200C..=0x200D => Script::Inherited,\n        0x20D0..=0x20DC => Script::Inherited,\n        0x20DD..=0x20E0 => Script::Inherited,\n        0x20E1 => Script::Inherited,\n        0x20E2..=0x20E4 => Script::Inherited,\n        0x20E5..=0x20F0 => Script::Inherited,\n        0x302A..=0x302D => Script::Inherited,\n        0x3099..=0x309A => Script::Inherited,\n        0xFE00..=0xFE0F => Script::Inherited,\n        0xFE20..=0xFE2D => Script::Inherited,\n        0x101FD => Script::Inherited,\n        0x102E0 => Script::Inherited,\n        0x1D167..=0x1D169 => Script::Inherited,\n        0x1D17B..=0x1D182 => Script::Inherited,\n        0x1D185..=0x1D18B => Script::Inherited,\n        0x1D1AA..=0x1D1AD => Script::Inherited,\n        0xE0100..=0xE01EF => Script::Inherited,\n        0x1700..=0x170C => Script::Tagalog,\n        0x170E..=0x1711 => Script::Tagalog,\n        0x1712..=0x1714 => Script::Tagalog,\n        0x1720..=0x1731 => Script::Hanunoo,\n        0x1732..=0x1734 => Script::Hanunoo,\n        0x1740..=0x1751 => Script::Buhid,\n        0x1752..=0x1753 => Script::Buhid,\n        0x1760..=0x176C => Script::Tagbanwa,\n        0x176E..=0x1770 => Script::Tagbanwa,\n        0x1772..=0x1773 => Script::Tagbanwa,\n        0x1900..=0x191E => Script::Limbu,\n        0x1920..=0x1922 => Script::Limbu,\n        0x1923..=0x1926 => Script::Limbu,\n        0x1927..=0x1928 => Script::Limbu,\n        0x1929..=0x192B => Script::Limbu,\n        0x1930..=0x1931 => Script::Limbu,\n        0x1932 => Script::Limbu,\n        0x1933..=0x1938 => Script::Limbu,\n        0x1939..=0x193B => Script::Limbu,\n        0x1940 => Script::Limbu,\n        0x1944..=0x1945 => Script::Limbu,\n        0x1946..=0x194F => Script::Limbu,\n        0x1950..=0x196D => Script::TaiLe,\n        0x1970..=0x1974 => Script::TaiLe,\n        0x10000..=0x1000B => Script::LinearB,\n        0x1000D..=0x10026 => Script::LinearB,\n        0x10028..=0x1003A => Script::LinearB,\n        0x1003C..=0x1003D => Script::LinearB,\n        0x1003F..=0x1004D => Script::LinearB,\n        0x10050..=0x1005D => Script::LinearB,\n        0x10080..=0x100FA => Script::LinearB,\n        0x10380..=0x1039D => Script::Ugaritic,\n        0x1039F => Script::Ugaritic,\n        0x10450..=0x1047F => Script::Shavian,\n        0x10480..=0x1049D => Script::Osmanya,\n        0x104A0..=0x104A9 => Script::Osmanya,\n        0x10800..=0x10805 => Script::Cypriot,\n        0x10808 => Script::Cypriot,\n        0x1080A..=0x10835 => Script::Cypriot,\n        0x10837..=0x10838 => Script::Cypriot,\n        0x1083C => Script::Cypriot,\n        0x1083F => Script::Cypriot,\n        0x2800..=0x28FF => Script::Braille,\n        0x1A00..=0x1A16 => Script::Buginese,\n        0x1A17..=0x1A18 => Script::Buginese,\n        0x1A19..=0x1A1A => Script::Buginese,\n        0x1A1B => Script::Buginese,\n        0x1A1E..=0x1A1F => Script::Buginese,\n        0x03E2..=0x03EF => Script::Coptic,\n        0x2C80..=0x2CE4 => Script::Coptic,\n        0x2CE5..=0x2CEA => Script::Coptic,\n        0x2CEB..=0x2CEE => Script::Coptic,\n        0x2CEF..=0x2CF1 => Script::Coptic,\n        0x2CF2..=0x2CF3 => Script::Coptic,\n        0x2CF9..=0x2CFC => Script::Coptic,\n        0x2CFD => Script::Coptic,\n        0x2CFE..=0x2CFF => Script::Coptic,\n        0x1980..=0x19AB => Script::NewTaiLue,\n        0x19B0..=0x19C9 => Script::NewTaiLue,\n        0x19D0..=0x19D9 => Script::NewTaiLue,\n        0x19DA => Script::NewTaiLue,\n        0x19DE..=0x19DF => Script::NewTaiLue,\n        0x2C00..=0x2C2E => Script::Glagolitic,\n        0x2C30..=0x2C5E => Script::Glagolitic,\n        0x1E000..=0x1E006 => Script::Glagolitic,\n        0x1E008..=0x1E018 => Script::Glagolitic,\n        0x1E01B..=0x1E021 => Script::Glagolitic,\n        0x1E023..=0x1E024 => Script::Glagolitic,\n        0x1E026..=0x1E02A => Script::Glagolitic,\n        0x2D30..=0x2D67 => Script::Tifinagh,\n        0x2D6F => Script::Tifinagh,\n        0x2D70 => Script::Tifinagh,\n        0x2D7F => Script::Tifinagh,\n        0xA800..=0xA801 => Script::SylotiNagri,\n        0xA802 => Script::SylotiNagri,\n        0xA803..=0xA805 => Script::SylotiNagri,\n        0xA806 => Script::SylotiNagri,\n        0xA807..=0xA80A => Script::SylotiNagri,\n        0xA80B => Script::SylotiNagri,\n        0xA80C..=0xA822 => Script::SylotiNagri,\n        0xA823..=0xA824 => Script::SylotiNagri,\n        0xA825..=0xA826 => Script::SylotiNagri,\n        0xA827 => Script::SylotiNagri,\n        0xA828..=0xA82B => Script::SylotiNagri,\n        0x103A0..=0x103C3 => Script::OldPersian,\n        0x103C8..=0x103CF => Script::OldPersian,\n        0x103D0 => Script::OldPersian,\n        0x103D1..=0x103D5 => Script::OldPersian,\n        0x10A00 => Script::Kharoshthi,\n        0x10A01..=0x10A03 => Script::Kharoshthi,\n        0x10A05..=0x10A06 => Script::Kharoshthi,\n        0x10A0C..=0x10A0F => Script::Kharoshthi,\n        0x10A10..=0x10A13 => Script::Kharoshthi,\n        0x10A15..=0x10A17 => Script::Kharoshthi,\n        0x10A19..=0x10A33 => Script::Kharoshthi,\n        0x10A38..=0x10A3A => Script::Kharoshthi,\n        0x10A3F => Script::Kharoshthi,\n        0x10A40..=0x10A47 => Script::Kharoshthi,\n        0x10A50..=0x10A58 => Script::Kharoshthi,\n        0x1B00..=0x1B03 => Script::Balinese,\n        0x1B04 => Script::Balinese,\n        0x1B05..=0x1B33 => Script::Balinese,\n        0x1B34 => Script::Balinese,\n        0x1B35 => Script::Balinese,\n        0x1B36..=0x1B3A => Script::Balinese,\n        0x1B3B => Script::Balinese,\n        0x1B3C => Script::Balinese,\n        0x1B3D..=0x1B41 => Script::Balinese,\n        0x1B42 => Script::Balinese,\n        0x1B43..=0x1B44 => Script::Balinese,\n        0x1B45..=0x1B4B => Script::Balinese,\n        0x1B50..=0x1B59 => Script::Balinese,\n        0x1B5A..=0x1B60 => Script::Balinese,\n        0x1B61..=0x1B6A => Script::Balinese,\n        0x1B6B..=0x1B73 => Script::Balinese,\n        0x1B74..=0x1B7C => Script::Balinese,\n        0x12000..=0x12399 => Script::Cuneiform,\n        0x12400..=0x1246E => Script::Cuneiform,\n        0x12470..=0x12474 => Script::Cuneiform,\n        0x12480..=0x12543 => Script::Cuneiform,\n        0x10900..=0x10915 => Script::Phoenician,\n        0x10916..=0x1091B => Script::Phoenician,\n        0x1091F => Script::Phoenician,\n        0xA840..=0xA873 => Script::PhagsPa,\n        0xA874..=0xA877 => Script::PhagsPa,\n        0x07C0..=0x07C9 => Script::Nko,\n        0x07CA..=0x07EA => Script::Nko,\n        0x07EB..=0x07F3 => Script::Nko,\n        0x07F4..=0x07F5 => Script::Nko,\n        0x07F6 => Script::Nko,\n        0x07F7..=0x07F9 => Script::Nko,\n        0x07FA => Script::Nko,\n        0x1B80..=0x1B81 => Script::Sundanese,\n        0x1B82 => Script::Sundanese,\n        0x1B83..=0x1BA0 => Script::Sundanese,\n        0x1BA1 => Script::Sundanese,\n        0x1BA2..=0x1BA5 => Script::Sundanese,\n        0x1BA6..=0x1BA7 => Script::Sundanese,\n        0x1BA8..=0x1BA9 => Script::Sundanese,\n        0x1BAA => Script::Sundanese,\n        0x1BAB..=0x1BAD => Script::Sundanese,\n        0x1BAE..=0x1BAF => Script::Sundanese,\n        0x1BB0..=0x1BB9 => Script::Sundanese,\n        0x1BBA..=0x1BBF => Script::Sundanese,\n        0x1CC0..=0x1CC7 => Script::Sundanese,\n        0x1C00..=0x1C23 => Script::Lepcha,\n        0x1C24..=0x1C2B => Script::Lepcha,\n        0x1C2C..=0x1C33 => Script::Lepcha,\n        0x1C34..=0x1C35 => Script::Lepcha,\n        0x1C36..=0x1C37 => Script::Lepcha,\n        0x1C3B..=0x1C3F => Script::Lepcha,\n        0x1C40..=0x1C49 => Script::Lepcha,\n        0x1C4D..=0x1C4F => Script::Lepcha,\n        0x1C50..=0x1C59 => Script::OlChiki,\n        0x1C5A..=0x1C77 => Script::OlChiki,\n        0x1C78..=0x1C7D => Script::OlChiki,\n        0x1C7E..=0x1C7F => Script::OlChiki,\n        0xA500..=0xA60B => Script::Vai,\n        0xA60C => Script::Vai,\n        0xA60D..=0xA60F => Script::Vai,\n        0xA610..=0xA61F => Script::Vai,\n        0xA620..=0xA629 => Script::Vai,\n        0xA62A..=0xA62B => Script::Vai,\n        0xA880..=0xA881 => Script::Saurashtra,\n        0xA882..=0xA8B3 => Script::Saurashtra,\n        0xA8B4..=0xA8C3 => Script::Saurashtra,\n        0xA8C4..=0xA8C5 => Script::Saurashtra,\n        0xA8CE..=0xA8CF => Script::Saurashtra,\n        0xA8D0..=0xA8D9 => Script::Saurashtra,\n        0xA900..=0xA909 => Script::KayahLi,\n        0xA90A..=0xA925 => Script::KayahLi,\n        0xA926..=0xA92D => Script::KayahLi,\n        0xA92F => Script::KayahLi,\n        0xA930..=0xA946 => Script::Rejang,\n        0xA947..=0xA951 => Script::Rejang,\n        0xA952..=0xA953 => Script::Rejang,\n        0xA95F => Script::Rejang,\n        0x10280..=0x1029C => Script::Lycian,\n        0x102A0..=0x102D0 => Script::Carian,\n        0x10920..=0x10939 => Script::Lydian,\n        0x1093F => Script::Lydian,\n        0xAA00..=0xAA28 => Script::Cham,\n        0xAA29..=0xAA2E => Script::Cham,\n        0xAA2F..=0xAA30 => Script::Cham,\n        0xAA31..=0xAA32 => Script::Cham,\n        0xAA33..=0xAA34 => Script::Cham,\n        0xAA35..=0xAA36 => Script::Cham,\n        0xAA40..=0xAA42 => Script::Cham,\n        0xAA43 => Script::Cham,\n        0xAA44..=0xAA4B => Script::Cham,\n        0xAA4C => Script::Cham,\n        0xAA4D => Script::Cham,\n        0xAA50..=0xAA59 => Script::Cham,\n        0xAA5C..=0xAA5F => Script::Cham,\n        0x1A20..=0x1A54 => Script::TaiTham,\n        0x1A55 => Script::TaiTham,\n        0x1A56 => Script::TaiTham,\n        0x1A57 => Script::TaiTham,\n        0x1A58..=0x1A5E => Script::TaiTham,\n        0x1A60 => Script::TaiTham,\n        0x1A61 => Script::TaiTham,\n        0x1A62 => Script::TaiTham,\n        0x1A63..=0x1A64 => Script::TaiTham,\n        0x1A65..=0x1A6C => Script::TaiTham,\n        0x1A6D..=0x1A72 => Script::TaiTham,\n        0x1A73..=0x1A7C => Script::TaiTham,\n        0x1A7F => Script::TaiTham,\n        0x1A80..=0x1A89 => Script::TaiTham,\n        0x1A90..=0x1A99 => Script::TaiTham,\n        0x1AA0..=0x1AA6 => Script::TaiTham,\n        0x1AA7 => Script::TaiTham,\n        0x1AA8..=0x1AAD => Script::TaiTham,\n        0xAA80..=0xAAAF => Script::TaiViet,\n        0xAAB0 => Script::TaiViet,\n        0xAAB1 => Script::TaiViet,\n        0xAAB2..=0xAAB4 => Script::TaiViet,\n        0xAAB5..=0xAAB6 => Script::TaiViet,\n        0xAAB7..=0xAAB8 => Script::TaiViet,\n        0xAAB9..=0xAABD => Script::TaiViet,\n        0xAABE..=0xAABF => Script::TaiViet,\n        0xAAC0 => Script::TaiViet,\n        0xAAC1 => Script::TaiViet,\n        0xAAC2 => Script::TaiViet,\n        0xAADB..=0xAADC => Script::TaiViet,\n        0xAADD => Script::TaiViet,\n        0xAADE..=0xAADF => Script::TaiViet,\n        0x10B00..=0x10B35 => Script::Avestan,\n        0x10B39..=0x10B3F => Script::Avestan,\n        0x13000..=0x1342E => Script::EgyptianHieroglyphs,\n        0x0800..=0x0815 => Script::Samaritan,\n        0x0816..=0x0819 => Script::Samaritan,\n        0x081A => Script::Samaritan,\n        0x081B..=0x0823 => Script::Samaritan,\n        0x0824 => Script::Samaritan,\n        0x0825..=0x0827 => Script::Samaritan,\n        0x0828 => Script::Samaritan,\n        0x0829..=0x082D => Script::Samaritan,\n        0x0830..=0x083E => Script::Samaritan,\n        0xA4D0..=0xA4F7 => Script::Lisu,\n        0xA4F8..=0xA4FD => Script::Lisu,\n        0xA4FE..=0xA4FF => Script::Lisu,\n        0xA6A0..=0xA6E5 => Script::Bamum,\n        0xA6E6..=0xA6EF => Script::Bamum,\n        0xA6F0..=0xA6F1 => Script::Bamum,\n        0xA6F2..=0xA6F7 => Script::Bamum,\n        0x16800..=0x16A38 => Script::Bamum,\n        0xA980..=0xA982 => Script::Javanese,\n        0xA983 => Script::Javanese,\n        0xA984..=0xA9B2 => Script::Javanese,\n        0xA9B3 => Script::Javanese,\n        0xA9B4..=0xA9B5 => Script::Javanese,\n        0xA9B6..=0xA9B9 => Script::Javanese,\n        0xA9BA..=0xA9BB => Script::Javanese,\n        0xA9BC => Script::Javanese,\n        0xA9BD..=0xA9C0 => Script::Javanese,\n        0xA9C1..=0xA9CD => Script::Javanese,\n        0xA9D0..=0xA9D9 => Script::Javanese,\n        0xA9DE..=0xA9DF => Script::Javanese,\n        0xAAE0..=0xAAEA => Script::MeeteiMayek,\n        0xAAEB => Script::MeeteiMayek,\n        0xAAEC..=0xAAED => Script::MeeteiMayek,\n        0xAAEE..=0xAAEF => Script::MeeteiMayek,\n        0xAAF0..=0xAAF1 => Script::MeeteiMayek,\n        0xAAF2 => Script::MeeteiMayek,\n        0xAAF3..=0xAAF4 => Script::MeeteiMayek,\n        0xAAF5 => Script::MeeteiMayek,\n        0xAAF6 => Script::MeeteiMayek,\n        0xABC0..=0xABE2 => Script::MeeteiMayek,\n        0xABE3..=0xABE4 => Script::MeeteiMayek,\n        0xABE5 => Script::MeeteiMayek,\n        0xABE6..=0xABE7 => Script::MeeteiMayek,\n        0xABE8 => Script::MeeteiMayek,\n        0xABE9..=0xABEA => Script::MeeteiMayek,\n        0xABEB => Script::MeeteiMayek,\n        0xABEC => Script::MeeteiMayek,\n        0xABED => Script::MeeteiMayek,\n        0xABF0..=0xABF9 => Script::MeeteiMayek,\n        0x10840..=0x10855 => Script::ImperialAramaic,\n        0x10857 => Script::ImperialAramaic,\n        0x10858..=0x1085F => Script::ImperialAramaic,\n        0x10A60..=0x10A7C => Script::OldSouthArabian,\n        0x10A7D..=0x10A7E => Script::OldSouthArabian,\n        0x10A7F => Script::OldSouthArabian,\n        0x10B40..=0x10B55 => Script::InscriptionalParthian,\n        0x10B58..=0x10B5F => Script::InscriptionalParthian,\n        0x10B60..=0x10B72 => Script::InscriptionalPahlavi,\n        0x10B78..=0x10B7F => Script::InscriptionalPahlavi,\n        0x10C00..=0x10C48 => Script::OldTurkic,\n        0x11080..=0x11081 => Script::Kaithi,\n        0x11082 => Script::Kaithi,\n        0x11083..=0x110AF => Script::Kaithi,\n        0x110B0..=0x110B2 => Script::Kaithi,\n        0x110B3..=0x110B6 => Script::Kaithi,\n        0x110B7..=0x110B8 => Script::Kaithi,\n        0x110B9..=0x110BA => Script::Kaithi,\n        0x110BB..=0x110BC => Script::Kaithi,\n        0x110BD => Script::Kaithi,\n        0x110BE..=0x110C1 => Script::Kaithi,\n        0x1BC0..=0x1BE5 => Script::Batak,\n        0x1BE6 => Script::Batak,\n        0x1BE7 => Script::Batak,\n        0x1BE8..=0x1BE9 => Script::Batak,\n        0x1BEA..=0x1BEC => Script::Batak,\n        0x1BED => Script::Batak,\n        0x1BEE => Script::Batak,\n        0x1BEF..=0x1BF1 => Script::Batak,\n        0x1BF2..=0x1BF3 => Script::Batak,\n        0x1BFC..=0x1BFF => Script::Batak,\n        0x11000 => Script::Brahmi,\n        0x11001 => Script::Brahmi,\n        0x11002 => Script::Brahmi,\n        0x11003..=0x11037 => Script::Brahmi,\n        0x11038..=0x11046 => Script::Brahmi,\n        0x11047..=0x1104D => Script::Brahmi,\n        0x11052..=0x11065 => Script::Brahmi,\n        0x11066..=0x1106F => Script::Brahmi,\n        0x1107F => Script::Brahmi,\n        0x0840..=0x0858 => Script::Mandaic,\n        0x0859..=0x085B => Script::Mandaic,\n        0x085E => Script::Mandaic,\n        0x11100..=0x11102 => Script::Chakma,\n        0x11103..=0x11126 => Script::Chakma,\n        0x11127..=0x1112B => Script::Chakma,\n        0x1112C => Script::Chakma,\n        0x1112D..=0x11134 => Script::Chakma,\n        0x11136..=0x1113F => Script::Chakma,\n        0x11140..=0x11143 => Script::Chakma,\n        0x109A0..=0x109B7 => Script::MeroiticCursive,\n        0x109BC..=0x109BD => Script::MeroiticCursive,\n        0x109BE..=0x109BF => Script::MeroiticCursive,\n        0x109C0..=0x109CF => Script::MeroiticCursive,\n        0x109D2..=0x109FF => Script::MeroiticCursive,\n        0x10980..=0x1099F => Script::MeroiticHieroglyphs,\n        0x16F00..=0x16F44 => Script::Miao,\n        0x16F50 => Script::Miao,\n        0x16F51..=0x16F7E => Script::Miao,\n        0x16F8F..=0x16F92 => Script::Miao,\n        0x16F93..=0x16F9F => Script::Miao,\n        0x11180..=0x11181 => Script::Sharada,\n        0x11182 => Script::Sharada,\n        0x11183..=0x111B2 => Script::Sharada,\n        0x111B3..=0x111B5 => Script::Sharada,\n        0x111B6..=0x111BE => Script::Sharada,\n        0x111BF..=0x111C0 => Script::Sharada,\n        0x111C1..=0x111C4 => Script::Sharada,\n        0x111C5..=0x111C9 => Script::Sharada,\n        0x111CA..=0x111CC => Script::Sharada,\n        0x111CD => Script::Sharada,\n        0x111D0..=0x111D9 => Script::Sharada,\n        0x111DA => Script::Sharada,\n        0x111DB => Script::Sharada,\n        0x111DC => Script::Sharada,\n        0x111DD..=0x111DF => Script::Sharada,\n        0x110D0..=0x110E8 => Script::SoraSompeng,\n        0x110F0..=0x110F9 => Script::SoraSompeng,\n        0x11680..=0x116AA => Script::Takri,\n        0x116AB => Script::Takri,\n        0x116AC => Script::Takri,\n        0x116AD => Script::Takri,\n        0x116AE..=0x116AF => Script::Takri,\n        0x116B0..=0x116B5 => Script::Takri,\n        0x116B6 => Script::Takri,\n        0x116B7 => Script::Takri,\n        0x116C0..=0x116C9 => Script::Takri,\n        0x10530..=0x10563 => Script::CaucasianAlbanian,\n        0x1056F => Script::CaucasianAlbanian,\n        0x16AD0..=0x16AED => Script::BassaVah,\n        0x16AF0..=0x16AF4 => Script::BassaVah,\n        0x16AF5 => Script::BassaVah,\n        0x1BC00..=0x1BC6A => Script::Duployan,\n        0x1BC70..=0x1BC7C => Script::Duployan,\n        0x1BC80..=0x1BC88 => Script::Duployan,\n        0x1BC90..=0x1BC99 => Script::Duployan,\n        0x1BC9C => Script::Duployan,\n        0x1BC9D..=0x1BC9E => Script::Duployan,\n        0x1BC9F => Script::Duployan,\n        0x10500..=0x10527 => Script::Elbasan,\n        0x11300..=0x11301 => Script::Grantha,\n        0x11302..=0x11303 => Script::Grantha,\n        0x11305..=0x1130C => Script::Grantha,\n        0x1130F..=0x11310 => Script::Grantha,\n        0x11313..=0x11328 => Script::Grantha,\n        0x1132A..=0x11330 => Script::Grantha,\n        0x11332..=0x11333 => Script::Grantha,\n        0x11335..=0x11339 => Script::Grantha,\n        0x1133C => Script::Grantha,\n        0x1133D => Script::Grantha,\n        0x1133E..=0x1133F => Script::Grantha,\n        0x11340 => Script::Grantha,\n        0x11341..=0x11344 => Script::Grantha,\n        0x11347..=0x11348 => Script::Grantha,\n        0x1134B..=0x1134D => Script::Grantha,\n        0x11350 => Script::Grantha,\n        0x11357 => Script::Grantha,\n        0x1135D..=0x11361 => Script::Grantha,\n        0x11362..=0x11363 => Script::Grantha,\n        0x11366..=0x1136C => Script::Grantha,\n        0x11370..=0x11374 => Script::Grantha,\n        0x16B00..=0x16B2F => Script::PahawhHmong,\n        0x16B30..=0x16B36 => Script::PahawhHmong,\n        0x16B37..=0x16B3B => Script::PahawhHmong,\n        0x16B3C..=0x16B3F => Script::PahawhHmong,\n        0x16B40..=0x16B43 => Script::PahawhHmong,\n        0x16B44 => Script::PahawhHmong,\n        0x16B45 => Script::PahawhHmong,\n        0x16B50..=0x16B59 => Script::PahawhHmong,\n        0x16B5B..=0x16B61 => Script::PahawhHmong,\n        0x16B63..=0x16B77 => Script::PahawhHmong,\n        0x16B7D..=0x16B8F => Script::PahawhHmong,\n        0x11200..=0x11211 => Script::Khojki,\n        0x11213..=0x1122B => Script::Khojki,\n        0x1122C..=0x1122E => Script::Khojki,\n        0x1122F..=0x11231 => Script::Khojki,\n        0x11232..=0x11233 => Script::Khojki,\n        0x11234 => Script::Khojki,\n        0x11235 => Script::Khojki,\n        0x11236..=0x11237 => Script::Khojki,\n        0x11238..=0x1123D => Script::Khojki,\n        0x1123E => Script::Khojki,\n        0x10600..=0x10736 => Script::LinearA,\n        0x10740..=0x10755 => Script::LinearA,\n        0x10760..=0x10767 => Script::LinearA,\n        0x11150..=0x11172 => Script::Mahajani,\n        0x11173 => Script::Mahajani,\n        0x11174..=0x11175 => Script::Mahajani,\n        0x11176 => Script::Mahajani,\n        0x10AC0..=0x10AC7 => Script::Manichaean,\n        0x10AC8 => Script::Manichaean,\n        0x10AC9..=0x10AE4 => Script::Manichaean,\n        0x10AE5..=0x10AE6 => Script::Manichaean,\n        0x10AEB..=0x10AEF => Script::Manichaean,\n        0x10AF0..=0x10AF6 => Script::Manichaean,\n        0x1E800..=0x1E8C4 => Script::MendeKikakui,\n        0x1E8C7..=0x1E8CF => Script::MendeKikakui,\n        0x1E8D0..=0x1E8D6 => Script::MendeKikakui,\n        0x11600..=0x1162F => Script::Modi,\n        0x11630..=0x11632 => Script::Modi,\n        0x11633..=0x1163A => Script::Modi,\n        0x1163B..=0x1163C => Script::Modi,\n        0x1163D => Script::Modi,\n        0x1163E => Script::Modi,\n        0x1163F..=0x11640 => Script::Modi,\n        0x11641..=0x11643 => Script::Modi,\n        0x11644 => Script::Modi,\n        0x11650..=0x11659 => Script::Modi,\n        0x16A40..=0x16A5E => Script::Mro,\n        0x16A60..=0x16A69 => Script::Mro,\n        0x16A6E..=0x16A6F => Script::Mro,\n        0x10A80..=0x10A9C => Script::OldNorthArabian,\n        0x10A9D..=0x10A9F => Script::OldNorthArabian,\n        0x10880..=0x1089E => Script::Nabataean,\n        0x108A7..=0x108AF => Script::Nabataean,\n        0x10860..=0x10876 => Script::Palmyrene,\n        0x10877..=0x10878 => Script::Palmyrene,\n        0x10879..=0x1087F => Script::Palmyrene,\n        0x11AC0..=0x11AF8 => Script::PauCinHau,\n        0x10350..=0x10375 => Script::OldPermic,\n        0x10376..=0x1037A => Script::OldPermic,\n        0x10B80..=0x10B91 => Script::PsalterPahlavi,\n        0x10B99..=0x10B9C => Script::PsalterPahlavi,\n        0x10BA9..=0x10BAF => Script::PsalterPahlavi,\n        0x11580..=0x115AE => Script::Siddham,\n        0x115AF..=0x115B1 => Script::Siddham,\n        0x115B2..=0x115B5 => Script::Siddham,\n        0x115B8..=0x115BB => Script::Siddham,\n        0x115BC..=0x115BD => Script::Siddham,\n        0x115BE => Script::Siddham,\n        0x115BF..=0x115C0 => Script::Siddham,\n        0x115C1..=0x115D7 => Script::Siddham,\n        0x115D8..=0x115DB => Script::Siddham,\n        0x115DC..=0x115DD => Script::Siddham,\n        0x112B0..=0x112DE => Script::Khudawadi,\n        0x112DF => Script::Khudawadi,\n        0x112E0..=0x112E2 => Script::Khudawadi,\n        0x112E3..=0x112EA => Script::Khudawadi,\n        0x112F0..=0x112F9 => Script::Khudawadi,\n        0x11480..=0x114AF => Script::Tirhuta,\n        0x114B0..=0x114B2 => Script::Tirhuta,\n        0x114B3..=0x114B8 => Script::Tirhuta,\n        0x114B9 => Script::Tirhuta,\n        0x114BA => Script::Tirhuta,\n        0x114BB..=0x114BE => Script::Tirhuta,\n        0x114BF..=0x114C0 => Script::Tirhuta,\n        0x114C1 => Script::Tirhuta,\n        0x114C2..=0x114C3 => Script::Tirhuta,\n        0x114C4..=0x114C5 => Script::Tirhuta,\n        0x114C6 => Script::Tirhuta,\n        0x114C7 => Script::Tirhuta,\n        0x114D0..=0x114D9 => Script::Tirhuta,\n        0x118A0..=0x118DF => Script::WarangCiti,\n        0x118E0..=0x118E9 => Script::WarangCiti,\n        0x118EA..=0x118F2 => Script::WarangCiti,\n        0x118FF => Script::WarangCiti,\n        0x11700..=0x11719 => Script::Ahom,\n        0x1171D..=0x1171F => Script::Ahom,\n        0x11720..=0x11721 => Script::Ahom,\n        0x11722..=0x11725 => Script::Ahom,\n        0x11726 => Script::Ahom,\n        0x11727..=0x1172B => Script::Ahom,\n        0x11730..=0x11739 => Script::Ahom,\n        0x1173A..=0x1173B => Script::Ahom,\n        0x1173C..=0x1173E => Script::Ahom,\n        0x1173F => Script::Ahom,\n        0x14400..=0x14646 => Script::AnatolianHieroglyphs,\n        0x108E0..=0x108F2 => Script::Hatran,\n        0x108F4..=0x108F5 => Script::Hatran,\n        0x108FB..=0x108FF => Script::Hatran,\n        0x11280..=0x11286 => Script::Multani,\n        0x11288 => Script::Multani,\n        0x1128A..=0x1128D => Script::Multani,\n        0x1128F..=0x1129D => Script::Multani,\n        0x1129F..=0x112A8 => Script::Multani,\n        0x112A9 => Script::Multani,\n        0x10C80..=0x10CB2 => Script::OldHungarian,\n        0x10CC0..=0x10CF2 => Script::OldHungarian,\n        0x10CFA..=0x10CFF => Script::OldHungarian,\n        0x1D800..=0x1D9FF => Script::SignWriting,\n        0x1DA00..=0x1DA36 => Script::SignWriting,\n        0x1DA37..=0x1DA3A => Script::SignWriting,\n        0x1DA3B..=0x1DA6C => Script::SignWriting,\n        0x1DA6D..=0x1DA74 => Script::SignWriting,\n        0x1DA75 => Script::SignWriting,\n        0x1DA76..=0x1DA83 => Script::SignWriting,\n        0x1DA84 => Script::SignWriting,\n        0x1DA85..=0x1DA86 => Script::SignWriting,\n        0x1DA87..=0x1DA8B => Script::SignWriting,\n        0x1DA9B..=0x1DA9F => Script::SignWriting,\n        0x1DAA1..=0x1DAAF => Script::SignWriting,\n        0x1E900..=0x1E943 => Script::Adlam,\n        0x1E944..=0x1E94A => Script::Adlam,\n        0x1E950..=0x1E959 => Script::Adlam,\n        0x1E95E..=0x1E95F => Script::Adlam,\n        0x11C00..=0x11C08 => Script::Bhaiksuki,\n        0x11C0A..=0x11C2E => Script::Bhaiksuki,\n        0x11C2F => Script::Bhaiksuki,\n        0x11C30..=0x11C36 => Script::Bhaiksuki,\n        0x11C38..=0x11C3D => Script::Bhaiksuki,\n        0x11C3E => Script::Bhaiksuki,\n        0x11C3F => Script::Bhaiksuki,\n        0x11C40 => Script::Bhaiksuki,\n        0x11C41..=0x11C45 => Script::Bhaiksuki,\n        0x11C50..=0x11C59 => Script::Bhaiksuki,\n        0x11C5A..=0x11C6C => Script::Bhaiksuki,\n        0x11C70..=0x11C71 => Script::Marchen,\n        0x11C72..=0x11C8F => Script::Marchen,\n        0x11C92..=0x11CA7 => Script::Marchen,\n        0x11CA9 => Script::Marchen,\n        0x11CAA..=0x11CB0 => Script::Marchen,\n        0x11CB1 => Script::Marchen,\n        0x11CB2..=0x11CB3 => Script::Marchen,\n        0x11CB4 => Script::Marchen,\n        0x11CB5..=0x11CB6 => Script::Marchen,\n        0x11400..=0x11434 => Script::Newa,\n        0x11435..=0x11437 => Script::Newa,\n        0x11438..=0x1143F => Script::Newa,\n        0x11440..=0x11441 => Script::Newa,\n        0x11442..=0x11444 => Script::Newa,\n        0x11445 => Script::Newa,\n        0x11446 => Script::Newa,\n        0x11447..=0x1144A => Script::Newa,\n        0x1144B..=0x1144F => Script::Newa,\n        0x11450..=0x11459 => Script::Newa,\n        0x1145B => Script::Newa,\n        0x1145D => Script::Newa,\n        0x104B0..=0x104D3 => Script::Osage,\n        0x104D8..=0x104FB => Script::Osage,\n        0x16FE0 => Script::Tangut,\n        0x17000..=0x187EC => Script::Tangut,\n        0x18800..=0x18AF2 => Script::Tangut,\n        _ => Script::Any,\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_unicode_script() {\n        assert_eq!(Script::Han, get_script('京'));\n        assert_eq!(Script::Han, get_script('太'));\n        assert_eq!(Script::Hiragana, get_script('い'));\n        assert_eq!(Script::Katakana, get_script('グ'));\n        assert_eq!(Script::Common, get_script('ー'));\n        assert_eq!(Script::Latin, get_script('a'));\n        assert_eq!(Script::Latin, get_script('A'));\n        assert_eq!(Script::Common, get_script('0'));\n        assert_eq!(Script::Common, get_script('$'));\n        assert_eq!(Script::Common, get_script('@'));\n        assert_eq!(Script::Common, get_script('-'));\n        assert_eq!(Script::Common, get_script(' '));\n        assert_eq!(Script::Common, get_script('�'));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/pre_tokenizers/whitespace.rs",
    "content": "use std::sync::LazyLock;\n\nuse regex::Regex;\n\nuse crate::tokenizer::{\n    pattern::Invert, PreTokenizedString, PreTokenizer, Result, SplitDelimiterBehavior,\n};\nuse crate::utils::macro_rules_attribute;\n\n#[derive(Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Whitespace;\n\nimpl Default for Whitespace {\n    fn default() -> Self {\n        Self\n    }\n}\n\nimpl PreTokenizer for Whitespace {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r\"\\w+|[^\\w\\s]+\").unwrap());\n        let re_ref: &Regex = &RE;\n\n        pretokenized.split(|_, normalized| {\n            normalized.split(Invert(re_ref), SplitDelimiterBehavior::Removed)\n        })\n    }\n}\n\n#[derive(Copy, Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct WhitespaceSplit;\n\nimpl PreTokenizer for WhitespaceSplit {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()> {\n        pretokenized.split(|_, normalized| {\n            normalized.split(char::is_whitespace, SplitDelimiterBehavior::Removed)\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{OffsetReferential, OffsetType, PreTokenizer};\n\n    #[test]\n    fn basic() {\n        let tests = vec![\n            (\n                \"Hey man!\",\n                vec![(\"Hey\", (0, 3)), (\"man\", (4, 7)), (\"!\", (7, 8))],\n            ),\n            (\n                \"How are you doing?\",\n                vec![\n                    (\"How\", (0, 3)),\n                    (\"are\", (4, 7)),\n                    (\"you\", (8, 11)),\n                    (\"doing\", (12, 17)),\n                    (\"?\", (17, 18)),\n                ],\n            ),\n            (\"\\n\", vec![]),\n        ];\n        let pretok = Whitespace {};\n        for (s, res) in tests {\n            let mut pretokenized = PreTokenizedString::from(s);\n            pretok.pre_tokenize(&mut pretokenized).unwrap();\n            assert_eq!(\n                pretokenized\n                    .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                    .into_iter()\n                    .map(|(s, o, _)| (s, o))\n                    .collect::<Vec<_>>(),\n                res\n            );\n        }\n    }\n\n    #[test]\n    fn whitespace_split() {\n        let tests = vec![\n            (\"Hey man!\", vec![(\"Hey\", (0, 3)), (\"man!\", (4, 8))]),\n            (\n                \"Hey, man, Good?\",\n                vec![(\"Hey,\", (0, 4)), (\"man,\", (5, 9)), (\"Good?\", (10, 15))],\n            ),\n        ];\n        let pretok = WhitespaceSplit;\n        for (s, res) in tests {\n            let mut pretokenized = PreTokenizedString::from(s);\n            pretok.pre_tokenize(&mut pretokenized).unwrap();\n            assert_eq!(\n                pretokenized\n                    .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                    .into_iter()\n                    .map(|(s, o, _)| (s, o))\n                    .collect::<Vec<_>>(),\n                res\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/processors/bert.rs",
    "content": "use crate::tokenizer::{Encoding, PostProcessor, Result};\nuse ahash::AHashMap;\nuse serde::{Deserialize, Serialize};\nuse std::iter::FromIterator;\n\n#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]\n#[serde(tag = \"type\")]\npub struct BertProcessing {\n    pub sep: (String, u32),\n    pub cls: (String, u32),\n}\n\nimpl Default for BertProcessing {\n    fn default() -> Self {\n        Self {\n            sep: (\"[SEP]\".into(), 102),\n            cls: (\"[CLS]\".into(), 101),\n        }\n    }\n}\n\nimpl BertProcessing {\n    pub fn new(sep: (String, u32), cls: (String, u32)) -> Self {\n        Self { sep, cls }\n    }\n\n    pub fn get_sep_copy(&self) -> (String, u32) {\n        (self.sep.0.clone(), self.sep.1)\n    }\n\n    pub fn get_cls_copy(&self) -> (String, u32) {\n        (self.cls.0.clone(), self.cls.1)\n    }\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum BertProcessorError {\n    #[error(\"encodings vector length must be either 1 or 2\")]\n    InvalidEncodingsVecLength,\n}\n\nimpl PostProcessor for BertProcessing {\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        if is_pair {\n            3\n        } else {\n            2\n        }\n    }\n\n    fn process_encodings(\n        &self,\n        mut encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        if !add_special_tokens {\n            return Ok(encodings);\n        }\n\n        let encodings: Vec<Encoding> = encodings\n            .iter_mut()\n            .enumerate()\n            .map(|(i, encoding)| {\n                if i == 0 {\n                    let ids = [&[self.cls.1], encoding.get_ids(), &[self.sep.1]].concat();\n                    let type_ids = [&[0], encoding.get_type_ids(), &[0]].concat();\n                    let tokens = [\n                        std::slice::from_ref(&self.cls.0),\n                        encoding.get_tokens(),\n                        std::slice::from_ref(&self.sep.0),\n                    ]\n                    .concat();\n                    let words = [&[None], encoding.get_word_ids(), &[None]].concat();\n                    let offsets = [&[(0, 0)], encoding.get_offsets(), &[(0, 0)]].concat();\n                    let special_tokens =\n                        [&[1u32], &vec![0; encoding.get_ids().len()][..], &[1]].concat();\n                    let attention_mask = vec![1; ids.len()];\n\n                    // For compatibility with `TemplateProcessing`, the sequence_ranges shouldn't contain\n                    // the special tokens.\n                    let sequence_ranges = AHashMap::from_iter(vec![(0, 1..ids.len() - 1)]);\n                    Encoding::new(\n                        ids,\n                        type_ids,\n                        tokens,\n                        words,\n                        offsets,\n                        special_tokens,\n                        attention_mask,\n                        encoding\n                            .take_overflowing()\n                            .into_iter()\n                            .map(|encoding| {\n                                let ids =\n                                    [&[self.cls.1], encoding.get_ids(), &[self.sep.1]].concat();\n                                let type_ids = [&[0], encoding.get_type_ids(), &[0]].concat();\n                                let tokens = [\n                                    std::slice::from_ref(&self.cls.0),\n                                    encoding.get_tokens(),\n                                    std::slice::from_ref(&self.sep.0),\n                                ]\n                                .concat();\n                                let words = [&[None], encoding.get_word_ids(), &[None]].concat();\n                                let offsets =\n                                    [&[(0, 0)], encoding.get_offsets(), &[(0, 0)]].concat();\n                                let special_tokens =\n                                    [&[1u32], &vec![0; encoding.get_ids().len()][..], &[1]]\n                                        .concat();\n                                let attention_mask = vec![1; ids.len()];\n\n                                // For compatibility with `TemplateProcessing`, the sequence_ranges shouldn't\n                                // contain the special tokens.\n                                let sequence_ranges =\n                                    AHashMap::from_iter(vec![(0, 1..ids.len() - 1)]);\n                                Encoding::new(\n                                    ids,\n                                    type_ids,\n                                    tokens,\n                                    words,\n                                    offsets,\n                                    special_tokens,\n                                    attention_mask,\n                                    vec![],\n                                    sequence_ranges,\n                                )\n                            })\n                            .collect(),\n                        sequence_ranges,\n                    )\n                } else {\n                    let pair_ids = [encoding.get_ids(), &[self.sep.1]].concat();\n                    let pair_type_ids = [encoding.get_type_ids(), &[1]].concat();\n                    let pair_tokens =\n                        [encoding.get_tokens(), std::slice::from_ref(&self.sep.0)].concat();\n                    let pair_words = [encoding.get_word_ids(), &[None]].concat();\n                    let pair_offsets = [encoding.get_offsets(), &[(0, 0)]].concat();\n                    let pair_special_tokens =\n                        [&vec![0u32; encoding.get_type_ids().len()][..], &[1]].concat();\n                    let pair_attention_mask = vec![1; pair_ids.len()];\n\n                    // For compatibility with `TemplateProcessing`, the sequence_ranges shouldn't contain\n                    // the special tokens.\n                    let pair_sequence_ranges =\n                        AHashMap::from_iter(vec![(1, 0..pair_ids.len() - 1)]);\n                    Encoding::new(\n                        pair_ids,\n                        pair_type_ids,\n                        pair_tokens,\n                        pair_words,\n                        pair_offsets,\n                        pair_special_tokens,\n                        pair_attention_mask,\n                        encoding\n                            .take_overflowing()\n                            .into_iter()\n                            .map(|encoding| {\n                                let pair_ids = [encoding.get_ids(), &[self.sep.1]].concat();\n                                let pair_type_ids = [encoding.get_type_ids(), &[1]].concat();\n                                let pair_tokens =\n                                    [encoding.get_tokens(), std::slice::from_ref(&self.sep.0)]\n                                        .concat();\n                                let pair_words = [encoding.get_word_ids(), &[None]].concat();\n                                let pair_offsets = [encoding.get_offsets(), &[(0, 0)]].concat();\n                                let pair_special_tokens =\n                                    [&vec![0u32; encoding.get_type_ids().len()][..], &[1]].concat();\n                                let pair_attention_mask = vec![1; pair_ids.len()];\n\n                                // For compatibility with `TemplateProcessing`, the sequence_ranges\n                                // shouldn't contain the special tokens.\n                                let pair_sequence_ranges =\n                                    AHashMap::from_iter(vec![(1, 0..pair_ids.len() - 1)]);\n                                Encoding::new(\n                                    pair_ids,\n                                    pair_type_ids,\n                                    pair_tokens,\n                                    pair_words,\n                                    pair_offsets,\n                                    pair_special_tokens,\n                                    pair_attention_mask,\n                                    vec![],\n                                    pair_sequence_ranges,\n                                )\n                            })\n                            .collect(),\n                        pair_sequence_ranges,\n                    )\n                }\n            })\n            .collect();\n\n        Ok(encodings)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn serde() {\n        let bert = BertProcessing::default();\n        let bert_r = r#\"{\"type\":\"BertProcessing\",\"sep\":[\"[SEP]\",102],\"cls\":[\"[CLS]\",101]}\"#;\n        assert_eq!(serde_json::to_string(&bert).unwrap(), bert_r);\n        assert_eq!(\n            serde_json::from_str::<BertProcessing>(bert_r).unwrap(),\n            bert\n        );\n    }\n\n    #[test]\n    fn bert_processing() {\n        let processor = BertProcessing::default();\n        assert_eq!(processor.added_tokens(false), 2);\n        assert_eq!(processor.added_tokens(true), 3);\n\n        use crate::Token;\n        let encoding = Encoding::from_tokens(\n            vec![\n                Token::new(12, \"Hello\".into(), (0, 5)),\n                Token::new(14, \"there\".into(), (6, 11)),\n            ],\n            0,\n        );\n        let pair = Encoding::from_tokens(vec![Token::new(15, \"pair\".into(), (0, 4))], 0);\n        let single_encoding = processor.process(encoding.clone(), None, true).unwrap();\n        assert_eq!(\n            single_encoding,\n            Encoding::new(\n                vec![101, 12, 14, 102],\n                vec![0, 0, 0, 0],\n                vec![\n                    \"[CLS]\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"[SEP]\".into()\n                ],\n                vec![None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0)],\n                vec![1, 0, 0, 1],\n                vec![1, 1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 1..3)]),\n            )\n        );\n        assert_eq!(single_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(single_encoding.token_to_sequence(3), None);\n        let pair_encoding = processor\n            .process(encoding.clone(), Some(pair.clone()), true)\n            .unwrap();\n        assert_eq!(\n            pair_encoding,\n            Encoding::new(\n                vec![101, 12, 14, 102, 15, 102],\n                vec![0, 0, 0, 0, 1, 1],\n                vec![\n                    \"[CLS]\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"[SEP]\".into(),\n                    \"pair\".into(),\n                    \"[SEP]\".into()\n                ],\n                vec![None, None, None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0), (0, 4), (0, 0)],\n                vec![1, 0, 0, 1, 0, 1],\n                vec![1, 1, 1, 1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 1..3), (1, 4..5)]),\n            )\n        );\n        assert_eq!(pair_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(3), None);\n        assert_eq!(pair_encoding.token_to_sequence(4), Some(1));\n        assert_eq!(pair_encoding.token_to_sequence(5), None);\n\n        // No special tokens\n        let pair_encoding = processor.process(encoding, Some(pair), false).unwrap();\n        assert_eq!(\n            pair_encoding,\n            Encoding::new(\n                vec![12, 14, 15],\n                vec![0, 0, 1],\n                vec![\"Hello\".into(), \"there\".into(), \"pair\".into(),],\n                vec![None, None, None],\n                vec![(0, 5), (6, 11), (0, 4)],\n                vec![0, 0, 0],\n                vec![1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 0..2), (1, 2..3)]),\n            )\n        );\n        assert_eq!(pair_encoding.token_to_sequence(0), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(1), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(2), Some(1));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/processors/mod.rs",
    "content": "pub mod bert;\npub mod roberta;\npub mod sequence;\npub mod template;\n\n// Re-export these as processors\npub use super::pre_tokenizers::byte_level;\n\nuse serde::{Deserialize, Serialize};\n\nuse crate::pre_tokenizers::byte_level::ByteLevel;\nuse crate::processors::bert::BertProcessing;\nuse crate::processors::roberta::RobertaProcessing;\nuse crate::processors::sequence::Sequence;\nuse crate::processors::template::TemplateProcessing;\nuse crate::{Encoding, PostProcessor, Result};\n\n#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Eq)]\n#[serde(untagged)]\npub enum PostProcessorWrapper {\n    // Roberta must be before Bert for deserialization (serde does not validate tags)\n    Roberta(RobertaProcessing),\n    Bert(BertProcessing),\n    ByteLevel(ByteLevel),\n    Template(TemplateProcessing),\n    Sequence(Sequence),\n}\n\nimpl PostProcessor for PostProcessorWrapper {\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        match self {\n            Self::Bert(bert) => bert.added_tokens(is_pair),\n            Self::ByteLevel(bl) => bl.added_tokens(is_pair),\n            Self::Roberta(roberta) => roberta.added_tokens(is_pair),\n            Self::Template(template) => template.added_tokens(is_pair),\n            Self::Sequence(bl) => bl.added_tokens(is_pair),\n        }\n    }\n\n    fn process_encodings(\n        &self,\n        encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        match self {\n            Self::Bert(bert) => bert.process_encodings(encodings, add_special_tokens),\n            Self::ByteLevel(bl) => bl.process_encodings(encodings, add_special_tokens),\n            Self::Roberta(roberta) => roberta.process_encodings(encodings, add_special_tokens),\n            Self::Template(template) => template.process_encodings(encodings, add_special_tokens),\n            Self::Sequence(bl) => bl.process_encodings(encodings, add_special_tokens),\n        }\n    }\n}\n\nimpl_enum_from!(BertProcessing, PostProcessorWrapper, Bert);\nimpl_enum_from!(ByteLevel, PostProcessorWrapper, ByteLevel);\nimpl_enum_from!(RobertaProcessing, PostProcessorWrapper, Roberta);\nimpl_enum_from!(TemplateProcessing, PostProcessorWrapper, Template);\nimpl_enum_from!(Sequence, PostProcessorWrapper, Sequence);\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn deserialize_bert_roberta_correctly() {\n        let roberta = RobertaProcessing::default();\n        let roberta_r = r#\"{\n            \"type\":\"RobertaProcessing\",\n            \"sep\":[\"</s>\",2],\n            \"cls\":[\"<s>\",0],\n            \"trim_offsets\":true,\n            \"add_prefix_space\":true\n        }\"#\n        .replace(char::is_whitespace, \"\");\n        assert_eq!(serde_json::to_string(&roberta).unwrap(), roberta_r);\n        assert_eq!(\n            serde_json::from_str::<PostProcessorWrapper>(&roberta_r).unwrap(),\n            PostProcessorWrapper::Roberta(roberta)\n        );\n\n        let bert = BertProcessing::default();\n        let bert_r = r#\"{\"type\":\"BertProcessing\",\"sep\":[\"[SEP]\",102],\"cls\":[\"[CLS]\",101]}\"#;\n        assert_eq!(serde_json::to_string(&bert).unwrap(), bert_r);\n        assert_eq!(\n            serde_json::from_str::<PostProcessorWrapper>(bert_r).unwrap(),\n            PostProcessorWrapper::Bert(bert)\n        );\n    }\n\n    #[test]\n    fn post_processor_deserialization_no_type() {\n        let json = r#\"{\"add_prefix_space\": true, \"trim_offsets\": false, \"use_regex\": false}\"#;\n        let reconstructed = serde_json::from_str::<PostProcessorWrapper>(json);\n        match reconstructed {\n            Err(err) => assert_eq!(\n                err.to_string(),\n                \"data did not match any variant of untagged enum PostProcessorWrapper\"\n            ),\n            _ => panic!(\"Expected an error here\"),\n        }\n\n        let json = r#\"{\"sep\":[\"[SEP]\",102],\"cls\":[\"[CLS]\",101]}\"#;\n        let reconstructed = serde_json::from_str::<PostProcessorWrapper>(json);\n        assert!(matches!(\n            reconstructed.unwrap(),\n            PostProcessorWrapper::Bert(_)\n        ));\n\n        let json =\n            r#\"{\"sep\":[\"</s>\",2], \"cls\":[\"<s>\",0], \"trim_offsets\":true, \"add_prefix_space\":true}\"#;\n        let reconstructed = serde_json::from_str::<PostProcessorWrapper>(json);\n        assert!(matches!(\n            reconstructed.unwrap(),\n            PostProcessorWrapper::Roberta(_)\n        ));\n\n        let json = r#\"{\"type\":\"RobertaProcessing\", \"sep\":[\"</s>\",2] }\"#;\n        let reconstructed = serde_json::from_str::<PostProcessorWrapper>(json);\n        match reconstructed {\n            Err(err) => assert_eq!(\n                err.to_string(),\n                \"data did not match any variant of untagged enum PostProcessorWrapper\"\n            ),\n            _ => panic!(\"Expected an error here\"),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/processors/roberta.rs",
    "content": "use crate::processors::byte_level::process_offsets;\nuse crate::tokenizer::{Encoding, PostProcessor, Result};\nuse ahash::AHashMap;\nuse serde::{Deserialize, Serialize};\nuse std::iter::FromIterator;\n\n#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]\n#[serde(tag = \"type\")]\npub struct RobertaProcessing {\n    pub sep: (String, u32),\n    pub cls: (String, u32),\n    pub trim_offsets: bool,\n    pub add_prefix_space: bool,\n}\n\nimpl Default for RobertaProcessing {\n    fn default() -> Self {\n        Self {\n            sep: (\"</s>\".into(), 2),\n            cls: (\"<s>\".into(), 0),\n            trim_offsets: true,\n            add_prefix_space: true,\n        }\n    }\n}\n\nimpl RobertaProcessing {\n    pub fn new(sep: (String, u32), cls: (String, u32)) -> Self {\n        Self {\n            sep,\n            cls,\n            ..Default::default()\n        }\n    }\n\n    #[must_use]\n    pub fn trim_offsets(mut self, v: bool) -> Self {\n        self.trim_offsets = v;\n        self\n    }\n\n    #[must_use]\n    pub fn add_prefix_space(mut self, v: bool) -> Self {\n        self.add_prefix_space = v;\n        self\n    }\n\n    pub fn get_sep_copy(&self) -> (String, u32) {\n        (self.sep.0.clone(), self.sep.1)\n    }\n\n    pub fn get_cls_copy(&self) -> (String, u32) {\n        (self.cls.0.clone(), self.cls.1)\n    }\n}\n\nimpl PostProcessor for RobertaProcessing {\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        if is_pair {\n            4\n        } else {\n            2\n        }\n    }\n\n    fn process_encodings(\n        &self,\n        mut encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        if self.trim_offsets {\n            for encoding in encodings.iter_mut() {\n                process_offsets(encoding, self.add_prefix_space);\n                encoding\n                    .get_overflowing_mut()\n                    .iter_mut()\n                    .for_each(|encoding| process_offsets(encoding, self.add_prefix_space));\n            }\n        }\n\n        // Roberta is weird, and every encoding is type_id=0.\n        encodings\n            .iter_mut()\n            .for_each(|encoding| encoding.set_type_ids(vec![0; encoding.len()]));\n\n        if !add_special_tokens {\n            return Ok(encodings);\n        }\n\n        let encodings: Vec<Encoding> = encodings\n            .iter_mut()\n            .enumerate()\n            .map(|(i, encoding)| {\n                if i == 0 {\n                    let ids = [&[self.cls.1], encoding.get_ids(), &[self.sep.1]].concat();\n                    let type_ids = [&[0], encoding.get_type_ids(), &[0]].concat();\n                    let tokens = [\n                        std::slice::from_ref(&self.cls.0),\n                        encoding.get_tokens(),\n                        std::slice::from_ref(&self.sep.0),\n                    ]\n                    .concat();\n                    let words = [&[None], encoding.get_word_ids(), &[None]].concat();\n                    let offsets = [&[(0, 0)], encoding.get_offsets(), &[(0, 0)]].concat();\n                    let special_tokens =\n                        [&[1u32], &vec![0; encoding.get_ids().len()][..], &[1]].concat();\n                    let attention_mask = vec![1; ids.len()];\n\n                    // For compatibility with `TemplateProcessing`, the sequence_ranges shouldn't contain\n                    // the special tokens.\n                    let sequence_ranges = AHashMap::from_iter(vec![(0, 1..ids.len() - 1)]);\n                    Encoding::new(\n                        ids,\n                        type_ids,\n                        tokens,\n                        words,\n                        offsets,\n                        special_tokens,\n                        attention_mask,\n                        encoding\n                            .take_overflowing()\n                            .into_iter()\n                            .map(|encoding| {\n                                let ids =\n                                    [&[self.cls.1], encoding.get_ids(), &[self.sep.1]].concat();\n                                let type_ids = vec![0; encoding.get_ids().len() + 2];\n                                let tokens = [\n                                    std::slice::from_ref(&self.cls.0),\n                                    encoding.get_tokens(),\n                                    std::slice::from_ref(&self.sep.0),\n                                ]\n                                .concat();\n                                let words = [&[None], encoding.get_word_ids(), &[None]].concat();\n                                let offsets =\n                                    [&[(0, 0)], encoding.get_offsets(), &[(0, 0)]].concat();\n                                let special_tokens =\n                                    [&[1u32], &vec![0; encoding.get_ids().len()][..], &[1]]\n                                        .concat();\n                                let attention_mask = vec![1; ids.len()];\n\n                                // For compatibility with `TemplateProcessing`, the sequence_ranges shouldn't\n                                // contain the special tokens.\n                                let sequence_ranges =\n                                    AHashMap::from_iter(vec![(0, 1..ids.len() - 1)]);\n                                Encoding::new(\n                                    ids,\n                                    type_ids,\n                                    tokens,\n                                    words,\n                                    offsets,\n                                    special_tokens,\n                                    attention_mask,\n                                    vec![],\n                                    sequence_ranges,\n                                )\n                            })\n                            .collect(),\n                        sequence_ranges,\n                    )\n                } else {\n                    let pair_ids = [&[self.sep.1], encoding.get_ids(), &[self.sep.1]].concat();\n                    let pair_type_ids = vec![0; encoding.get_ids().len() + 2];\n                    let pair_tokens = [\n                        std::slice::from_ref(&self.sep.0),\n                        encoding.get_tokens(),\n                        std::slice::from_ref(&self.sep.0),\n                    ]\n                    .concat();\n                    let pair_words = [&[None], encoding.get_word_ids(), &[None]].concat();\n                    let pair_offsets = [&[(0, 0)], encoding.get_offsets(), &[(0, 0)]].concat();\n                    let pair_special_tokens =\n                        [&[1], &vec![0u32; encoding.get_type_ids().len()][..], &[1]].concat();\n                    let pair_attention_mask = vec![1; pair_ids.len()];\n\n                    // For compatibility with `TemplateProcessing`, the sequence_ranges shouldn't contain\n                    // the special tokens.\n                    let pair_sequence_ranges =\n                        AHashMap::from_iter(vec![(1, 1..pair_ids.len() - 1)]);\n                    Encoding::new(\n                        pair_ids,\n                        pair_type_ids,\n                        pair_tokens,\n                        pair_words,\n                        pair_offsets,\n                        pair_special_tokens,\n                        pair_attention_mask,\n                        encoding\n                            .take_overflowing()\n                            .into_iter()\n                            .map(|encoding| {\n                                let pair_ids =\n                                    [&[self.sep.1], encoding.get_ids(), &[self.sep.1]].concat();\n                                let pair_type_ids = vec![0; encoding.get_ids().len() + 2];\n                                let pair_tokens = [\n                                    std::slice::from_ref(&self.sep.0),\n                                    encoding.get_tokens(),\n                                    std::slice::from_ref(&self.sep.0),\n                                ]\n                                .concat();\n                                let pair_words =\n                                    [&[None], encoding.get_word_ids(), &[None]].concat();\n                                let pair_offsets =\n                                    [&[(0, 0)], encoding.get_offsets(), &[(0, 0)]].concat();\n                                let pair_special_tokens =\n                                    [&[1], &vec![0u32; encoding.get_type_ids().len()][..], &[1]]\n                                        .concat();\n                                let pair_attention_mask = vec![1; pair_ids.len()];\n\n                                // For compatibility with `TemplateProcessing`, the sequence_ranges\n                                // shouldn't contain the special tokens.\n                                let pair_sequence_ranges =\n                                    AHashMap::from_iter(vec![(1, 1..pair_ids.len() - 1)]);\n                                Encoding::new(\n                                    pair_ids,\n                                    pair_type_ids,\n                                    pair_tokens,\n                                    pair_words,\n                                    pair_offsets,\n                                    pair_special_tokens,\n                                    pair_attention_mask,\n                                    vec![],\n                                    pair_sequence_ranges,\n                                )\n                            })\n                            .collect(),\n                        pair_sequence_ranges,\n                    )\n                }\n            })\n            .collect();\n\n        Ok(encodings)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn serde() {\n        let roberta = RobertaProcessing::default();\n        let roberta_r = r#\"{\n            \"type\":\"RobertaProcessing\",\n            \"sep\":[\"</s>\",2],\n            \"cls\":[\"<s>\",0],\n            \"trim_offsets\":true,\n            \"add_prefix_space\":true\n        }\"#\n        .replace(char::is_whitespace, \"\");\n        assert_eq!(serde_json::to_string(&roberta).unwrap(), roberta_r);\n        assert_eq!(\n            serde_json::from_str::<RobertaProcessing>(&roberta_r).unwrap(),\n            roberta\n        );\n    }\n\n    #[test]\n    fn roberta_processing() {\n        let processor = RobertaProcessing::default();\n        assert_eq!(processor.added_tokens(false), 2);\n        assert_eq!(processor.added_tokens(true), 4);\n\n        use crate::Token;\n        let encoding = Encoding::from_tokens(\n            vec![\n                Token::new(12, \"Hello\".into(), (0, 5)),\n                Token::new(14, \"there\".into(), (6, 11)),\n            ],\n            0,\n        );\n        let pair = Encoding::from_tokens(vec![Token::new(15, \"pair\".into(), (0, 4))], 0);\n        let single_encoding = processor.process(encoding.clone(), None, true).unwrap();\n        assert_eq!(\n            single_encoding,\n            Encoding::new(\n                vec![0, 12, 14, 2],\n                vec![0, 0, 0, 0],\n                vec![\"<s>\".into(), \"Hello\".into(), \"there\".into(), \"</s>\".into()],\n                vec![None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0)],\n                vec![1, 0, 0, 1],\n                vec![1, 1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 1..3)]),\n            )\n        );\n        assert_eq!(single_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(single_encoding.token_to_sequence(3), None);\n        let pair_encoding = processor\n            .process(encoding.clone(), Some(pair.clone()), true)\n            .unwrap();\n        assert_eq!(\n            pair_encoding,\n            Encoding::new(\n                vec![0, 12, 14, 2, 2, 15, 2],\n                vec![0, 0, 0, 0, 0, 0, 0],\n                vec![\n                    \"<s>\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"</s>\".into(),\n                    \"</s>\".into(),\n                    \"pair\".into(),\n                    \"</s>\".into()\n                ],\n                vec![None, None, None, None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0), (0, 0), (0, 4), (0, 0)],\n                vec![1, 0, 0, 1, 1, 0, 1],\n                vec![1, 1, 1, 1, 1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 1..3), (1, 5..6)]),\n            )\n        );\n        assert_eq!(pair_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(3), None);\n        assert_eq!(pair_encoding.token_to_sequence(4), None);\n        assert_eq!(pair_encoding.token_to_sequence(5), Some(1));\n        assert_eq!(pair_encoding.token_to_sequence(6), None);\n\n        // No special tokens\n        let pair_encoding = processor.process(encoding, Some(pair), false).unwrap();\n        assert_eq!(\n            pair_encoding,\n            Encoding::new(\n                vec![12, 14, 15],\n                vec![0, 0, 0],\n                vec![\"Hello\".into(), \"there\".into(), \"pair\".into(),],\n                vec![None, None, None],\n                vec![(0, 5), (6, 11), (0, 4)],\n                vec![0, 0, 0],\n                vec![1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 0..2), (1, 2..3)]),\n            )\n        );\n        assert_eq!(pair_encoding.token_to_sequence(0), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(1), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(2), Some(1));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/processors/sequence.rs",
    "content": "use crate::processors::PostProcessorWrapper;\nuse crate::tokenizer::{Encoding, PostProcessor, Result};\nuse crate::utils::macro_rules_attribute;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Clone, Debug, PartialEq, Eq)]\n#[macro_rules_attribute(impl_serde_type!)]\npub struct Sequence {\n    processors: Vec<PostProcessorWrapper>,\n}\n\nimpl Sequence {\n    pub fn new(processors: Vec<PostProcessorWrapper>) -> Self {\n        Self { processors }\n    }\n\n    pub fn get(&self, index: usize) -> Option<&PostProcessorWrapper> {\n        self.processors.get(index)\n    }\n\n    pub fn get_mut(&mut self, index: usize) -> Option<&mut PostProcessorWrapper> {\n        self.processors.get_mut(index)\n    }\n\n    pub fn set_mut(&mut self, index: usize, post_proc: PostProcessorWrapper) {\n        self.processors[index] = post_proc;\n    }\n}\n\nimpl AsRef<[PostProcessorWrapper]> for Sequence {\n    fn as_ref(&self) -> &[PostProcessorWrapper] {\n        &self.processors\n    }\n}\n\nimpl AsMut<[PostProcessorWrapper]> for Sequence {\n    fn as_mut(&mut self) -> &mut [PostProcessorWrapper] {\n        &mut self.processors\n    }\n}\n\nimpl IntoIterator for Sequence {\n    type Item = PostProcessorWrapper;\n    type IntoIter = std::vec::IntoIter<Self::Item>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        self.processors.into_iter()\n    }\n}\n\nimpl PostProcessor for Sequence {\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        self.processors\n            .iter()\n            .map(|p| p.added_tokens(is_pair))\n            .sum::<usize>()\n    }\n\n    fn process_encodings(\n        &self,\n        mut encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        for processor in &self.processors {\n            encodings = processor.process_encodings(encodings, add_special_tokens)?;\n        }\n        Ok(encodings)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::processors::{ByteLevel, PostProcessorWrapper};\n    use crate::tokenizer::{Encoding, PostProcessor};\n    use ahash::AHashMap;\n    use std::iter::FromIterator;\n\n    #[test]\n    fn process_chain() {\n        let start = Encoding::new(\n            vec![0; 5],\n            vec![0; 5],\n            vec![\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n            ],\n            vec![],\n            vec![(0, 1), (0, 11), (11, 18), (18, 25), (25, 29)],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::new(),\n        );\n\n        let bytelevel = ByteLevel::default().trim_offsets(true);\n        let sequence = Sequence::new(vec![PostProcessorWrapper::ByteLevel(bytelevel)]);\n        let expected = Encoding::new(\n            vec![0; 5],\n            vec![0; 5],\n            vec![\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n            ],\n            vec![],\n            vec![(0, 0), (4, 9), (13, 18), (18, 23), (29, 29)],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::from_iter(vec![(0, 0..5)]),\n        );\n\n        assert_eq!(\n            expected,\n            bytelevel.process(start.clone(), None, false).unwrap()\n        );\n        assert_eq!(\n            expected,\n            sequence.process(start.clone(), None, false).unwrap()\n        );\n\n        let pair_expected = Encoding::new(\n            vec![0; 10],\n            vec![0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n            vec![\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n                \"Ġ\".into(),\n                \"ĠĠĠĠHelloĠĠ\".into(),\n                \"ĠĠHello\".into(),\n                \"HelloĠĠ\".into(),\n                \"ĠĠĠĠ\".into(),\n            ],\n            vec![],\n            vec![\n                (0, 0),\n                (4, 9),\n                (13, 18),\n                (18, 23),\n                (29, 29),\n                (0, 0),\n                (4, 9),\n                (13, 18),\n                (18, 23),\n                (29, 29),\n            ],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::from_iter(vec![(0, 0..5), (1, 5..10)]),\n        );\n        assert_eq!(\n            pair_expected,\n            bytelevel\n                .process(start.clone(), Some(start.clone()), false)\n                .unwrap()\n        );\n        assert_eq!(\n            pair_expected,\n            sequence.process(start.clone(), Some(start), false).unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/processors/template.rs",
    "content": "//! # Template Processing\n//!\n//! Provides a way to specify templates in order to add the special tokens to each\n//! input sequence as relevant.\n//!\n//! ## Example\n//!\n//! Let's take `BERT` tokenizer as an example. It uses two special tokens, used to\n//! delimitate each sequence. `[CLS]` is always used at the beginning of the first\n//! sequence, and `[SEP]` is added at the end of both the first, and the pair\n//! sequences. The final result looks like this:\n//! - Single sequence: `[CLS] Hello there [SEP]`\n//! - Pair sequences: `[CLS] My name is Anthony [SEP] What is my name? [SEP]`\n//!\n//! With the type ids as following:\n//! ```markdown\n//! [CLS]   ...   [SEP]   ...   [SEP]\n//!   0      0      0      1      1\n//! ```\n//!\n//! So, we can define a [`TemplateProcessing`] that will achieve this result:\n//! ```\n//! # use tokenizers::processors::template::TemplateProcessing;\n//! let template = TemplateProcessing::builder()\n//!     // The template when we only have a single sequence:\n//!     .try_single(vec![\"[CLS]\", \"$0\", \"[SEP]\"]).unwrap()\n//!     // Same as:\n//!     .try_single(\"[CLS] $0 [SEP]\").unwrap()\n//!\n//!     // The template when we have both sequences:\n//!     .try_pair(vec![\"[CLS]:0\", \"$A:0\", \"[SEP]:0\", \"$B:1\", \"[SEP]:1\"]).unwrap()\n//!     // Same as:\n//!     .try_pair(\"[CLS]:0 $A:0 [SEP]:0 $B:1 [SEP]:1\").unwrap()\n//!     // Or:\n//!     .try_pair(\"[CLS] $0 [SEP] $B:1 [SEP]:1\").unwrap()\n//!\n//!     // The list of special tokens used by each sequences\n//!     .special_tokens(vec![(\"[CLS]\", 1), (\"[SEP]\", 0)])\n//!     .build()\n//!     .unwrap();\n//! ```\n//!\n//! In this example, each input sequence is identified using a `$` construct. This identifier\n//! lets us specify each input sequence, and the type_id to use. When nothing is specified,\n//! it uses the default values. Here are the different ways to specify it:\n//! - Specifying the sequence, with default `type_id == 0`: `$A` or `$B`\n//! - Specifying the `type_id` with default `sequence == A`: `$0`, `$1`, `$2`, ...\n//! - Specifying both: `$A:0`, `$B:1`, ...\n//!\n//! The same construct is used for special tokens: `<identifier>(:<type_id>)?`.\n//!\n//! **Warning**: You must ensure that you are giving the correct tokens/ids as these will\n//! be added to the `Encoding` without any further check. If the given ids correspond to\n//! something totally different in a `Tokenizer` using this `PostProcessor`, it might lead\n//! to unexpected results.\n//!\n//! [`TemplateProcessing`]: struct.TemplateProcessing.html\n//!\nuse crate::{Encoding, PostProcessor, Result};\nuse ahash::{AHashMap, AHashSet};\nuse itertools::Itertools;\nuse serde::{Deserialize, Serialize};\nuse std::convert::{TryFrom, TryInto};\nuse std::result::Result as StdResult;\n\n/// Represents any sequences received as input of the PostProcessor\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\npub enum Sequence {\n    /// This is the first sequence, the one that is always specified\n    A,\n    /// This is the pair sequence, that is optional\n    B,\n}\n\n/// Represents the different kind of pieces that constitute a template.\n/// It can be either the input sequence or a [`SpecialToken`]:\n///\n/// - The `Sequence` has an associated `type_id` which is used by default\n///   for any token inside this sequence. The `Sequence` corresponds to one\n///   of the input sequence given as input of the `PostProcessor`.\n///\n/// - The `SpecialToken` has an associated `id`. It corresponds to a [`SpecialToken`].\n///\n/// The easiest way to build a `Piece` is actually by converting it from a string:\n/// ```\n/// # use tokenizers::processors::template::Piece;\n/// # use std::convert::TryFrom;\n/// let sequence_with_type_id_0 = Piece::try_from(\"$0\").unwrap();\n/// let sequence_with_type_id_1 = Piece::try_from(\"$1\").unwrap();\n/// let special_token_cls = Piece::try_from(\"[CLS]\").unwrap();\n/// ```\n///\n/// [`SpecialToken`]: struct.SpecialToken.html\n///\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\npub enum Piece {\n    Sequence { id: Sequence, type_id: u32 },\n    SpecialToken { id: String, type_id: u32 },\n}\n\nimpl Piece {\n    fn extract_id(s: &str) -> Option<Self> {\n        if s.starts_with('$') {\n            let rest = &s['$'.len_utf8()..];\n\n            // If the id is just `$`, we use 0 as type_id, and Sequence A\n            match rest {\n                \"\" => Some(Self::Sequence {\n                    id: Sequence::A,\n                    type_id: 0,\n                }),\n                \"A\" | \"a\" => Some(Self::Sequence {\n                    id: Sequence::A,\n                    type_id: 0,\n                }),\n                \"B\" | \"b\" => Some(Self::Sequence {\n                    id: Sequence::B,\n                    type_id: 0,\n                }),\n                n => {\n                    if let Ok(type_id) = n.parse::<u32>() {\n                        Some(Self::Sequence {\n                            id: Sequence::A,\n                            type_id,\n                        })\n                    } else {\n                        None\n                    }\n                }\n            }\n        } else {\n            Some(Self::SpecialToken {\n                id: s.to_owned(),\n                type_id: 0,\n            })\n        }\n    }\n\n    fn with_type_id(self, type_id: u32) -> Self {\n        match self {\n            Self::Sequence { id, .. } => Self::Sequence { id, type_id },\n            Self::SpecialToken { id, .. } => Self::SpecialToken { id, type_id },\n        }\n    }\n}\n\nimpl TryFrom<String> for Piece {\n    type Error = String;\n\n    fn try_from(s: String) -> StdResult<Self, Self::Error> {\n        let parts = s.split(':').collect::<Vec<_>>();\n\n        let err = || format!(\"Cannot build Piece from string \\\"{s}\\\"\");\n        match parts.as_slice() {\n            [id, type_id] => {\n                let type_id: u32 = type_id.parse().map_err(|_| err())?;\n                let piece = Self::extract_id(id).ok_or_else(err)?;\n                Ok(piece.with_type_id(type_id))\n            }\n            [id] => Self::extract_id(id).ok_or_else(err),\n            _ => Err(err()),\n        }\n    }\n}\n\nimpl TryFrom<&str> for Piece {\n    type Error = String;\n\n    fn try_from(s: &str) -> StdResult<Self, Self::Error> {\n        Piece::try_from(s.to_owned())\n    }\n}\n\n/// Represents a bunch of tokens to be used in a template.\n/// Usually, special tokens have only one associated id/token but in\n/// some cases, it might be interesting to have multiple ids/tokens.\n///\n/// # Examples\n/// ```\n/// # use tokenizers::processors::template::SpecialToken;\n/// // Simple cases, where a single id/token is necessary:\n/// let cls = SpecialToken::from((\"[CLS]\", 1));\n/// let sep = SpecialToken::from((0, \"[SEP]\")); // The order in the tuple is not important\n///\n/// // More complex case with multiple values:\n/// let complex = SpecialToken::new(\n///     \"A complex special token:\".into(),\n///     vec![0, 1, 2, 3, 4],\n///     vec![\"A\".into(), \"complex\".into(), \"special\".into(), \"token\".into(), \":\".into()]\n/// ).unwrap();\n/// ```\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\npub struct SpecialToken {\n    /// A unique id used to identify this SpecialToken in the template\n    id: String,\n    /// The list of associated ids\n    ids: Vec<u32>,\n    /// The list of associated tokens\n    tokens: Vec<String>,\n}\n\nimpl From<(String, u32)> for SpecialToken {\n    fn from(v: (String, u32)) -> Self {\n        Self {\n            id: v.0.clone(),\n            ids: vec![v.1],\n            tokens: vec![v.0],\n        }\n    }\n}\nimpl From<(&str, u32)> for SpecialToken {\n    fn from(v: (&str, u32)) -> Self {\n        Self::from((v.0.to_owned(), v.1))\n    }\n}\nimpl From<(u32, String)> for SpecialToken {\n    fn from(v: (u32, String)) -> Self {\n        Self::from((v.1, v.0))\n    }\n}\nimpl From<(u32, &str)> for SpecialToken {\n    fn from(v: (u32, &str)) -> Self {\n        Self::from((v.1.to_owned(), v.0))\n    }\n}\n\nimpl SpecialToken {\n    pub fn new(id: String, ids: Vec<u32>, tokens: Vec<String>) -> Result<Self> {\n        if ids.len() != tokens.len() {\n            Err(\"SpecialToken: ids and tokens must be of the same length\".into())\n        } else {\n            Ok(Self { id, ids, tokens })\n        }\n    }\n}\n\n/// A Template represents a Vec<[`Piece`]>.\n///\n/// We can easily build one as follows\n/// ```\n/// # use tokenizers::processors::template::Template;\n/// # use std::convert::TryFrom;\n/// // By providing a `String` or `&str`, we just split on whitespaces:\n/// let template = Template::try_from(\"[CLS] $0 [SEP]\").unwrap();\n///\n/// // By providing pieces directly:\n/// let template = Template::try_from(vec![\"[CLS]\", \"$0\", \"[SEP]\"]).unwrap();\n/// ```\n/// Both of these methods give the same result.\n///\n/// [`Piece`]: enum.Piece.html\n///\n#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq)]\n#[serde(transparent)]\npub struct Template(Vec<Piece>);\n\nimpl<T> TryFrom<Vec<T>> for Template\nwhere\n    T: TryInto<Piece, Error = String>,\n{\n    type Error = String;\n\n    fn try_from(v: Vec<T>) -> StdResult<Self, Self::Error> {\n        Ok(Self(\n            v.into_iter()\n                .map(|p| p.try_into())\n                .collect::<StdResult<Vec<_>, Self::Error>>()?,\n        ))\n    }\n}\n\nimpl TryFrom<String> for Template {\n    type Error = String;\n\n    fn try_from(s: String) -> StdResult<Self, Self::Error> {\n        Self::try_from(s.as_ref())\n    }\n}\n\nimpl TryFrom<&str> for Template {\n    type Error = String;\n\n    fn try_from(s: &str) -> StdResult<Self, Self::Error> {\n        Self::try_from(s.split(' ').collect::<Vec<_>>())\n    }\n}\n\n/// A bunch of [`SpecialToken`] represented by their ID.\n/// Internally, `Tokens` is a `HashMap<String, SpecialToken>` and can be built\n/// from a HashMap or a Vec<[`SpecialToken`]>.\n///\n/// [`SpecialToken`]: struct.SpecialToken.html\n#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, Eq)]\n#[serde(transparent)]\npub struct Tokens(\n    #[serde(serialize_with = \"crate::utils::ordered_map\")] pub AHashMap<String, SpecialToken>,\n);\n\nimpl<T: Into<SpecialToken>> From<Vec<T>> for Tokens {\n    fn from(v: Vec<T>) -> Self {\n        Self(\n            v.into_iter()\n                .map(|t| {\n                    let token: SpecialToken = t.into();\n                    (token.id.clone(), token)\n                })\n                .collect(),\n        )\n    }\n}\n\nimpl From<AHashMap<String, SpecialToken>> for Tokens {\n    fn from(v: AHashMap<String, SpecialToken>) -> Self {\n        Self(v)\n    }\n}\n\n/// This PostProcessor takes care of processing each input `Encoding` by applying\n/// the corresponding template, before merging them in the final Encoding.\n///\n/// A `Template` is actually a sequence of `Piece` that will be\n/// concatenated together in the given order. Each `Piece` represents either\n/// one of the input `Encoding` or a `SpecialToken`.\n///\n/// ## Example\n/// ```\n/// # use tokenizers::processors::template::TemplateProcessing;\n/// let template = TemplateProcessing::builder()\n///     .try_single(\"[CLS] $A [SEP]\").unwrap()\n///     .try_pair(\"[CLS] $A [SEP] $B:1 [SEP]:1\").unwrap()\n///     .special_tokens(vec![(\"[CLS]\", 1), (\"[SEP]\", 0)])\n///     .build()\n///     .unwrap();\n/// ```\n///\n#[derive(Debug, Clone, PartialEq, Builder, Serialize, Deserialize, Eq)]\n#[serde(tag = \"type\", from = \"TemplateProcessingDeserializer\")]\n#[builder(build_fn(validate = \"Self::validate\"))]\npub struct TemplateProcessing {\n    #[builder(try_setter, default = \"\\\"$0\\\".try_into().unwrap()\")]\n    pub single: Template,\n    #[builder(try_setter, default = \"\\\"$A:0 $B:1\\\".try_into().unwrap()\")]\n    pair: Template,\n    #[builder(setter(skip), default = \"self.default_added(true)\")]\n    #[serde(skip)]\n    added_single: usize,\n    #[builder(setter(skip), default = \"self.default_added(false)\")]\n    #[serde(skip)]\n    added_pair: usize,\n    #[builder(setter(into), default)]\n    special_tokens: Tokens,\n}\n\nimpl TemplateProcessing {\n    // Getter for `single`\n    pub fn get_single(&self) -> String {\n        format!(\"{:?}\", self.single)\n    }\n\n    // Setter for `single`\n    pub fn set_single(&mut self, single: Template) {\n        self.single = single;\n    }\n\n    // Getter for `pair`\n    pub fn get_pair(&self) -> &Template {\n        &self.pair\n    }\n\n    // Setter for `pair`\n    pub fn set_pair(&mut self, pair: Template) {\n        self.pair = pair;\n    }\n\n    // Getter for `added_single`\n    pub fn get_added_single(&self) -> usize {\n        self.added_single\n    }\n\n    // Setter for `added_single`\n    pub fn set_added_single(&mut self, added_single: usize) {\n        self.added_single = added_single;\n    }\n\n    // Getter for `added_pair`\n    pub fn get_added_pair(&self) -> usize {\n        self.added_pair\n    }\n\n    // Setter for `added_pair`\n    pub fn set_added_pair(&mut self, added_pair: usize) {\n        self.added_pair = added_pair;\n    }\n\n    // Getter for `special_tokens`\n    pub fn get_special_tokens(&self) -> &Tokens {\n        &self.special_tokens\n    }\n\n    // Setter for `special_tokens`\n    pub fn set_special_tokens(&mut self, special_tokens: Tokens) {\n        self.special_tokens = special_tokens;\n    }\n}\n\nimpl From<&str> for TemplateProcessingBuilderError {\n    fn from(e: &str) -> Self {\n        e.to_string().into()\n    }\n}\n\nimpl PartialEq for TemplateProcessingBuilderError {\n    fn eq(&self, other: &Self) -> bool {\n        self.to_string() == other.to_string()\n    }\n}\n\n/// We use this custom deserializer to provided the values for `added_single`\n/// and `added_pair` during deserialization, while not having to serialize them\n#[doc(hidden)]\n#[derive(Deserialize)]\n#[serde(tag = \"type\")]\nstruct TemplateProcessingDeserializer {\n    single: Template,\n    pair: Template,\n    special_tokens: Tokens,\n}\nimpl From<TemplateProcessingDeserializer> for TemplateProcessing {\n    fn from(t: TemplateProcessingDeserializer) -> Self {\n        let added_single = count_added(&t.single, Some(&t.special_tokens));\n        let added_pair = count_added(&t.pair, Some(&t.special_tokens));\n        Self {\n            single: t.single,\n            pair: t.pair,\n            added_single,\n            added_pair,\n            special_tokens: t.special_tokens,\n        }\n    }\n}\n\n/// Count the number of added tokens in the given template\nfn count_added(container: &Template, special_tokens: Option<&Tokens>) -> usize {\n    container\n        .0\n        .iter()\n        .map(|p| match p {\n            Piece::Sequence { .. } => 0,\n            Piece::SpecialToken { id, .. } => {\n                special_tokens.map_or(0, |spt| spt.0.get(id).map_or(0, |s| s.ids.len()))\n            }\n        })\n        .sum()\n}\n\nimpl TemplateProcessingBuilder {\n    fn default_added(&self, is_single: bool) -> usize {\n        let container = if is_single {\n            self.single.as_ref()\n        } else {\n            self.pair.as_ref()\n        };\n        container.map_or(0, |pieces| {\n            count_added(pieces, self.special_tokens.as_ref())\n        })\n    }\n\n    fn validate(&self) -> std::result::Result<(), String> {\n        let pair_has_both = self.pair.as_ref().is_none_or(|pair| {\n            let mut has_a = false;\n            let mut has_b = false;\n            for piece in &pair.0 {\n                if let Piece::Sequence {\n                    id: Sequence::A, ..\n                } = piece\n                {\n                    has_a = true;\n                }\n                if let Piece::Sequence {\n                    id: Sequence::B, ..\n                } = piece\n                {\n                    has_b = true;\n                }\n            }\n            has_a && has_b\n        });\n        if !pair_has_both {\n            return Err(\"Template for `pair` must use both sequences\".into());\n        }\n\n        let check = |sp| {\n            let exist = self\n                .special_tokens\n                .as_ref()\n                .is_some_and(|map| map.0.contains_key(sp));\n\n            match exist {\n                false => Some(sp),\n                true => None,\n            }\n        };\n\n        let empty = [];\n        let missing: AHashSet<&str> = self\n            .single\n            .as_ref()\n            .map_or(empty.iter(), |s| s.0.iter())\n            .chain(self.pair.as_ref().map_or(empty.iter(), |s| s.0.iter()))\n            .filter_map(|piece| match piece {\n                Piece::Sequence { .. } => None,\n                Piece::SpecialToken { id, .. } => check(id.as_ref()),\n            })\n            .collect::<AHashSet<_>>();\n\n        if missing.is_empty() {\n            Ok(())\n        } else {\n            Err(format!(\n                \"Missing SpecialToken(s) with id(s) `{}`\",\n                missing.iter().join(\", \")\n            ))\n        }\n    }\n}\n\nimpl Default for TemplateProcessing {\n    fn default() -> Self {\n        Self {\n            single: \"$0\".try_into().unwrap(),\n            pair: \"$1\".try_into().unwrap(),\n            added_single: 0,\n            added_pair: 0,\n            special_tokens: Tokens::default(),\n        }\n    }\n}\n\nimpl TemplateProcessing {\n    pub fn builder() -> TemplateProcessingBuilder {\n        TemplateProcessingBuilder::default()\n    }\n\n    fn apply_template(\n        &self,\n        template: &[Piece],\n        mut encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        let final_encodings: Vec<Encoding> = template\n            .iter()\n            .flat_map(|piece| {\n                match piece {\n                    Piece::Sequence { id, type_id } => {\n                        let i = usize::from(*id != Sequence::A);\n                        let encoding = &mut encodings[i];\n                        encoding.set_type_ids(vec![*type_id; encoding.len()]);\n                        encoding.set_sequence_id(i);\n                        Some(encoding.clone())\n                    }\n                    Piece::SpecialToken { id, type_id } => {\n                        if add_special_tokens {\n                            let tok = &self.special_tokens.0[id]; // We already checked existence above\n                            let len = tok.ids.len();\n\n                            let encoding = Encoding::new(\n                                tok.ids.clone(),\n                                std::iter::repeat_n(*type_id, len).collect(),\n                                tok.tokens.clone(),\n                                // words\n                                std::iter::repeat_n(None, len).collect(),\n                                // offsets\n                                std::iter::repeat_n((0, 0), len).collect(),\n                                // special_tokens_mask\n                                std::iter::repeat_n(1, len).collect(),\n                                // attention_mask\n                                std::iter::repeat_n(1, len).collect(),\n                                // overflowing\n                                vec![],\n                                // sequence_range\n                                AHashMap::new(),\n                            );\n                            Some(encoding)\n                        } else {\n                            None\n                        }\n                    }\n                }\n            })\n            .collect();\n\n        //let mut pair = if encodings.len() > 1 {\n        //    Some(encodings.pop().unwrap())\n        //} else {\n        //    None\n        //};\n        //let mut encoding = encodings.pop().unwrap();\n\n        //let pair_overflowing = pair.as_mut().map_or(vec![], |e| e.take_overflowing());\n        //let mut overflowing: Vec<Encoding> = encoding\n        //    .take_overflowing()\n        //    .iter()\n        //    .map(|encoding| -> Result<Vec<Encoding>> {\n        //        // 1. The pair itself\n        //        let mut overflowings = self.apply_template(\n        //            template,\n        //            if encodings.len() > 1 {\n        //                vec![encoding.clone(), encodings[1].clone()]\n        //            } else {\n        //                vec![encoding.clone()]\n        //            },\n        //            add_special_tokens,\n        //        )?;\n\n        //        // 2. Its overflowings\n        //        for other_o in &pair_overflowing {\n        //            overflowings.extend(self.apply_template(\n        //                template,\n        //                vec![encoding.clone(), other_o.clone()],\n        //                add_special_tokens,\n        //            )?);\n        //        }\n\n        //        Ok(overflowings)\n        //    })\n        //    .collect::<Result<Vec<Vec<Encoding>>>>()?\n        //    .into_iter()\n        //    .flatten()\n        //    .collect();\n        //// We also need to combine the first sequence with all other overflowings\n        //overflowing.extend(\n        //    pair_overflowing\n        //        .into_iter()\n        //        .map(|pair| {\n        //            self.apply_template(template, vec![encoding.clone(), pair], add_special_tokens)\n        //        })\n        //        .collect::<Result<Vec<_>>>()?\n        //        .into_iter()\n        //        .flatten(),\n        //);\n\n        Ok(final_encodings)\n    }\n}\n\nimpl PostProcessor for TemplateProcessing {\n    fn added_tokens(&self, is_pair: bool) -> usize {\n        if is_pair {\n            self.added_pair\n        } else {\n            self.added_single\n        }\n    }\n\n    fn process_encodings(\n        &self,\n        encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        // let (encoding, pair): (Encoding, Option<Encoding>) = match encodings.len() {\n        //     1 => (\n        //         encodings\n        //             .pop()\n        //             .ok_or(ProcessorError::InvalidEncodingsVecLength)?,\n        //         None,\n        //     ),\n        //     2 => {\n        //         let pair = encodings\n        //             .pop()\n        //             .ok_or(ProcessorError::InvalidEncodingsVecLength)?;\n        //         let encoding = encodings\n        //             .pop()\n        //             .ok_or(ProcessorError::InvalidEncodingsVecLength)?;\n        //         (encoding, Some(pair))\n        //     }\n        //     _ => return Err(Box::new(ProcessorError::InvalidEncodingsVecLength)),\n        // };\n        let template = match encodings.len() {\n            2 => &self.pair.0,\n            1 => &self.single.0,\n            _ => todo!(),\n        };\n        let encodings = self.apply_template(template, encodings, add_special_tokens)?;\n        Ok(encodings)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::convert::TryInto;\n    use std::iter::FromIterator;\n\n    #[test]\n    fn piece_serde() {\n        let seq_0 = Piece::Sequence {\n            id: Sequence::A,\n            type_id: 0,\n        };\n        let seq_0_s = r#\"{\"Sequence\":{\"id\":\"A\",\"type_id\":0}}\"#;\n\n        assert_eq!(serde_json::to_string(&seq_0).unwrap(), seq_0_s);\n        assert_eq!(serde_json::from_str::<Piece>(seq_0_s).unwrap(), seq_0);\n\n        let seq_1 = Piece::Sequence {\n            id: Sequence::B,\n            type_id: 1,\n        };\n        let seq_1_s = r#\"{\"Sequence\":{\"id\":\"B\",\"type_id\":1}}\"#;\n        assert_eq!(serde_json::to_string(&seq_1).unwrap(), seq_1_s);\n        assert_eq!(serde_json::from_str::<Piece>(seq_1_s).unwrap(), seq_1);\n\n        let spe = Piece::SpecialToken {\n            id: \"[CLS]\".into(),\n            type_id: 0,\n        };\n        let spe_s = r#\"{\"SpecialToken\":{\"id\":\"[CLS]\",\"type_id\":0}}\"#;\n        assert_eq!(serde_json::to_string(&spe).unwrap(), spe_s);\n        assert_eq!(serde_json::from_str::<Piece>(spe_s).unwrap(), spe);\n    }\n\n    #[test]\n    fn piece() {\n        assert_eq!(\n            Ok(Piece::Sequence {\n                id: Sequence::A,\n                type_id: 0\n            }),\n            \"$\".try_into()\n        );\n        assert_eq!(\n            Ok(Piece::Sequence {\n                id: Sequence::B,\n                type_id: 0\n            }),\n            \"$B\".try_into()\n        );\n        assert_eq!(\n            Ok(Piece::Sequence {\n                id: Sequence::A,\n                type_id: 1\n            }),\n            \"$1\".try_into()\n        );\n        assert_eq!(\n            Ok(Piece::Sequence {\n                id: Sequence::B,\n                type_id: 2\n            }),\n            \"$B:2\".try_into()\n        );\n        assert_eq!(\n            Ok(Piece::Sequence {\n                id: Sequence::A,\n                type_id: 1\n            }),\n            \"$:1\".try_into()\n        );\n        assert!(Piece::try_from(\"$C:1\").is_err());\n        assert!(Piece::try_from(\"$A:\").is_err());\n    }\n\n    #[test]\n    fn special_token_serde() {\n        let simple = SpecialToken::from((\"[CLS]\", 0));\n        let simple_s = r#\"{\"id\":\"[CLS]\",\"ids\":[0],\"tokens\":[\"[CLS]\"]}\"#;\n        assert_eq!(serde_json::to_string(&simple).unwrap(), simple_s);\n        assert_eq!(\n            serde_json::from_str::<SpecialToken>(simple_s).unwrap(),\n            simple\n        );\n\n        let complete = SpecialToken::new(\n            \"[2FR]\".into(),\n            vec![1, 2, 3],\n            vec![\"convert\".into(), \"to\".into(), \"FR\".into()],\n        )\n        .unwrap();\n        let complete_s = r#\"{\"id\":\"[2FR]\",\"ids\":[1,2,3],\"tokens\":[\"convert\",\"to\",\"FR\"]}\"#;\n        assert_eq!(serde_json::to_string(&complete).unwrap(), complete_s);\n        assert_eq!(\n            serde_json::from_str::<SpecialToken>(complete_s).unwrap(),\n            complete\n        );\n\n        let malformed = SpecialToken::new(\n            \"[2FR]\".into(),\n            vec![1, 2],\n            vec![\"convert\".into(), \"to\".into(), \"FR\".into()],\n        );\n        assert!(malformed.is_err());\n        let malformed = SpecialToken::new(\n            \"[2FR]\".into(),\n            vec![1, 2, 3],\n            vec![\"convert\".into(), \"FR\".into()],\n        );\n        assert!(malformed.is_err());\n    }\n\n    #[test]\n    fn template_serde() {\n        let template = Template(vec![\n            Piece::Sequence {\n                id: Sequence::A,\n                type_id: 0,\n            },\n            Piece::SpecialToken {\n                id: \"[CLS]\".into(),\n                type_id: 0,\n            },\n        ]);\n        let template_s =\n            r#\"[{\"Sequence\":{\"id\":\"A\",\"type_id\":0}},{\"SpecialToken\":{\"id\":\"[CLS]\",\"type_id\":0}}]\"#;\n        assert_eq!(serde_json::to_string(&template).unwrap(), template_s);\n        assert_eq!(\n            serde_json::from_str::<Template>(template_s).unwrap(),\n            template\n        );\n    }\n\n    #[test]\n    fn tokens_serde() {\n        let tokens = Tokens::from(vec![(\"[CLS]\", 1), (\"[SEP]\", 0)]);\n        let tokens_s = r#\"{\"[CLS]\":{\"id\":\"[CLS]\",\"ids\":[1],\"tokens\":[\"[CLS]\"]},\"[SEP]\":{\"id\":\"[SEP]\",\"ids\":[0],\"tokens\":[\"[SEP]\"]}}\"#;\n        let tokens_ser = serde_json::to_string(&tokens).unwrap();\n        assert_eq!(tokens_ser, tokens_s);\n        assert_eq!(serde_json::from_str::<Tokens>(tokens_s).unwrap(), tokens);\n    }\n\n    fn get_bert_template() -> TemplateProcessing {\n        TemplateProcessing::builder()\n            .try_single(vec![\"[CLS]\", \"$0\", \"[SEP]\"])\n            .unwrap()\n            .try_pair(\"[CLS]:0 $A:0 [SEP]:0 $B:1 [SEP]:1\")\n            .unwrap()\n            .special_tokens(vec![(\"[CLS]\", 1), (\"[SEP]\", 0)])\n            .build()\n            .unwrap()\n    }\n\n    #[test]\n    fn template_processing_serde() {\n        let template = tests::get_bert_template();\n        let template_s = \"{\\\n            \\\"type\\\":\\\"TemplateProcessing\\\",\\\n            \\\"single\\\":[\\\n                {\\\"SpecialToken\\\":{\\\"id\\\":\\\"[CLS]\\\",\\\"type_id\\\":0}},\\\n                {\\\"Sequence\\\":{\\\"id\\\":\\\"A\\\",\\\"type_id\\\":0}},\\\n                {\\\"SpecialToken\\\":{\\\"id\\\":\\\"[SEP]\\\",\\\"type_id\\\":0}}\\\n            ],\\\n            \\\"pair\\\":[\\\n                {\\\"SpecialToken\\\":{\\\"id\\\":\\\"[CLS]\\\",\\\"type_id\\\":0}},\\\n                {\\\"Sequence\\\":{\\\"id\\\":\\\"A\\\",\\\"type_id\\\":0}},\\\n                {\\\"SpecialToken\\\":{\\\"id\\\":\\\"[SEP]\\\",\\\"type_id\\\":0}},\\\n                {\\\"Sequence\\\":{\\\"id\\\":\\\"B\\\",\\\"type_id\\\":1}},\\\n                {\\\"SpecialToken\\\":{\\\"id\\\":\\\"[SEP]\\\",\\\"type_id\\\":1}}\\\n            ],\\\n            \\\"special_tokens\\\":{\\\n                \\\"[CLS]\\\":{\\\n                    \\\"id\\\":\\\"[CLS]\\\",\\\"ids\\\":[1],\\\"tokens\\\":[\\\"[CLS]\\\"]\\\n                },\\\n                \\\"[SEP]\\\":{\\\n                    \\\"id\\\":\\\"[SEP]\\\",\\\"ids\\\":[0],\\\"tokens\\\":[\\\"[SEP]\\\"]\\\n                }\\\n            }}\";\n        let template_ser = serde_json::to_string(&template).unwrap();\n        assert_eq!(template_ser, template_s);\n        assert_eq!(\n            serde_json::from_str::<TemplateProcessing>(template_s).unwrap(),\n            template\n        );\n    }\n\n    #[test]\n    fn missing_special_tokens() {\n        let processor = TemplateProcessing::builder()\n            .try_single(\"[CLS] $0 [SEP]\")\n            .unwrap()\n            .try_pair(\"[CLS] $A:0 [SEP] $B:1 [SEP]\")\n            .unwrap()\n            .build();\n\n        let err_a = Err(\"Missing SpecialToken(s) with id(s) `[SEP], [CLS]`\".into());\n        let err_b = Err(\"Missing SpecialToken(s) with id(s) `[CLS], [SEP]`\".into());\n        assert!(processor == err_a || processor == err_b);\n    }\n\n    #[test]\n    fn template_processing() {\n        let processor = tests::get_bert_template();\n        assert_eq!(processor.added_tokens(false), 2);\n        assert_eq!(processor.added_tokens(true), 3);\n\n        use crate::Token;\n        let encoding = Encoding::from_tokens(\n            vec![\n                Token::new(12, \"Hello\".into(), (0, 5)),\n                Token::new(14, \"there\".into(), (6, 11)),\n            ],\n            0,\n        );\n        let pair = Encoding::from_tokens(vec![Token::new(15, \"pair\".into(), (0, 4))], 0);\n        let single_encoding = processor.process(encoding.clone(), None, true).unwrap();\n        assert_eq!(\n            single_encoding,\n            Encoding::new(\n                vec![1, 12, 14, 0],\n                vec![0, 0, 0, 0],\n                vec![\n                    \"[CLS]\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"[SEP]\".into()\n                ],\n                vec![None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0)],\n                vec![1, 0, 0, 1],\n                vec![1, 1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 1..3)]),\n            )\n        );\n        assert_eq!(single_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(single_encoding.token_to_sequence(3), None);\n        let pair_encoding = processor.process(encoding, Some(pair), true).unwrap();\n        assert_eq!(\n            pair_encoding,\n            Encoding::new(\n                vec![1, 12, 14, 0, 15, 0],\n                vec![0, 0, 0, 0, 1, 1],\n                vec![\n                    \"[CLS]\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"[SEP]\".into(),\n                    \"pair\".into(),\n                    \"[SEP]\".into()\n                ],\n                vec![None, None, None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0), (0, 4), (0, 0)],\n                vec![1, 0, 0, 1, 0, 1],\n                vec![1, 1, 1, 1, 1, 1],\n                vec![],\n                AHashMap::from_iter(vec![(0, 1..3), (1, 4..5)]),\n            )\n        );\n        assert_eq!(pair_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(3), None);\n        assert_eq!(pair_encoding.token_to_sequence(4), Some(1));\n        assert_eq!(pair_encoding.token_to_sequence(5), None);\n    }\n\n    #[test]\n    fn template_processing_overflowing() {\n        let processor = tests::get_bert_template();\n        assert_eq!(processor.added_tokens(false), 2);\n        assert_eq!(processor.added_tokens(true), 3);\n\n        use crate::Token;\n        let mut encoding = Encoding::from_tokens(\n            vec![\n                Token::new(12, \"Hello\".into(), (0, 5)),\n                Token::new(14, \"there\".into(), (6, 11)),\n            ],\n            0,\n        );\n        let overflowing = Encoding::from_tokens(vec![Token::new(13, \"you\".into(), (12, 15))], 0);\n        encoding.set_overflowing(vec![overflowing]);\n\n        let mut pair = Encoding::from_tokens(\n            vec![\n                Token::new(15, \"pair\".into(), (0, 4)),\n                Token::new(16, \"with\".into(), (5, 9)),\n            ],\n            0,\n        );\n        let pair_overflowing =\n            Encoding::from_tokens(vec![Token::new(17, \"info\".into(), (10, 14))], 0);\n        pair.set_overflowing(vec![pair_overflowing]);\n\n        let single_encoding = processor.process(encoding.clone(), None, true).unwrap();\n        assert_eq!(\n            single_encoding,\n            Encoding::new(\n                vec![1, 12, 14, 0],\n                vec![0, 0, 0, 0],\n                vec![\n                    \"[CLS]\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"[SEP]\".into()\n                ],\n                vec![None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0)],\n                vec![1, 0, 0, 1],\n                vec![1, 1, 1, 1],\n                vec![Encoding::new(\n                    vec![1, 13, 0],\n                    vec![0, 0, 0],\n                    vec![\"[CLS]\".into(), \"you\".into(), \"[SEP]\".into()],\n                    vec![None, None, None],\n                    vec![(0, 0), (12, 15), (0, 0)],\n                    vec![1, 0, 1],\n                    vec![1, 1, 1],\n                    vec![],\n                    AHashMap::from_iter(vec![(0, 1..2)]),\n                )],\n                AHashMap::from_iter(vec![(0, 1..3)]),\n            )\n        );\n        assert_eq!(single_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(single_encoding.token_to_sequence(3), None);\n        let pair_encoding = processor.process(encoding, Some(pair), true).unwrap();\n        println!(\"{pair_encoding:#?}\");\n        assert_eq!(\n            pair_encoding,\n            Encoding::new(\n                vec![1, 12, 14, 0, 15, 16, 0],\n                vec![0, 0, 0, 0, 1, 1, 1],\n                vec![\n                    \"[CLS]\".into(),\n                    \"Hello\".into(),\n                    \"there\".into(),\n                    \"[SEP]\".into(),\n                    \"pair\".into(),\n                    \"with\".into(),\n                    \"[SEP]\".into()\n                ],\n                vec![None, None, None, None, None, None, None],\n                vec![(0, 0), (0, 5), (6, 11), (0, 0), (0, 4), (5, 9), (0, 0)],\n                vec![1, 0, 0, 1, 0, 0, 1],\n                vec![1, 1, 1, 1, 1, 1, 1],\n                vec![\n                    Encoding::new(\n                        vec![1, 13, 0, 15, 16, 0],\n                        vec![0, 0, 0, 1, 1, 1],\n                        vec![\n                            \"[CLS]\".into(),\n                            \"you\".into(),\n                            \"[SEP]\".into(),\n                            \"pair\".into(),\n                            \"with\".into(),\n                            \"[SEP]\".into()\n                        ],\n                        vec![None, None, None, None, None, None],\n                        vec![(0, 0), (12, 15), (0, 0), (0, 4), (5, 9), (0, 0)],\n                        vec![1, 0, 1, 0, 0, 1],\n                        vec![1, 1, 1, 1, 1, 1],\n                        vec![Encoding::new(\n                            vec![1, 13, 0, 17, 0],\n                            vec![0, 0, 0, 0, 1],\n                            vec![\n                                \"[CLS]\".into(),\n                                \"you\".into(),\n                                \"[SEP]\".into(),\n                                \"info\".into(),\n                                \"[SEP]\".into()\n                            ],\n                            vec![None, None, None, None, None,],\n                            vec![(0, 0), (12, 15), (0, 0), (10, 14), (0, 0)],\n                            vec![1, 0, 1, 0, 1],\n                            vec![1, 1, 1, 1, 1],\n                            vec![],\n                            AHashMap::from_iter(vec![(0, 1..2), (1, 3..4)]),\n                        ),],\n                        AHashMap::from_iter(vec![(1, 3..5), (0, 1..2)]),\n                    ),\n                    Encoding::new(\n                        vec![1, 13, 0, 17, 0],\n                        vec![0, 0, 0, 0, 1],\n                        vec![\n                            \"[CLS]\".into(),\n                            \"you\".into(),\n                            \"[SEP]\".into(),\n                            \"info\".into(),\n                            \"[SEP]\".into()\n                        ],\n                        vec![None, None, None, None, None,],\n                        vec![(0, 0), (12, 15), (0, 0), (10, 14), (0, 0)],\n                        vec![1, 0, 1, 0, 1],\n                        vec![1, 1, 1, 1, 1],\n                        vec![],\n                        AHashMap::from_iter(vec![(0, 1..2), (1, 3..4)]),\n                    ),\n                    Encoding::new(\n                        vec![1, 12, 14, 0, 17, 0],\n                        vec![0, 0, 0, 0, 0, 1],\n                        vec![\n                            \"[CLS]\".into(),\n                            \"Hello\".into(),\n                            \"there\".into(),\n                            \"[SEP]\".into(),\n                            \"info\".into(),\n                            \"[SEP]\".into()\n                        ],\n                        vec![None, None, None, None, None, None],\n                        vec![(0, 0), (0, 5), (6, 11), (0, 0), (10, 14), (0, 0)],\n                        vec![1, 0, 0, 1, 0, 1],\n                        vec![1, 1, 1, 1, 1, 1],\n                        vec![Encoding::new(\n                            vec![1, 13, 0, 17, 0],\n                            vec![0, 0, 0, 0, 1],\n                            vec![\n                                \"[CLS]\".into(),\n                                \"you\".into(),\n                                \"[SEP]\".into(),\n                                \"info\".into(),\n                                \"[SEP]\".into()\n                            ],\n                            vec![None, None, None, None, None,],\n                            vec![(0, 0), (12, 15), (0, 0), (10, 14), (0, 0)],\n                            vec![1, 0, 1, 0, 1],\n                            vec![1, 1, 1, 1, 1],\n                            vec![],\n                            AHashMap::from_iter(vec![(0, 1..2), (1, 3..4)]),\n                        ),],\n                        AHashMap::from_iter(vec![(0, 1..3), (1, 4..5)]),\n                    )\n                ],\n                AHashMap::from_iter(vec![(0, 1..3), (1, 4..6)]),\n            )\n        );\n        assert_eq!(pair_encoding.token_to_sequence(2), Some(0));\n        assert_eq!(pair_encoding.token_to_sequence(3), None);\n        assert_eq!(pair_encoding.token_to_sequence(4), Some(1));\n        assert_eq!(pair_encoding.token_to_sequence(5), Some(1));\n        assert_eq!(pair_encoding.token_to_sequence(6), None);\n    }\n    #[test]\n    fn pair_must_use_both_sequences() {\n        let processor = TemplateProcessing::builder()\n            .try_single(\"$0\")\n            .unwrap()\n            .try_pair(\"$0 $1\")\n            .unwrap()\n            .build();\n        assert_eq!(\n            processor,\n            Err(\"Template for `pair` must use both sequences\".into())\n        );\n    }\n\n    #[test]\n    fn expect_wrong_error_message() {\n        let processor = TemplateProcessing::builder()\n            .try_single(\"$0\")\n            .unwrap()\n            .try_pair(\"$0 $1\")\n            .unwrap()\n            .build();\n        assert_ne!(\n            processor,\n            Err(\"Expect the left side error message to be different from the right side!\".into())\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/added_vocabulary.rs",
    "content": "use super::{\n    normalizer::Range, Model, NormalizedString, Normalizer, Offsets, PreTokenizedString, Token,\n};\nuse ahash::{AHashMap, AHashSet};\nuse aho_corasick::{AhoCorasick, AhoCorasickBuilder, MatchKind};\nuse regex::Regex;\nuse serde::{ser::SerializeSeq, Deserialize, Serialize, Serializer};\nuse std::sync::LazyLock;\n\n/// Represent a token added by the user on top of the existing Model vocabulary.\n/// AddedToken can be configured to specify the behavior they should have in various situations\n/// like:\n///   - Whether they should only match single words\n///   - Whether to include any whitespace on its left or right\n#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]\npub struct AddedToken {\n    /// The content of the added token\n    pub content: String,\n    /// Whether this token must be a single word or can break words\n    pub single_word: bool,\n    /// Whether this token should strip whitespaces on its left\n    pub lstrip: bool,\n    /// Whether this token should strip whitespaces on its right\n    pub rstrip: bool,\n    /// Whether this token should be normalized\n    pub normalized: bool,\n    /// Whether this token is special\n    pub special: bool,\n}\n\nimpl AddedToken {\n    /// Build this token from the given content, specifying if it is intended to be a\n    /// special token. Special tokens are not normalized by default.\n    pub fn from<S: Into<String>>(content: S, special: bool) -> Self {\n        Self {\n            content: content.into(),\n            normalized: !special,\n            special,\n            ..Default::default()\n        }\n    }\n    /// Specify whether this token should only match on whole single words, and never\n    /// part of a word.\n    #[must_use]\n    pub fn single_word(mut self, single_word: bool) -> Self {\n        self.single_word = single_word;\n        self\n    }\n    /// Specify whether this token should include all the whitespaces on its left, in\n    /// order to strip them out.\n    #[must_use]\n    pub fn lstrip(mut self, lstrip: bool) -> Self {\n        self.lstrip = lstrip;\n        self\n    }\n    /// Specify whether this token should include all the whitespaces on its right, in\n    /// order to strip them out.\n    #[must_use]\n    pub fn rstrip(mut self, rstrip: bool) -> Self {\n        self.rstrip = rstrip;\n        self\n    }\n    /// Specify whether this token should be normalized and match against its normalized\n    /// version in the input text.\n    #[must_use]\n    pub fn normalized(mut self, normalized: bool) -> Self {\n        self.normalized = normalized;\n        self\n    }\n    /// Specify whether this token is special, meaning if it should be skipped when decoding\n    #[must_use]\n    pub fn special(mut self, special: bool) -> Self {\n        self.special = special;\n        self\n    }\n}\nimpl Default for AddedToken {\n    fn default() -> Self {\n        Self {\n            content: String::new(),\n            single_word: false,\n            lstrip: false,\n            rstrip: false,\n            normalized: true,\n            special: false,\n        }\n    }\n}\n// AddedTokens can be updated if value changed\nimpl std::hash::Hash for AddedToken {\n    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {\n        self.content.hash(state);\n    }\n}\n\ntype MatchingSet = (AhoCorasick, Vec<u32>);\n\nstatic STARTS_WITH_WORD: LazyLock<Regex> = LazyLock::new(|| Regex::new(r\"^\\w\").unwrap());\nstatic ENDS_WITH_WORD: LazyLock<Regex> = LazyLock::new(|| Regex::new(r\"\\w$\").unwrap());\nstatic RIGHTMOST_SPACE_AT_START: LazyLock<Regex> = LazyLock::new(|| Regex::new(r\"^\\s*\").unwrap());\nstatic LEFTMOST_SPACE_AT_END: LazyLock<Regex> = LazyLock::new(|| Regex::new(r\"\\s*$\").unwrap());\n\nfn ends_with_word(sentence: &str) -> bool {\n    ENDS_WITH_WORD.is_match(sentence)\n}\n\nfn starts_with_word(sentence: &str) -> bool {\n    STARTS_WITH_WORD.is_match(sentence)\n}\n\nfn space_leftmost_at_end(sentence: &str) -> usize {\n    if let Some(match_) = LEFTMOST_SPACE_AT_END.find(sentence) {\n        match_.start()\n    } else {\n        sentence.len()\n    }\n}\nfn space_rightmost_at_start(sentence: &str) -> usize {\n    if let Some(match_) = RIGHTMOST_SPACE_AT_START.find(sentence) {\n        match_.end()\n    } else {\n        0\n    }\n}\n///\n/// A vocabulary built on top of the Model\n///\n/// This provides a way to add new vocabulary to a Tokenizer that has already been trained,\n/// in a previous process, maybe by someone else. This is especially interesting in the case\n/// of fine-tunings, where we want to finetune a model while adding some new functionalities\n/// using some new special tokens, or maybe add some tokens in the case of unknown tokens, etc.\n///\n/// One of the reasons we need to handle these tokens outside of the model is simply that\n/// for many models, it is not possible to add new tokens after the training process. For example,\n/// using BPE, the training process generates merges pairs along the vocabulary, and any token\n/// in the vocabulary can be decomposed in other tokens, down to the original alphabet. If we\n/// were to add new tokens after this training process, we couldn't make sure the merges pairs\n/// exist as required.\n///\n#[derive(Clone, Debug)]\npub struct AddedVocabulary {\n    /// Contains the mapping from String (token content) to ID. This map contains both special\n    /// tokens and classic added tokens that were added to the this vocabulary.\n    added_tokens_map: AHashMap<String, u32>,\n    /// Contains the mapping from ID to AddedToken for all the added tokens, both special\n    /// and classic.\n    added_tokens_map_r: AHashMap<u32, AddedToken>,\n\n    /// Contains only the classic AddedToken, in the specific order the user gave them.\n    added_tokens: Vec<AddedToken>,\n    /// Contains only the special AddedToken, in the specific order the user gave them.\n    special_tokens: Vec<AddedToken>,\n\n    /// A Set, containing all the special token for easy access while decoding. This let's\n    /// us remove them easily with an O(1) complexity.\n    special_tokens_set: AHashSet<String>,\n\n    /// A RegexSet containing all the non-normalized patterns used to split on AddedTokens\n    split_trie: MatchingSet,\n    /// A RegexSet containing all the normalized patterns used to split on AddedTokens\n    split_normalized_trie: MatchingSet,\n\n    /// Whether or not special tokens should be splitted when encoding. This is equivalent to ignoring them\n    encode_special_tokens: bool,\n}\n\nimpl AddedVocabulary {\n    pub fn new() -> Self {\n        let trie = AhoCorasickBuilder::new()\n            .match_kind(MatchKind::LeftmostLongest)\n            .build::<_, &&[u8]>([])\n            .expect(\"The trie should build correctly\");\n        let normalized_trie = AhoCorasickBuilder::new()\n            .match_kind(MatchKind::LeftmostLongest)\n            .build::<_, &&[u8]>([])\n            .expect(\"The normalized trie should build correctly\");\n        Self {\n            added_tokens_map: AHashMap::new(),\n            added_tokens_map_r: AHashMap::new(),\n            added_tokens: vec![],\n            special_tokens: vec![],\n            special_tokens_set: AHashSet::new(),\n            split_trie: (trie, vec![]),\n            split_normalized_trie: (normalized_trie, vec![]),\n            encode_special_tokens: false,\n        }\n    }\n    /// Size of the additional vocabulary\n    #[allow(dead_code)] // Suppress the \"method is never used\" warning\n    pub fn len(&self) -> usize {\n        self.added_tokens_map.len()\n    }\n\n    /// Whether or not this vocabulary is empty\n    pub fn is_empty(&self) -> bool {\n        self.added_tokens_map.is_empty()\n    }\n\n    /// Get the additional vocabulary\n    pub fn get_vocab(&self) -> &AHashMap<String, u32> {\n        &self.added_tokens_map\n    }\n\n    /// Get the additional vocabulary with the AddedTokens\n    pub fn get_added_tokens_decoder(&self) -> &AHashMap<u32, AddedToken> {\n        &self.added_tokens_map_r\n    }\n\n    /// Get the id matching one of our token if it exists\n    pub fn token_to_id(&self, token: &str, model: &impl Model) -> Option<u32> {\n        self.added_tokens_map\n            .get(token)\n            .copied()\n            .or_else(|| model.token_to_id(token))\n    }\n\n    /// Get the token matching the given id if it exists\n    #[deprecated(\n        since = \"0.19.0\",\n        note = \"please use `added_vocabulary.simple_id_to_token(id).or_else(|| model.id_to_token(id)` instead\"\n    )]\n    pub fn id_to_token(&self, id: u32, model: &impl Model) -> Option<String> {\n        self.added_tokens_map_r\n            .get(&id)\n            .map(|t| t.content.clone())\n            .or_else(|| model.id_to_token(id))\n    }\n\n    pub fn simple_id_to_token(&self, id: u32) -> Option<String> {\n        self.added_tokens_map_r.get(&id).map(|t| t.content.clone())\n    }\n\n    //\n    pub fn set_encode_special_tokens(&mut self, value: bool) {\n        self.encode_special_tokens = value;\n    }\n\n    pub fn get_encode_special_tokens(&self) -> bool {\n        self.encode_special_tokens\n    }\n\n    /// Check if a token is a special token\n    pub fn is_special_token(&self, token: &str) -> bool {\n        self.special_tokens_set.contains(token)\n    }\n\n    /// Add some special tokens to the vocabulary\n    pub fn add_special_tokens<N: Normalizer>(\n        &mut self,\n        tokens: &[AddedToken],\n        model: &impl Model,\n        normalizer: Option<&N>,\n    ) -> usize {\n        self.add_tokens(tokens, model, normalizer)\n    }\n\n    /// Add some tokens to the vocabulary\n    pub fn add_tokens<N: Normalizer>(\n        &mut self,\n        tokens: &[AddedToken],\n        model: &impl Model,\n        normalizer: Option<&N>,\n    ) -> usize {\n        // Handle special tokens (if any)\n        for token in tokens {\n            if token.special\n                && !token.content.is_empty()\n                && !self.special_tokens_set.contains(&token.content)\n            {\n                self.special_tokens.push(token.to_owned());\n                self.special_tokens_set.insert(token.content.clone());\n            }\n        }\n\n        let mut ignored = 0;\n\n        let mut existing: AHashSet<AddedToken> =\n            self.added_tokens_map_r.values().cloned().collect();\n        let mut next_id = self.added_tokens_map_r.keys().copied().max().map_or(\n            model.get_vocab_size() as u32,\n            |max| {\n                if max >= model.get_vocab_size() as u32 || model.get_vocab_size() == 0 {\n                    max + 1\n                } else {\n                    model.get_vocab_size() as u32\n                }\n            },\n        );\n\n        for token in tokens {\n            if token.content.is_empty() || existing.contains(token) {\n                ignored += 1;\n                continue;\n            }\n\n            let new_id = if let Some(new_id) = self.token_to_id(&token.content, model) {\n                new_id\n            } else {\n                let id = next_id;\n                next_id += 1;\n                id\n            };\n\n            *self\n                .added_tokens_map\n                .entry(token.content.clone())\n                .or_default() = new_id;\n            // Update the current revert operation\n            *self.added_tokens_map_r.entry(new_id).or_default() = token.clone();\n            // Make sure to remove previous entry (if the token gets a new id)\n\n            // Finally add the token to the classic set if special\n            if !self.special_tokens_set.contains(&token.content) {\n                self.added_tokens.push(token.clone());\n            }\n            existing.insert(token.clone());\n        }\n\n        self.refresh_added_tokens(model, normalizer);\n\n        // Return the number of added tokens\n        tokens.len() - ignored\n    }\n\n    /// Reconstruct our internal RegexSet when new tokens are added to the vocabulary.\n    /// # TODO @ArthurZucker we should probably make this async? rebuilding the regex takes a long time.\n    /// We keep two different RegexSet, one that will take care of matching against the\n    /// non-normalized string, and one matching against the normalized one.\n    fn refresh_added_tokens<N: Normalizer>(&mut self, model: &impl Model, normalizer: Option<&N>) {\n        type TupleTokenId<'a> = (&'a AddedToken, u32);\n        let (normalized, non_normalized): (Vec<TupleTokenId>, Vec<TupleTokenId>) = self\n            .special_tokens\n            .iter()\n            .chain(self.added_tokens.iter())\n            .map(|token| {\n                (\n                    token,\n                    self.token_to_id(&token.content, model)\n                        .expect(\"Missing additional token\"),\n                )\n            })\n            .partition(|(token, _)| token.normalized);\n\n        let (tokens, ids): (Vec<&AddedToken>, Vec<u32>) = non_normalized.into_iter().unzip();\n        let trie = AhoCorasickBuilder::new()\n            .match_kind(MatchKind::LeftmostLongest)\n            .build(tokens.iter().map(|token| &token.content))\n            .expect(\"Failed to build tried when refreshing tokens\");\n        self.split_trie = (trie, ids);\n\n        let (ntokens, nids): (Vec<&AddedToken>, Vec<u32>) = normalized.into_iter().unzip();\n        let patterns: Vec<_> = ntokens\n            .iter()\n            .map(|token| {\n                let mut content = NormalizedString::from(token.content.as_ref());\n                if let Some(n) = normalizer {\n                    n.normalize(&mut content).unwrap();\n                }\n                content\n            })\n            .collect();\n        let normalized_trie = AhoCorasickBuilder::new()\n            .match_kind(MatchKind::LeftmostLongest)\n            .build(patterns.iter().map(|content| content.get()))\n            .expect(\"Failed to build tried when refreshing tokens (normalized)\");\n        self.split_normalized_trie = (normalized_trie, nids);\n    }\n\n    /// Find any AddedToken in the given sentence, using the provided MatchingSet.\n    /// This method returns a list \"splits\", each of them being a pair of Offsets\n    /// and an optional ID if it is an AddedToken.\n    /// The list of splits cover the entire input string.\n    fn find_matches(&self, sentence: &str, split_re: &MatchingSet) -> Vec<(Option<u32>, Offsets)> {\n        if sentence.is_empty() {\n            return vec![(None, (0, 0))];\n        }\n\n        let mut start_offset = 0;\n        let mut splits = vec![];\n\n        for mat in split_re.0.find_iter(sentence) {\n            let mut start = mat.start();\n            let mut stop = mat.end();\n            let aho_id = mat.pattern();\n            let id = split_re.1[aho_id];\n            let added_token = &self.added_tokens_map_r.get(&id).unwrap();\n\n            if self.encode_special_tokens && self.special_tokens_set.contains(&added_token.content)\n            {\n                continue;\n            }\n\n            if added_token.single_word {\n                let start_space = start == 0 || !ends_with_word(&sentence[..start]);\n                let stop_space = stop == sentence.len() || !starts_with_word(&sentence[stop..]);\n\n                if !stop_space || !start_space {\n                    // Discard not single word\n                    continue;\n                }\n            }\n            if added_token.lstrip {\n                // This will be strictly inferior to start and in correct sentence offset\n                let newstart = space_leftmost_at_end(&sentence[..start]);\n\n                // The previous match could have already matched those spaces\n                // Ignore them if it's already matched\n                start = std::cmp::max(newstart, start_offset);\n            }\n            if added_token.rstrip {\n                // This will starting a the stop+1 character, so we need\n                // to add the previous stop value\n                stop += space_rightmost_at_start(&sentence[stop..])\n            }\n            if start_offset < start {\n                splits.push((None, (start_offset, start)));\n            }\n            splits.push((Some(id), (start, stop)));\n            start_offset = stop;\n        }\n\n        let total_byte_len = sentence.len();\n        if start_offset != total_byte_len {\n            splits.push((None, (start_offset, total_byte_len)));\n        }\n\n        splits\n    }\n\n    /// Split the input sentence to extract anything we found from the `MatchingSet`, as well as\n    /// the list of corresponding IDs\n    /// The list of IDs have the exact same number of elements than the Iterator.\n    fn split_with_indices(\n        &self,\n        sentence: NormalizedString,\n        split_re: &MatchingSet,\n    ) -> Vec<(NormalizedString, Option<Vec<Token>>)> {\n        self.find_matches(sentence.get(), split_re)\n            .into_iter()\n            .map(|(id, byte_offsets)| {\n                let slice = sentence\n                    .slice(Range::Normalized(byte_offsets.0..byte_offsets.1))\n                    .expect(\"AddedVocabulary bad split\");\n                if let Some(id) = id {\n                    let value = slice.get().to_owned();\n                    let len = value.len();\n                    (slice, Some(vec![Token::new(id, value, (0, len))]))\n                } else {\n                    (slice, None)\n                }\n            })\n            .collect()\n    }\n\n    /// Extract the additional vocabulary from the given sentence, normalizing it along the way.\n    ///\n    /// Some tokens should match against their normalized representation, as well as the\n    /// non-normalized one. For example, when we expect to extract the token `yesterday` in the\n    /// input sentence `I read a book Yesterday`, if the normalizer is supposed to lowercase\n    /// everything, we expect a match.\n    pub fn extract_and_normalize<N: Normalizer>(\n        &self,\n        normalizer: Option<&N>,\n        sequence: &str,\n    ) -> PreTokenizedString {\n        let mut pretokenized: PreTokenizedString = sequence.into();\n\n        // 1. We extract all the non-normalized tokens from the non-normalized string\n        pretokenized\n            .split(|_, sequence| Ok(self.split_with_indices(sequence, &self.split_trie)))\n            .expect(\"AddedVocabulary bad split\");\n\n        // <s> normalized = False\n        // \"I read a book   <s>Hey\" -> \"I read a book\", \"   <s>\", \"Hey\"\n\n        // </s> normalized = True -> \"▁</s>\"\n        // \"I read a book</s>Hey\" -> \"I read a book</s>Hey\"\n\n        // Day normalized = True -> \"Day\"\n        // \"I read a book monday\" -> \"I read a book monday\"\n\n        // [DAY] normalized = False -> \"Day\"\n        // \"I read a [DAY] monday\" -> \"I read a \" \"[DAY]\", \"book monday\"\n        //                                         320055\n        // 2. Then extract the normalized tokens from the normalized pieces of the string\n        pretokenized\n            .split(|_, mut sequence| {\n                normalizer.map(|n| n.normalize(&mut sequence));\n                Ok(self.split_with_indices(sequence, &self.split_normalized_trie))\n            })\n            .expect(\"AddedVocabulary bad split\");\n\n        // [\"I read a book\", \"   <s>\", \"Hey\"] -> [\"▁I read a book\", \"▁   <s>\", \"▁Hey\"]\n        // [\"▁I read a book\", \"▁   <s>\", \"▁Hey\"] -> [.., \"▁   \", \"<s>\", \"▁Hey\"]\n\n        // </s> normalized = True -> \"▁</s>\"\n        // \"I read a book</s>Hey\" -> [\"▁I read a book\", \"<\",\"/\",\"s\",\">\", \"Hey\"]\n\n        // \"I read a \" \"[DAY]\", \"book monday\" -> \"i read a \" \"[day]\", \"book monday\"\n\n        pretokenized\n    }\n}\n\nimpl Default for AddedVocabulary {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[derive(Debug, Serialize, Deserialize)]\npub(super) struct AddedTokenWithId {\n    /// The id assigned to this token\n    pub id: u32,\n    #[serde(flatten)]\n    /// The target AddedToken\n    pub token: AddedToken,\n}\n\nimpl Serialize for AddedVocabulary {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut added_tokens = self\n            .added_tokens_map_r\n            .iter()\n            .map(|(id, token)| AddedTokenWithId {\n                id: *id,\n                token: token.clone(),\n            })\n            .collect::<Vec<_>>();\n        // We need to have these added tokens ordered by ascending ID\n        added_tokens.sort_unstable_by_key(|o| o.id);\n\n        let mut vocabulary = serializer.serialize_seq(Some(added_tokens.len()))?;\n        for token in added_tokens {\n            vocabulary.serialize_element(&token)?;\n        }\n\n        vocabulary.end()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::normalizers::byte_level::ByteLevel as ByteLevelNormalizer;\n    use crate::normalizers::utils::Lowercase;\n    use crate::normalizers::NormalizerWrapper;\n    use crate::{OffsetReferential, OffsetType, Result, Token, Trainer};\n    use std::collections::HashMap;\n    use std::path::{Path, PathBuf};\n\n    #[derive(Serialize, Deserialize)]\n    struct ModelMock {\n        vocab: AHashMap<String, u32>,\n        vocab_r: AHashMap<u32, String>,\n    }\n    impl ModelMock {\n        pub fn new<I>(iter: I) -> Self\n        where\n            I: IntoIterator<Item = &'static (&'static str, u32)>,\n        {\n            let vocab: AHashMap<String, u32> = iter\n                .into_iter()\n                .map(|&(tok, id)| (tok.to_string(), id))\n                .collect();\n            Self {\n                vocab_r: vocab\n                    .iter()\n                    .map(|(tok, id)| (*id, tok.to_owned()))\n                    .collect(),\n                vocab,\n            }\n        }\n    }\n\n    fn simplify_output(result: &'_ PreTokenizedString) -> Vec<(&'_ str, Option<Vec<u32>>)> {\n        result\n            .get_splits(OffsetReferential::Original, OffsetType::Byte)\n            .into_iter()\n            .map(|(s, _, tokens)| {\n                (\n                    s,\n                    tokens\n                        .as_ref()\n                        .map(|t| t.iter().map(|t| t.id).collect::<Vec<_>>()),\n                )\n            })\n            .collect::<Vec<_>>()\n    }\n\n    struct TrainerMock;\n    impl Trainer for TrainerMock {\n        type Model = ModelMock;\n        fn should_show_progress(&self) -> bool {\n            true\n        }\n        fn train(&self, _model: &mut ModelMock) -> Result<Vec<AddedToken>> {\n            unimplemented!()\n        }\n        fn feed<I, S, F>(&mut self, _iterator: I, _process: F) -> Result<()>\n        where\n            I: Iterator<Item = S> + Send,\n            S: AsRef<str> + Send,\n            F: Fn(&str) -> Result<Vec<String>> + Sync,\n        {\n            unimplemented!()\n        }\n    }\n\n    impl Model for ModelMock {\n        type Trainer = TrainerMock;\n\n        fn tokenize(&self, _sequence: &str) -> Result<Vec<Token>> {\n            unimplemented!()\n        }\n        fn token_to_id(&self, token: &str) -> Option<u32> {\n            self.vocab.get(token).copied()\n        }\n        fn id_to_token(&self, id: u32) -> Option<String> {\n            self.vocab_r.get(&id).cloned()\n        }\n        fn get_vocab(&self) -> HashMap<String, u32> {\n            self.vocab.clone().into_iter().collect()\n        }\n        fn get_vocab_size(&self) -> usize {\n            self.vocab.len()\n        }\n        fn save(&self, _folder: &Path, _name: Option<&str>) -> Result<Vec<PathBuf>> {\n            unimplemented!()\n        }\n        fn get_trainer(&self) -> Self::Trainer {\n            TrainerMock\n        }\n    }\n\n    #[test]\n    fn can_add_tokens() {\n        let model = ModelMock::new(&[(\"test\", 0), (\"tost\", 1)]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer: Option<&NormalizerWrapper> = None;\n\n        // Add tokens normally\n        assert_eq!(\n            vocab.add_tokens(\n                &[AddedToken::from(\"added_token_1\", false)],\n                &model,\n                normalizer\n            ),\n            1\n        );\n\n        let vocab_len: usize = vocab.len();\n        assert_eq!(vocab_len, 1);\n\n        // Does not add multiple time the same token\n        assert_eq!(\n            vocab.add_tokens(\n                &[\n                    AddedToken::from(\"added_token_2\", false),\n                    AddedToken::from(\"added_token_2\", false)\n                ],\n                &model,\n                normalizer\n            ),\n            1\n        );\n        assert_eq!(vocab.len(), 2);\n\n        // Also adds tokens already covered by the model\n        let added_token = AddedToken::from(\"test\", false);\n        assert_eq!(\n            vocab.add_tokens(std::slice::from_ref(&added_token), &model, normalizer),\n            1\n        );\n        assert_eq!(vocab.len(), 3);\n\n        assert_eq!(vocab.get_added_tokens_decoder()[&0], added_token);\n    }\n\n    #[test]\n    fn can_add_special_tokens() {\n        let model = ModelMock::new(&[(\"test\", 0), (\"tost\", 1)]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer: Option<&NormalizerWrapper> = None;\n        // Add tokens normally\n        assert_eq!(\n            vocab.add_special_tokens(\n                &[AddedToken::from(\"added_token_1\", true)],\n                &model,\n                normalizer\n            ),\n            1\n        );\n        assert_eq!(vocab.len(), 1);\n\n        // Does not add multiple time the same token\n        assert_eq!(\n            vocab.add_special_tokens(\n                &[\n                    AddedToken::from(\"added_token_2\", true),\n                    AddedToken::from(\"added_token_2\", true)\n                ],\n                &model,\n                normalizer\n            ),\n            1\n        );\n        assert_eq!(vocab.len(), 2);\n\n        // Can add tokens already covered by the model\n        assert_eq!(\n            vocab.add_special_tokens(&[AddedToken::from(\"test\", true)], &model, normalizer),\n            1\n        );\n        assert_eq!(vocab.len(), 3); // New token was added\n        assert!(vocab.is_special_token(\"test\"));\n        assert_eq!(\n            *vocab.get_added_tokens_decoder(),\n            AHashMap::from([\n                (0, AddedToken::from(\"test\", true)),\n                (2, AddedToken::from(\"added_token_1\", true)),\n                (3, AddedToken::from(\"added_token_2\", true)),\n            ])\n        );\n        assert!(vocab.added_tokens_map.contains_key(\"test\"));\n        assert!(vocab.added_tokens_map_r.contains_key(&0));\n\n        vocab.add_tokens(\n            &[\n                AddedToken::from(\"tost\", true),\n                AddedToken::from(\"another_two\", false),\n            ],\n            &model,\n            normalizer,\n        );\n        assert_eq!(vocab.len(), 5); // New token was added\n        assert_eq!(vocab.get_vocab()[\"another_two\"], 4); // New token was added, but the index is not the length of the vocab\n\n        // Let's add an already added token again\n        assert_eq!(\n            vocab.add_special_tokens(&[AddedToken::from(\"another_two\", true)], &model, normalizer),\n            1\n        );\n        assert_eq!(vocab.len(), 5); // Token was already there\n        assert_eq!(vocab.get_vocab()[\"another_two\"], 4); // Token idx not changed\n\n        // Just checking that we can set the content of the string in rust\n        let mut token: AddedToken = AddedToken::from(\"Hey\", false);\n        token.content = \"hey\".to_string();\n        assert_eq!(token.content, \"hey\"); // Token was already there\n\n        token.special = true;\n        assert!(token.special); // Token was already there\n    }\n\n    #[test]\n    fn can_extract_added_tokens() {\n        // Is able to extract both normal and special tokens\n        let model = ModelMock::new(&[]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer: Option<&NormalizerWrapper> = None;\n\n        vocab.add_tokens(\n            &[\n                AddedToken::from(\"my\", false),\n                AddedToken::from(\"name\", false),\n            ],\n            &model,\n            normalizer,\n        );\n        vocab.add_special_tokens(\n            &[\n                AddedToken::from(\"[CLS]\", true),\n                AddedToken::from(\"[SEP]\", true),\n            ],\n            &model,\n            normalizer,\n        );\n\n        let result = vocab.extract_and_normalize(normalizer, \"[CLS] My name is Anthony [SEP]\");\n        assert_eq!(\n            result\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, _, tokens)| (\n                    s,\n                    tokens\n                        .as_ref()\n                        .map(|t| t.iter().map(|t| t.id).collect::<Vec<_>>())\n                ))\n                .collect::<Vec<_>>(),\n            vec![\n                (\"[CLS]\", Some(vec![2])),\n                (\" My \", None),\n                (\"name\", Some(vec![1])),\n                (\" is Anthony \", None),\n                (\"[SEP]\", Some(vec![3]))\n            ]\n        );\n    }\n\n    #[test]\n    fn options_use_cases() {\n        // Is able to extract both normal and special tokens, with various options (lstrip, rstrip,\n        // single_word, normalized)\n        let model = ModelMock::new(&[]);\n        let normalizer = Lowercase;\n        let mut vocab = AddedVocabulary::new();\n\n        vocab.add_tokens(\n            &[\n                AddedToken::from(\"my\", false).lstrip(true).rstrip(true),\n                AddedToken::from(\"name\", false),\n                AddedToken::from(\"ony\", false).single_word(true),\n            ],\n            &model,\n            Some(&normalizer),\n        );\n        vocab.add_special_tokens(\n            &[\n                AddedToken::from(\"[CLS]\", true),\n                AddedToken::from(\"[SEP]\", true),\n            ],\n            &model,\n            Some(&normalizer),\n        );\n\n        let result =\n            vocab.extract_and_normalize(Some(&normalizer), \"[CLS] My name is Anthony [SEP]\");\n\n        assert_eq!(\n            simplify_output(&result),\n            vec![\n                (\"[CLS]\", Some(vec![3])),\n                // This one includes both spaces because of the lstrip & rstrip\n                // And it matches because normalized == true\n                (\" my \", Some(vec![0])),\n                (\"name\", Some(vec![1])),\n                // `ony` is not extracted here thanks to single_word\n                (\" is anthony \", None),\n                (\"[SEP]\", Some(vec![4])),\n            ]\n        );\n    }\n\n    #[test]\n    fn empty_matches() {\n        let vocab = AddedVocabulary::new();\n        let matches = vocab.find_matches(\"\", &vocab.split_trie);\n        assert_eq!(matches, vec![(None, (0, 0))]);\n    }\n\n    #[test]\n    fn test_single_word_is_correct() {\n        // Is able to extract both normal and special tokens, with various options (lstrip, rstrip,\n        // single_word, normalized)\n        let model = ModelMock::new(&[]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer = Lowercase;\n\n        vocab.add_tokens(\n            &[AddedToken::from(\"<mask>\", false).single_word(true)],\n            &model,\n            Some(&normalizer),\n        );\n        // Left, in the middle, non single world left, non single word right, end of sentence valid\n        let result = vocab.extract_and_normalize(\n            Some(&normalizer),\n            \"<mask> My name <mask> A<mask> <mask>ony <mask>\",\n        );\n        assert_eq!(\n            simplify_output(&result),\n            vec![\n                (\"<mask>\", Some(vec![0])),\n                (\" my name \", None),\n                (\"<mask>\", Some(vec![0])),\n                (\" a<mask> <mask>ony \", None),\n                (\"<mask>\", Some(vec![0]))\n            ]\n        );\n    }\n\n    #[test]\n    fn test_single_word_is_unicode_correct() {\n        let model = ModelMock::new(&[]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer = Lowercase;\n\n        assert_eq!(vocab.len(), 0);\n\n        vocab.add_tokens(\n            &[AddedToken::from(\"<mask>\", false).single_word(true)],\n            &model,\n            Some(&normalizer),\n        );\n        let result = vocab.extract_and_normalize(Some(&normalizer), \"<mask>, <mask>- ◌̰<mask>\");\n        assert_eq!(\n            simplify_output(&result),\n            vec![\n                // Punctuation is not word\n                (\"<mask>\", Some(vec![0])),\n                (\", \", None),\n                // dash is not word\n                (\"<mask>\", Some(vec![0])),\n                // This is unicode combining mark character and is word: https://en.wikipedia.org/wiki/Combining_Diacritical_Marks\n                (\"- ◌̰<mask>\", None),\n            ]\n        );\n    }\n\n    #[test]\n    fn test_lstrip_unicode_space() {\n        let model = ModelMock::new(&[]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer = Lowercase;\n\n        vocab.add_tokens(\n            &[AddedToken::from(\"<mask>\", false)\n                .lstrip(true)\n                .rstrip(true)\n                .single_word(true)],\n            &model,\n            Some(&normalizer),\n        );\n        let result = vocab\n            .extract_and_normalize(Some(&normalizer), \"Hi <mask> there\\t<mask>\\t<mask>\\u{2000}\");\n        assert_eq!(\n            simplify_output(&result),\n            vec![\n                (\"hi\", None),\n                // Regular space\n                (\" <mask> \", Some(vec![0])),\n                (\"there\", None),\n                // \\t is a spacing character\n                (\"\\t<mask>\\t\", Some(vec![0])),\n                // Non overlapping\n                // \\u{2000} is mongolian vowel separator: https://jkorpela.fi/chars/spaces.html\n                (\"<mask>\\u{2000}\", Some(vec![0])),\n            ]\n        );\n    }\n\n    #[test]\n    fn test_encode_special_tokens() {\n        let model = ModelMock::new(&[]);\n        let mut vocab = AddedVocabulary::new();\n        let normalizer = Lowercase;\n\n        vocab.add_tokens(\n            &[\n                AddedToken::from(\"<mask>\", true)\n                    .lstrip(true)\n                    .rstrip(true)\n                    .single_word(true),\n                AddedToken::from(\"ask>\", false),\n                AddedToken::from(\"<pad>\", true),\n            ],\n            &model,\n            Some(&normalizer),\n        );\n        vocab.set_encode_special_tokens(true);\n\n        let result = vocab.extract_and_normalize(\n            Some(&normalizer),\n            \"Hi <mask> there\\t<mask>\\t<mask>\\u{2000} <pad> <mask><pad><pad>\",\n        );\n\n        assert_eq!(\n            simplify_output(&result),\n            vec![\n                (\"hi <m\", None),\n                (\"ask>\", Some(vec![1])),\n                (\" there\\t<m\", None),\n                (\"ask>\", Some(vec![1])),\n                (\"\\t<m\", None),\n                (\"ask>\", Some(vec![1])),\n                (\"\\u{2000} <pad> <m\", None),\n                (\"ask>\", Some(vec![1])),\n                (\"<pad><pad>\", None)\n            ]\n        );\n\n        vocab.set_encode_special_tokens(false);\n\n        let result = vocab.extract_and_normalize(\n            Some(&normalizer),\n            \"Hi <mask> there\\t<mask>\\t<mask>\\u{2000} <pad> <mask><pad><pad>\",\n        );\n        assert_eq!(\n            simplify_output(&result),\n            vec![\n                (\"hi\", None),\n                (\" <mask> \", Some(vec![0])),\n                (\"there\", None),\n                (\"\\t<mask>\\t\", Some(vec![0])),\n                (\"<mask>\\u{2000} \", Some(vec![0])),\n                (\"<pad>\", Some(vec![2])),\n                (\" <mask>\", Some(vec![0])),\n                (\"<pad>\", Some(vec![2])),\n                (\"<pad>\", Some(vec![2]))\n            ]\n        );\n    }\n    #[test]\n    fn byte_level_normalizer() {\n        // Is able to extract both normal and special tokens\n        let model = ModelMock::new(&[]);\n        let mut vocab = AddedVocabulary::new();\n        let from = NormalizerWrapper::from(ByteLevelNormalizer::new());\n        let normalizer: Option<&NormalizerWrapper> = Some(&from);\n\n        vocab.add_tokens(\n            &[AddedToken::from(\"my\", false), AddedToken::from(\"今\", false)],\n            &model,\n            normalizer,\n        );\n        let result = vocab.extract_and_normalize(normalizer, \"my今\");\n        assert_eq!(\n            result\n                .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                .into_iter()\n                .map(|(s, _, tokens)| (\n                    s,\n                    tokens\n                        .as_ref()\n                        .map(|t| t.iter().map(|t| t.id).collect::<Vec<_>>())\n                ))\n                .collect::<Vec<_>>(),\n            vec![(\"my\", Some(vec![0])), (\"ä»Ĭ\", Some(vec![1])),]\n        );\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/encoding.rs",
    "content": "use crate::parallelism::*;\nuse crate::tokenizer::{Offsets, Token};\nuse crate::utils::padding::PaddingDirection;\nuse crate::utils::truncation::TruncationDirection;\nuse ahash::AHashMap;\nuse serde::{Deserialize, Serialize};\nuse std::ops::Range;\n\n/// Represents the output of a `Tokenizer`.\n#[derive(Default, PartialEq, Debug, Clone, Serialize, Deserialize)]\npub struct Encoding {\n    /// IDs produced by the `Tokenizer`\n    ids: Vec<u32>,\n    /// Type of the IDs\n    type_ids: Vec<u32>,\n    /// Tokens associated to each ID\n    tokens: Vec<String>,\n    /// Indice of the word associated to each token/ID\n    words: Vec<Option<u32>>,\n    /// Offsets of the token/ID from the NormalizedString\n    offsets: Vec<Offsets>,\n    /// Mask identifying special tokens\n    special_tokens_mask: Vec<u32>,\n    /// Mask identifying padding tokens for the attention mechanism\n    attention_mask: Vec<u32>,\n    /// A list of overflowing Encoding generated when we got truncated\n    overflowing: Vec<Encoding>,\n    /// Ranges of tokens covered by each sequence. If this is empty we consider\n    /// there is only one sequence in this Encoding, and that it covers the entire range.\n    sequence_ranges: AHashMap<usize, Range<usize>>,\n}\nimpl Encoding {\n    #[allow(clippy::too_many_arguments)]\n    pub fn new(\n        ids: Vec<u32>,\n        type_ids: Vec<u32>,\n        tokens: Vec<String>,\n        words: Vec<Option<u32>>,\n        offsets: Vec<Offsets>,\n        special_tokens_mask: Vec<u32>,\n        attention_mask: Vec<u32>,\n        overflowing: Vec<Self>,\n        sequence_ranges: AHashMap<usize, Range<usize>>,\n    ) -> Self {\n        Self {\n            ids,\n            type_ids,\n            tokens,\n            words,\n            offsets,\n            special_tokens_mask,\n            attention_mask,\n            overflowing,\n            sequence_ranges,\n        }\n    }\n\n    pub fn with_capacity(len: usize) -> Self {\n        Self {\n            ids: Vec::with_capacity(len),\n            type_ids: Vec::with_capacity(len),\n            tokens: Vec::with_capacity(len),\n            words: Vec::with_capacity(len),\n            offsets: Vec::with_capacity(len),\n            special_tokens_mask: Vec::with_capacity(len),\n            attention_mask: Vec::with_capacity(len),\n            overflowing: vec![],\n            sequence_ranges: AHashMap::new(),\n        }\n    }\n\n    pub fn from_tokens(tokens: Vec<Token>, type_id: u32) -> Self {\n        let length = tokens.len();\n        let (ids, tokens, offsets) = tokens.into_iter().fold(\n            (\n                Vec::with_capacity(length),\n                Vec::with_capacity(length),\n                Vec::with_capacity(length),\n            ),\n            |(mut ids, mut tokens, mut offsets), t| {\n                ids.push(t.id);\n                tokens.push(t.value);\n                offsets.push(t.offsets);\n                (ids, tokens, offsets)\n            },\n        );\n\n        Self {\n            ids,\n            tokens,\n            offsets,\n            words: vec![None; length],\n            type_ids: vec![type_id; length],\n            attention_mask: vec![1; length],\n            special_tokens_mask: vec![0; length],\n            overflowing: vec![],\n            sequence_ranges: AHashMap::new(),\n        }\n    }\n\n    /// Whether this Encoding is empty\n    pub fn is_empty(&self) -> bool {\n        self.ids.is_empty()\n    }\n\n    /// Return the total length of this Encoding\n    pub fn len(&self) -> usize {\n        self.ids.len()\n    }\n\n    /// Return the number of sequences combined in this Encoding\n    pub fn n_sequences(&self) -> usize {\n        if self.sequence_ranges.is_empty() {\n            1\n        } else {\n            self.sequence_ranges.len()\n        }\n    }\n\n    /// Set the given sequence id for the whole range of tokens contained in this Encoding\n    pub fn set_sequence_id(&mut self, sequence_id: usize) {\n        self.sequence_ranges.insert(sequence_id, 0..self.len());\n    }\n\n    pub fn get_tokens(&self) -> &[String] {\n        &self.tokens[..]\n    }\n\n    pub fn get_word_ids(&self) -> &[Option<u32>] {\n        &self.words\n    }\n\n    pub fn get_word_ids_mut(&mut self) -> &mut [Option<u32>] {\n        &mut self.words\n    }\n\n    pub fn get_sequence_ids(&self) -> Vec<Option<usize>> {\n        let mut sequences = vec![None; self.len()];\n        for seq_id in 0..self.n_sequences() {\n            let range = self.sequence_range(seq_id);\n            let seq_len = range.len();\n            sequences.splice(range, std::iter::repeat_n(Some(seq_id), seq_len));\n        }\n        sequences\n    }\n\n    pub fn get_ids(&self) -> &[u32] {\n        &self.ids\n    }\n\n    pub fn get_type_ids(&self) -> &[u32] {\n        &self.type_ids\n    }\n\n    pub fn set_type_ids(&mut self, type_ids: Vec<u32>) {\n        self.type_ids = type_ids;\n    }\n\n    pub fn get_offsets(&self) -> &[Offsets] {\n        &self.offsets\n    }\n\n    pub fn get_offsets_mut(&mut self) -> &mut [Offsets] {\n        &mut self.offsets\n    }\n\n    pub fn get_special_tokens_mask(&self) -> &[u32] {\n        &self.special_tokens_mask\n    }\n\n    pub fn get_attention_mask(&self) -> &[u32] {\n        &self.attention_mask\n    }\n\n    pub fn get_overflowing(&self) -> &Vec<Encoding> {\n        &self.overflowing\n    }\n\n    pub fn set_overflowing(&mut self, overflowing: Vec<Encoding>) {\n        self.overflowing = overflowing;\n    }\n\n    pub fn get_overflowing_mut(&mut self) -> &mut Vec<Encoding> {\n        &mut self.overflowing\n    }\n\n    pub fn take_overflowing(&mut self) -> Vec<Encoding> {\n        std::mem::take(&mut self.overflowing)\n    }\n\n    pub(crate) fn process_tokens_with_offsets_mut<F>(&mut self, func: F)\n    where\n        F: FnMut((usize, (&String, &mut Offsets))),\n    {\n        self.tokens\n            .iter()\n            .zip(self.offsets.iter_mut())\n            .enumerate()\n            .for_each(func)\n    }\n\n    /// Returns the range to target to retrieve something (word_id, offsets, ..) related to the\n    /// given sequence id\n    fn sequence_range(&self, sequence_id: usize) -> Range<usize> {\n        self.sequence_ranges\n            .get(&sequence_id)\n            .cloned()\n            .unwrap_or(0..self.len())\n    }\n\n    /// Returns the index of the sequence containing the given token\n    pub fn token_to_sequence(&self, token: usize) -> Option<usize> {\n        if token > self.len() {\n            None\n        } else if self.sequence_ranges.is_empty() {\n            Some(0)\n        } else {\n            self.sequence_ranges.iter().find_map(|(seq_id, range)| {\n                if range.contains(&token) {\n                    Some(*seq_id)\n                } else {\n                    None\n                }\n            })\n        }\n    }\n\n    /// Get the encoded tokens corresponding to the word at the given index in the input sequence,\n    /// with the form (start_token, end_token + 1)\n    pub fn word_to_tokens(&self, word: u32, sequence_id: usize) -> Option<(usize, usize)> {\n        let (mut start, mut end) = (None, None);\n        let sequence_range = self.sequence_range(sequence_id);\n\n        self.words\n            .get(sequence_range.clone())?\n            .iter()\n            .enumerate()\n            .take_while(|(_, w)| **w <= Some(word))\n            .filter(|(_, w)| **w == Some(word))\n            .for_each(|(i, _)| {\n                if start.is_none() || Some(i) < start {\n                    start = Some(i);\n                }\n                if end.is_none() || Some(i) >= end {\n                    end = Some(i + 1);\n                }\n            });\n\n        if let (Some(start), Some(end)) = (start, end) {\n            Some((sequence_range.start + start, sequence_range.start + end))\n        } else {\n            None\n        }\n    }\n\n    /// Get the offsets of the word at the given index in the input sequence.\n    pub fn word_to_chars(&self, word: u32, sequence_id: usize) -> Option<Offsets> {\n        self.word_to_tokens(word, sequence_id)\n            .and_then(|(start, end)| {\n                if end == 0 {\n                    None\n                } else {\n                    Some((self.offsets[start].0, self.offsets[end - 1].1))\n                }\n            })\n    }\n\n    /// Get the offsets of the token at the given index.\n    pub fn token_to_chars(&self, token: usize) -> Option<(usize, Offsets)> {\n        Some((\n            self.token_to_sequence(token)?,\n            self.offsets.get(token).copied()?,\n        ))\n    }\n\n    /// Get the word that contains the token at the given index.\n    pub fn token_to_word(&self, token: usize) -> Option<(usize, u32)> {\n        Some((\n            self.token_to_sequence(token)?,\n            self.words.get(token).copied().flatten()?,\n        ))\n    }\n\n    /// Get the token that contains the given char.\n    pub fn char_to_token(&self, pos: usize, sequence_id: usize) -> Option<usize> {\n        let sequence_range = self.sequence_range(sequence_id);\n\n        self.offsets\n            .get(sequence_range.clone())?\n            .iter()\n            .position(|(start, end)| pos >= *start && pos < *end)\n            .map(|pos| sequence_range.start + pos)\n    }\n\n    /// Get the word that contains the given char.\n    pub fn char_to_word(&self, pos: usize, sequence_id: usize) -> Option<u32> {\n        Some(\n            self.char_to_token(pos, sequence_id)\n                .and_then(|token| self.token_to_word(token))?\n                .1,\n        )\n    }\n\n    /// Truncate the current `Encoding`.\n    ///\n    /// Panics if `stride >= max_len`\n    pub fn truncate(&mut self, max_len: usize, stride: usize, direction: TruncationDirection) {\n        let encoding_len = self.ids.len();\n        if max_len >= encoding_len {\n            return;\n        }\n\n        if max_len == 0 {\n            let o = std::mem::replace(self, Encoding::with_capacity(0));\n            self.overflowing.push(o);\n            return;\n        }\n\n        assert!(stride < max_len, \"`stride` must be strictly less than `max_len={}` (note that `max_len` may be shorter than the max length of the original model, as it subtracts the number of special characters\", max_len);\n\n        // When truncating, we lose the `sequence_ranges` information.\n        self.sequence_ranges.clear();\n\n        let offset = max_len - stride;\n        let mut end = false;\n        let parts_ranges: Vec<(usize, usize)> = match direction {\n            TruncationDirection::Right => (0..encoding_len)\n                .step_by(offset)\n                .filter_map(|start| {\n                    if !end {\n                        let stop = std::cmp::min(start + max_len, encoding_len);\n                        end = stop == encoding_len;\n                        Some((start, stop))\n                    } else {\n                        None\n                    }\n                })\n                .collect(),\n            TruncationDirection::Left => (0..encoding_len)\n                .rev()\n                .step_by(offset)\n                .filter_map(|stop| {\n                    let stop = stop + 1;\n                    let start = stop.saturating_sub(max_len);\n                    if start < stop && !end {\n                        end = start == 0;\n                        Some((start, stop))\n                    } else {\n                        None\n                    }\n                })\n                .collect(),\n        };\n\n        let mut i = 0;\n        let (start, stop) = parts_ranges[i];\n        let mut new_encoding = Encoding {\n            ids: self.ids[start..stop].to_vec(),\n            type_ids: self.type_ids[start..stop].to_vec(),\n            tokens: self.tokens[start..stop].to_vec(),\n            words: self.words[start..stop].to_vec(),\n            offsets: self.offsets[start..stop].to_vec(),\n            special_tokens_mask: self.special_tokens_mask[start..stop].to_vec(),\n            attention_mask: self.attention_mask[start..stop].to_vec(),\n            overflowing: vec![],\n            sequence_ranges: AHashMap::new(),\n        };\n\n        loop {\n            if i == parts_ranges.len() - 1 {\n                break;\n            }\n            i += 1;\n            let (start, stop) = parts_ranges[i];\n            new_encoding.overflowing.push(Encoding {\n                ids: self.ids[start..stop].to_vec(),\n                type_ids: self.type_ids[start..stop].to_vec(),\n                tokens: self.tokens[start..stop].to_vec(),\n                words: self.words[start..stop].to_vec(),\n                offsets: self.offsets[start..stop].to_vec(),\n                special_tokens_mask: self.special_tokens_mask[start..stop].to_vec(),\n                attention_mask: self.attention_mask[start..stop].to_vec(),\n                overflowing: vec![],\n                sequence_ranges: AHashMap::new(),\n            });\n        }\n        *self = new_encoding;\n    }\n\n    /// Merge all Encodings together\n    pub fn merge<I: IntoIterator<Item = Encoding>>(encodings: I, growing_offsets: bool) -> Self {\n        let mut encoding = Encoding::default();\n\n        // TODO this is suboptimal as we're doing this iteratively instead of preallocating\n        // all the encodings sizes all at once and only copying into this preallocated vector\n        // https://github.com/huggingface/tokenizers/pull/1049\n\n        // In order to fix, we just need to preallocate all vectors, then copy everything\n        // into it (and deal with overlowings correctly)\n        for sub in encodings {\n            encoding.merge_with(sub, growing_offsets);\n        }\n\n        encoding\n    }\n\n    /// Merge ourself with the given `Encoding`. Happens in place.\n    pub fn merge_with(&mut self, pair: Encoding, growing_offsets: bool) {\n        // Handle merging the overflowing parts too: Combine them all\n        // In most of the cases, we expect `pair.overflowing.len() == 0`\n        let mut overflowings = vec![];\n\n        // 1. All our overflowings with all the others\n        for self_o in &self.overflowing {\n            // 1. The pair itself\n            let mut n_encoding = self_o.clone();\n            n_encoding.merge_with(pair.clone(), growing_offsets);\n            overflowings.push(n_encoding);\n\n            // 2. Its overflowings (this should rarely happen...)\n            for other_o in &pair.overflowing {\n                let mut n_encoding = self_o.clone();\n                n_encoding.merge_with(other_o.clone(), growing_offsets);\n                overflowings.push(n_encoding);\n            }\n        }\n        // 2. Ourself with all the other overflowings (this should rarely happen too...)\n        for other_o in &pair.overflowing {\n            let mut n_encoding = self.clone();\n            n_encoding.merge_with(other_o.clone(), growing_offsets);\n            overflowings.push(n_encoding);\n        }\n\n        // Finish by merging ourself with the other encoding\n        let original_self_len = self.len(); // Must be before any modification to self.ids\n\n        self.sequence_ranges\n            .extend(pair.sequence_ranges.into_iter().map(|(seq_id, range)| {\n                (\n                    seq_id,\n                    original_self_len + range.start..original_self_len + range.end,\n                )\n            }));\n        self.ids.extend(pair.ids);\n        self.type_ids.extend(pair.type_ids);\n        self.tokens.extend(pair.tokens);\n        self.words.extend(pair.words);\n\n        let starting_offset = if growing_offsets {\n            self.offsets.last().map_or(0, |o| o.1)\n        } else {\n            0\n        };\n        self.offsets.extend(\n            pair.offsets\n                .into_iter()\n                .map(|(start, end)| (start + starting_offset, end + starting_offset))\n                .collect::<Vec<_>>(),\n        );\n        self.special_tokens_mask.extend(pair.special_tokens_mask);\n        self.attention_mask.extend(pair.attention_mask);\n        self.overflowing = overflowings;\n    }\n\n    pub fn pad(\n        &mut self,\n        target_length: usize,\n        pad_id: u32,\n        pad_type_id: u32,\n        pad_token: &str,\n        direction: PaddingDirection,\n    ) {\n        // Dispatch call to all the overflowings first\n        self.overflowing.maybe_par_iter_mut().for_each(|encoding| {\n            encoding.pad(target_length, pad_id, pad_type_id, pad_token, direction)\n        });\n\n        // Then check if we should pad ourself\n        if self.ids.len() >= target_length {\n            // We just do nothing if the wanted padding length is smaller than us\n            return;\n        }\n        let pad_length = target_length - self.ids.len();\n\n        match direction {\n            PaddingDirection::Left => {\n                self.ids = (0..pad_length)\n                    .map(|_| pad_id)\n                    .chain(self.ids.drain(..))\n                    .collect();\n                self.type_ids = (0..pad_length)\n                    .map(|_| pad_type_id)\n                    .chain(self.type_ids.drain(..))\n                    .collect();\n                self.tokens = (0..pad_length)\n                    .map(|_| pad_token.to_owned())\n                    .chain(self.tokens.drain(..))\n                    .collect();\n                self.words = (0..pad_length)\n                    .map(|_| None)\n                    .chain(self.words.drain(..))\n                    .collect();\n                self.attention_mask = (0..pad_length)\n                    .map(|_| 0)\n                    .chain(self.attention_mask.drain(..))\n                    .collect();\n                self.special_tokens_mask = (0..pad_length)\n                    .map(|_| 1)\n                    .chain(self.special_tokens_mask.drain(..))\n                    .collect();\n                self.offsets = (0..pad_length)\n                    .map(|_| (0, 0))\n                    .chain(self.offsets.drain(..))\n                    .collect();\n                self.sequence_ranges\n                    .iter_mut()\n                    .for_each(|(_seq_id, range)| {\n                        *range = (range.start + pad_length)..(range.end + pad_length)\n                    });\n            }\n            PaddingDirection::Right => {\n                self.ids.extend((0..pad_length).map(|_| pad_id));\n                self.type_ids.extend((0..pad_length).map(|_| pad_type_id));\n                self.tokens\n                    .extend((0..pad_length).map(|_| pad_token.to_owned()));\n                self.words.extend((0..pad_length).map(|_| None));\n                self.attention_mask.extend((0..pad_length).map(|_| 0));\n                self.special_tokens_mask.extend((0..pad_length).map(|_| 1));\n                self.offsets.extend((0..pad_length).map(|_| (0, 0)));\n            }\n        }\n    }\n}\n\nimpl std::iter::FromIterator<Encoding> for Encoding {\n    fn from_iter<I: IntoIterator<Item = Encoding>>(iter: I) -> Self {\n        Self::merge(iter, false)\n    }\n}\n\nimpl std::iter::FromIterator<(u32, String, (usize, usize), Option<u32>, u32)> for Encoding {\n    fn from_iter<I: IntoIterator<Item = (u32, String, (usize, usize), Option<u32>, u32)>>(\n        iter: I,\n    ) -> Self {\n        let items = iter.into_iter();\n        let (lower, upper) = items.size_hint();\n        let length = upper.unwrap_or(lower);\n        let mut encoding = Self::with_capacity(length);\n\n        for (id, token, offsets, word, type_id) in items {\n            encoding.ids.push(id);\n            encoding.tokens.push(token);\n            encoding.offsets.push(offsets);\n            encoding.type_ids.push(type_id);\n            encoding.words.push(word);\n            encoding.special_tokens_mask.push(0);\n            encoding.attention_mask.push(1);\n        }\n\n        encoding\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::iter::FromIterator;\n\n    #[test]\n    fn merge_encodings() {\n        let mut a = Encoding {\n            ids: vec![1],\n            type_ids: vec![0],\n            tokens: vec![String::from(\"Hello \")],\n            words: vec![Some(0)],\n            offsets: vec![(0, 6)],\n            special_tokens_mask: vec![0],\n            attention_mask: vec![1],\n            ..Default::default()\n        };\n        let b = Encoding {\n            ids: vec![2],\n            type_ids: vec![1],\n            tokens: vec![String::from(\"World!\")],\n            words: vec![Some(0)],\n            offsets: vec![(0, 6)],\n            special_tokens_mask: vec![0],\n            attention_mask: vec![1],\n            ..Default::default()\n        };\n        a.merge_with(b, true);\n\n        assert_eq!(\n            a,\n            Encoding {\n                ids: vec![1, 2],\n                type_ids: vec![0, 1],\n                tokens: vec![String::from(\"Hello \"), String::from(\"World!\")],\n                words: vec![Some(0), Some(0)],\n                offsets: vec![(0, 6), (6, 12)],\n                special_tokens_mask: vec![0, 0],\n                attention_mask: vec![1, 1],\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn truncate() {\n        let mut a = Encoding {\n            ids: vec![1, 2, 3],\n            type_ids: vec![0, 0, 0],\n            tokens: vec![\n                String::from(\"Hello\"),\n                String::from(\"World\"),\n                String::from(\"!\"),\n            ],\n            words: vec![Some(0), Some(1), Some(2)],\n            offsets: vec![(0, 5), (6, 11), (11, 12)],\n            special_tokens_mask: vec![0, 0, 0],\n            attention_mask: vec![1, 1, 1],\n            ..Default::default()\n        };\n        a.truncate(2, 0, TruncationDirection::Right);\n\n        assert_eq!(\n            a,\n            Encoding {\n                ids: vec![1, 2],\n                type_ids: vec![0, 0],\n                tokens: vec![String::from(\"Hello\"), String::from(\"World\")],\n                words: vec![Some(0), Some(1)],\n                offsets: vec![(0, 5), (6, 11)],\n                special_tokens_mask: vec![0, 0],\n                attention_mask: vec![1, 1],\n                overflowing: vec![Encoding {\n                    ids: vec![3],\n                    type_ids: vec![0],\n                    tokens: vec![String::from(\"!\")],\n                    words: vec![Some(2)],\n                    offsets: vec![(11, 12)],\n                    special_tokens_mask: vec![0],\n                    attention_mask: vec![1],\n                    ..Default::default()\n                }],\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn truncate_to_empty() {\n        let mut a = Encoding {\n            ids: vec![1, 2, 3],\n            type_ids: vec![0, 0, 0],\n            tokens: vec![\n                String::from(\"Hello\"),\n                String::from(\"World\"),\n                String::from(\"!\"),\n            ],\n            words: vec![Some(0), Some(1), Some(2)],\n            offsets: vec![(0, 5), (6, 11), (11, 12)],\n            special_tokens_mask: vec![0, 0, 0],\n            attention_mask: vec![1, 1, 1],\n            ..Default::default()\n        };\n        a.truncate(0, 0, TruncationDirection::Right);\n\n        assert_eq!(\n            a,\n            Encoding {\n                overflowing: vec![Encoding {\n                    ids: vec![1, 2, 3],\n                    type_ids: vec![0, 0, 0],\n                    tokens: vec![\n                        String::from(\"Hello\"),\n                        String::from(\"World\"),\n                        String::from(\"!\"),\n                    ],\n                    words: vec![Some(0), Some(1), Some(2)],\n                    offsets: vec![(0, 5), (6, 11), (11, 12)],\n                    special_tokens_mask: vec![0, 0, 0],\n                    attention_mask: vec![1, 1, 1],\n                    overflowing: vec![],\n                    ..Default::default()\n                }],\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn truncate_overflow_with_stride() {\n        let mut enc = Encoding {\n            ids: vec![1, 2, 3, 4, 5],\n            type_ids: vec![0, 0, 0, 0, 0],\n            tokens: vec![\n                String::from(\"42\"),\n                String::from(\"is\"),\n                String::from(\"the\"),\n                String::from(\"answer\"),\n                String::from(\"!\"),\n            ],\n            words: vec![Some(0), Some(1), Some(2), Some(3), Some(4)],\n            offsets: vec![(0, 2), (2, 4), (4, 7), (7, 13), (13, 14)],\n            special_tokens_mask: vec![0, 0, 0, 0, 0],\n            attention_mask: vec![1, 1, 1, 1, 1],\n            overflowing: vec![],\n            ..Default::default()\n        };\n        enc.truncate(4, 2, TruncationDirection::Right);\n\n        assert_eq!(\n            enc,\n            Encoding {\n                ids: vec![1, 2, 3, 4],\n                type_ids: vec![0, 0, 0, 0],\n                tokens: vec![\n                    String::from(\"42\"),\n                    String::from(\"is\"),\n                    String::from(\"the\"),\n                    String::from(\"answer\"),\n                ],\n                words: vec![Some(0), Some(1), Some(2), Some(3)],\n                offsets: vec![(0, 2), (2, 4), (4, 7), (7, 13)],\n                special_tokens_mask: vec![0, 0, 0, 0],\n                attention_mask: vec![1, 1, 1, 1],\n                overflowing: vec![Encoding {\n                    ids: vec![3, 4, 5],\n                    type_ids: vec![0, 0, 0],\n                    tokens: vec![\n                        String::from(\"the\"),\n                        String::from(\"answer\"),\n                        String::from(\"!\"),\n                    ],\n                    words: vec![Some(2), Some(3), Some(4)],\n                    offsets: vec![(4, 7), (7, 13), (13, 14)],\n                    special_tokens_mask: vec![0, 0, 0],\n                    attention_mask: vec![1, 1, 1],\n                    overflowing: vec![],\n                    ..Default::default()\n                }],\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn truncate_left() {\n        let mut a = Encoding {\n            ids: vec![1, 2, 3],\n            type_ids: vec![0, 0, 0],\n            tokens: vec![\n                String::from(\"Hello\"),\n                String::from(\"World\"),\n                String::from(\"!\"),\n            ],\n            words: vec![Some(0), Some(1), Some(2)],\n            offsets: vec![(0, 5), (6, 11), (11, 12)],\n            special_tokens_mask: vec![0, 0, 0],\n            attention_mask: vec![1, 1, 1],\n            ..Default::default()\n        };\n        a.truncate(2, 0, TruncationDirection::Left);\n\n        assert_eq!(\n            a,\n            Encoding {\n                ids: vec![2, 3],\n                type_ids: vec![0, 0],\n                tokens: vec![String::from(\"World\"), String::from(\"!\")],\n                words: vec![Some(1), Some(2)],\n                offsets: vec![(6, 11), (11, 12)],\n                special_tokens_mask: vec![0, 0],\n                attention_mask: vec![1, 1],\n                overflowing: vec![Encoding {\n                    ids: vec![1],\n                    type_ids: vec![0],\n                    tokens: vec![String::from(\"Hello\")],\n                    words: vec![Some(0)],\n                    offsets: vec![(0, 5)],\n                    special_tokens_mask: vec![0],\n                    attention_mask: vec![1],\n                    ..Default::default()\n                }],\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn mappings() {\n        let encoding = Encoding {\n            ids: vec![0; 11], // Needed for Encoding::len\n            tokens: vec![\n                // First sequence:\n                \"He\".into(),\n                \"llo\".into(),\n                \"won\".into(),\n                \"der\".into(),\n                \"ful\".into(),\n                \"friend\".into(),\n                \"!\".into(),\n                // Second sequence:\n                \"How\".into(),\n                \"are\".into(),\n                \"you\".into(),\n                \"?\".into(),\n            ],\n            offsets: vec![\n                // First sequence:\n                (0, 2),\n                (2, 5),\n                (7, 10),\n                (10, 13),\n                (13, 16),\n                (17, 23),\n                (23, 24),\n                // Second sequence:\n                (0, 3),\n                (4, 7),\n                (8, 11),\n                (11, 12),\n            ],\n            words: vec![\n                // First sequence:\n                Some(0),\n                Some(0),\n                Some(1),\n                Some(1),\n                Some(1),\n                Some(2),\n                Some(3),\n                // Second sequence:\n                Some(0),\n                Some(1),\n                Some(2),\n                Some(3),\n            ],\n            sequence_ranges: AHashMap::from_iter(vec![(0, 0..7), (1, 7..11)]),\n            ..Default::default()\n        };\n        assert_eq!(encoding.word_to_tokens(0, 0), Some((0, 2)));\n        assert_eq!(encoding.word_to_tokens(1, 0), Some((2, 5)));\n        assert_eq!(encoding.word_to_tokens(2, 0), Some((5, 6)));\n        assert_eq!(encoding.word_to_tokens(3, 0), Some((6, 7)));\n        assert_eq!(encoding.word_to_tokens(0, 1), Some((7, 8)));\n        assert_eq!(encoding.word_to_tokens(1, 1), Some((8, 9)));\n        assert_eq!(encoding.word_to_tokens(2, 1), Some((9, 10)));\n        assert_eq!(encoding.word_to_tokens(3, 1), Some((10, 11)));\n\n        assert_eq!(encoding.word_to_chars(0, 0), Some((0, 5)));\n        assert_eq!(encoding.word_to_chars(1, 0), Some((7, 16)));\n        assert_eq!(encoding.word_to_chars(0, 1), Some((0, 3)));\n        assert_eq!(encoding.word_to_chars(1, 1), Some((4, 7)));\n\n        assert_eq!(encoding.token_to_chars(0), Some((0, (0, 2))));\n        assert_eq!(encoding.token_to_chars(1), Some((0, (2, 5))));\n        assert_eq!(encoding.token_to_chars(7), Some((1, (0, 3))));\n        assert_eq!(encoding.token_to_chars(9), Some((1, (8, 11))));\n\n        assert_eq!(encoding.token_to_word(1), Some((0, 0)));\n        assert_eq!(encoding.token_to_word(2), Some((0, 1)));\n        assert_eq!(encoding.token_to_word(7), Some((1, 0)));\n        assert_eq!(encoding.token_to_word(9), Some((1, 2)));\n        assert_eq!(encoding.token_to_word(11), None);\n\n        assert_eq!(encoding.char_to_token(3, 0), Some(1));\n        assert_eq!(encoding.char_to_token(8, 0), Some(2));\n        assert_eq!(encoding.char_to_token(16, 0), None);\n        assert_eq!(encoding.char_to_token(23, 0), Some(6));\n        assert_eq!(encoding.char_to_token(2, 1), Some(7));\n        assert_eq!(encoding.char_to_token(9, 1), Some(9));\n\n        assert_eq!(encoding.char_to_word(3, 0), Some(0));\n        assert_eq!(encoding.char_to_word(8, 0), Some(1));\n        assert_eq!(encoding.char_to_word(16, 0), None);\n        assert_eq!(encoding.char_to_word(23, 0), Some(3));\n        assert_eq!(encoding.char_to_word(2, 1), Some(0));\n        assert_eq!(encoding.char_to_word(9, 1), Some(2));\n    }\n\n    #[test]\n    fn padding() {\n        let mut a = Encoding {\n            ids: vec![1],\n            type_ids: vec![0],\n            tokens: vec![String::from(\"Hello \")],\n            words: vec![Some(0)],\n            offsets: vec![(0, 6)],\n            special_tokens_mask: vec![0],\n            attention_mask: vec![1],\n            sequence_ranges: AHashMap::from([(0, 0..1)]),\n            ..Default::default()\n        };\n        let target_length = 2;\n        let pad_id = 99;\n        let pad_type_id = 0;\n        let pad_token = \"[PAD]\";\n        a.pad(\n            target_length,\n            pad_id,\n            pad_type_id,\n            pad_token,\n            PaddingDirection::Left,\n        );\n        assert_eq!(a.sequence_ranges, AHashMap::from([(0, 1..2)]));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/mod.rs",
    "content": "//! Represents a tokenization pipeline.\n//!\n//! A [`Tokenizer`](struct.Tokenizer.html) is composed of some of the following parts.\n//!   - [`Normalizer`](trait.Normalizer.html): Takes care of the text normalization (like unicode normalization).\n//!   - [`PreTokenizer`](trait.PreTokenizer.html): Takes care of the pre tokenization (ie. How to split tokens and pre-process\n//!     them.\n//!   - [`Model`](trait.Model.html): A model encapsulates the tokenization algorithm (like BPE, Word base, character\n//!     based, ...).\n//!   - [`PostProcessor`](trait.PostProcessor.html): Takes care of the processing after tokenization (like truncating, padding,\n//!     ...).\n\nuse ahash::AHashMap;\nuse std::{\n    fs::{read_to_string, File},\n    io::{prelude::*, BufReader},\n    ops::{Deref, DerefMut},\n    path::{Path, PathBuf},\n};\n\nuse serde::de::DeserializeOwned;\nuse serde::{Deserialize, Serialize};\n\nuse crate::utils::iter::ResultShunt;\nuse crate::utils::parallelism::*;\nuse crate::utils::progress::{ProgressBar, ProgressStyle};\n\nmod added_vocabulary;\nmod encoding;\npub mod normalizer;\npub mod pattern;\npub mod pre_tokenizer;\nmod serialization;\n\n// Re-export wrappers\npub use crate::decoders::DecoderWrapper;\npub use crate::models::ModelWrapper;\npub use crate::normalizers::NormalizerWrapper;\npub use crate::pre_tokenizers::PreTokenizerWrapper;\npub use crate::processors::PostProcessorWrapper;\n// And some other types\npub use crate::utils::iter::LinesWithEnding;\npub use crate::utils::padding::{pad_encodings, PaddingDirection, PaddingParams, PaddingStrategy};\npub use crate::utils::truncation::{\n    truncate_encodings, TruncationDirection, TruncationParams, TruncationStrategy,\n};\npub use added_vocabulary::*;\npub use encoding::*;\npub use normalizer::{NormalizedString, OffsetReferential, SplitDelimiterBehavior};\npub use pre_tokenizer::*;\n\npub type Error = Box<dyn std::error::Error + Send + Sync>;\npub type Result<T> = std::result::Result<T, Error>;\npub type Offsets = (usize, usize);\n\n/// Takes care of pre-processing strings.\npub trait Normalizer {\n    fn normalize(&self, normalized: &mut NormalizedString) -> Result<()>;\n}\n\n/// The `PreTokenizer` is in charge of doing the pre-segmentation step. It splits the given string\n/// in multiple substrings, keeping track of the offsets of said substrings from the\n/// `NormalizedString`. In some occasions, the `PreTokenizer` might need to modify the given\n/// `NormalizedString` to ensure we can entirely keep track of the offsets and the mapping with\n/// the original string.\npub trait PreTokenizer {\n    fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()>;\n}\n\n/// Represents a model used during Tokenization (like BPE or Word or Unigram).\npub trait Model {\n    type Trainer: Trainer + Sync;\n    /// Tokenize the given sequence into multiple underlying `Token`. The `offsets` on the `Token`\n    /// are expected to be relative to the given sequence.\n    fn tokenize(&self, sequence: &str) -> Result<Vec<Token>>;\n    /// Find the ID associated to a string token\n    fn token_to_id(&self, token: &str) -> Option<u32>;\n    /// Find the string token associated to an ID\n    fn id_to_token(&self, id: u32) -> Option<String>;\n    /// Retrieve the entire vocabulary mapping (token -> ID)\n    fn get_vocab(&self) -> HashMap<String, u32>;\n    /// Retrieve the size of the vocabulary\n    fn get_vocab_size(&self) -> usize;\n    /// Save the current `Model` in the given folder, using the given `prefix` for the various\n    /// files that need to be saved.\n    fn save(&self, folder: &Path, prefix: Option<&str>) -> Result<Vec<PathBuf>>;\n    /// Get an instance of a Trainer capable of training this Model\n    fn get_trainer(&self) -> <Self as Model>::Trainer;\n}\n\n/// A `PostProcessor` has the responsibility to post process an encoded output of the `Tokenizer`.\n/// It adds any special tokens that a language model would require.\npub trait PostProcessor {\n    /// Returns the number of tokens that will be added during the processing step\n    fn added_tokens(&self, is_pair: bool) -> usize;\n    /// Process both encodings and returns a new merged one\n    fn process(\n        &self,\n        encoding: Encoding,\n        pair_encoding: Option<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Encoding> {\n        let mut encodings = if let Some(pair_encoding) = pair_encoding {\n            vec![encoding, pair_encoding]\n        } else {\n            vec![encoding]\n        };\n        encodings.iter_mut().enumerate().for_each(|(i, encoding)| {\n            encoding.set_sequence_id(i);\n            encoding\n                .get_overflowing_mut()\n                .iter_mut()\n                .for_each(|encoding| encoding.set_sequence_id(i));\n            encoding.set_type_ids(vec![i as u32; encoding.len()]);\n        });\n\n        let encodings = self.process_encodings(encodings, add_special_tokens)?;\n        Ok(Encoding::merge(encodings, false))\n    }\n\n    /// Process any amount of encodings and returns a series of encoding (might merge them)\n    fn process_encodings(\n        &self,\n        encodings: Vec<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>>;\n}\nimpl dyn PostProcessor {\n    pub fn default_process(\n        encodings: Vec<Encoding>,\n        _add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>> {\n        match encodings.len() {\n            1 => Ok(encodings),\n            _ => {\n                let mut final_encoding = Encoding::default();\n                for (i, mut encoding) in encodings.into_iter().enumerate() {\n                    encoding.set_sequence_id(i);\n                    final_encoding.merge_with(encoding, false);\n                }\n                Ok(vec![final_encoding])\n            }\n        }\n    }\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum ProcessorError {\n    #[error(\"encodings vector length must be either 1 or 2\")]\n    InvalidEncodingsVecLength,\n}\n\n/// A `Decoder` changes the raw tokens into its more readable form.\npub trait Decoder {\n    fn decode(&self, tokens: Vec<String>) -> Result<String> {\n        let results = self.decode_chain(tokens)?;\n        Ok(results.join(\"\"))\n    }\n    fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>>;\n}\n\n/// A `Trainer` has the responsibility to train a model. We feed it with lines/sentences\n/// and then it can train the given `Model`.\npub trait Trainer {\n    type Model: Model + Sized;\n    /// Whether we should show progress during the training.\n    fn should_show_progress(&self) -> bool;\n    /// The actual training method. This will return a new trained Model as well as a list\n    /// of `special_tokens` to be added directly to the tokenizer along with the model.\n    fn train(&self, model: &mut Self::Model) -> Result<Vec<AddedToken>>;\n    /// Process an iterator of sequences, calling `process` for each of them in order to\n    /// pre-process the said sequence as relevant.\n    fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>\n    where\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n        F: Fn(&str) -> Result<Vec<String>> + Sync;\n}\n\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct Token {\n    pub id: u32,\n    pub value: String,\n    pub offsets: (usize, usize),\n}\nimpl Token {\n    pub fn new(id: u32, value: String, offsets: (usize, usize)) -> Self {\n        Self { id, value, offsets }\n    }\n}\n\nuse std::borrow::Cow;\nuse std::collections::HashMap;\n\n#[derive(Debug, Clone)]\npub enum InputSequence<'s> {\n    Raw(Cow<'s, str>),\n    PreTokenized(Cow<'s, [&'s str]>),\n    PreTokenizedOwned(Cow<'s, [String]>),\n    PreTokenizedCow(Cow<'s, [Cow<'s, str>]>),\n}\n\nimpl<'s> From<Cow<'s, str>> for InputSequence<'s> {\n    fn from(input: Cow<'s, str>) -> Self {\n        Self::Raw(input)\n    }\n}\n\nimpl<'s> From<&'s str> for InputSequence<'s> {\n    fn from(input: &'s str) -> Self {\n        Self::Raw(Cow::Borrowed(input))\n    }\n}\n\nimpl From<String> for InputSequence<'_> {\n    fn from(input: String) -> Self {\n        Self::Raw(Cow::Owned(input))\n    }\n}\n\nimpl<'s> From<&'s [&'s str]> for InputSequence<'s> {\n    fn from(input: &'s [&'s str]) -> Self {\n        Self::PreTokenized(Cow::Borrowed(input))\n    }\n}\n\nimpl<'s> From<Vec<&'s str>> for InputSequence<'s> {\n    fn from(input: Vec<&'s str>) -> Self {\n        Self::PreTokenized(Cow::Owned(input))\n    }\n}\n\nimpl<'s> From<&'s [String]> for InputSequence<'s> {\n    fn from(input: &'s [String]) -> Self {\n        Self::PreTokenizedOwned(Cow::Borrowed(input))\n    }\n}\n\nimpl From<Vec<String>> for InputSequence<'_> {\n    fn from(input: Vec<String>) -> Self {\n        Self::PreTokenizedOwned(Cow::Owned(input))\n    }\n}\n\nimpl<'s> From<Vec<Cow<'s, str>>> for InputSequence<'s> {\n    fn from(input: Vec<Cow<'s, str>>) -> Self {\n        Self::PreTokenizedCow(Cow::Owned(input))\n    }\n}\n\nimpl<'s> From<&'s [Cow<'s, str>]> for InputSequence<'s> {\n    fn from(input: &'s [Cow<'s, str>]) -> Self {\n        Self::PreTokenizedCow(Cow::Borrowed(input))\n    }\n}\n\n#[derive(Debug, Clone)]\npub enum EncodeInput<'s> {\n    Single(InputSequence<'s>),\n    Dual(InputSequence<'s>, InputSequence<'s>),\n}\n\nimpl<'s, I: Into<InputSequence<'s>>> From<I> for EncodeInput<'s> {\n    fn from(input: I) -> Self {\n        Self::Single(input.into())\n    }\n}\n\nimpl<'s, I1, I2> From<(I1, I2)> for EncodeInput<'s>\nwhere\n    I1: Into<InputSequence<'s>>,\n    I2: Into<InputSequence<'s>>,\n{\n    fn from(input: (I1, I2)) -> Self {\n        Self::Dual(input.0.into(), input.1.into())\n    }\n}\n\n#[derive(thiserror::Error, Debug)]\n#[error(\"{0}\")]\npub struct BuilderError(String);\n\n/// Builder for Tokenizer structs.\n///\n/// `build()` fails if the `model` is missing.\npub struct TokenizerBuilder<M, N, PT, PP, D> {\n    model: Option<M>,\n    normalizer: Option<N>,\n    pre_tokenizer: Option<PT>,\n    post_processor: Option<PP>,\n    decoder: Option<D>,\n\n    added_vocabulary: AddedVocabulary,\n\n    truncation: Option<TruncationParams>,\n    padding: Option<PaddingParams>,\n}\n\nimpl<M, N, PT, PP, D> Default for TokenizerBuilder<M, N, PT, PP, D>\nwhere\n    M: Model,\n    N: Normalizer,\n    PT: PreTokenizer,\n    PP: PostProcessor,\n    D: Decoder,\n{\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerBuilder<M, N, PT, PP, D>\nwhere\n    M: Model,\n    N: Normalizer,\n    PT: PreTokenizer,\n    PP: PostProcessor,\n    D: Decoder,\n{\n    /// Get an empty TokenizerBuilder.\n    pub fn new() -> Self {\n        Self {\n            model: None,\n            normalizer: None,\n            pre_tokenizer: None,\n            post_processor: None,\n            decoder: None,\n            added_vocabulary: AddedVocabulary::new(),\n            truncation: None,\n            padding: None,\n        }\n    }\n\n    /// Convert the TokenizerBuilder to a Tokenizer.\n    ///\n    /// Conversion fails if the `model` is missing.\n    pub fn build(self) -> Result<TokenizerImpl<M, N, PT, PP, D>> {\n        let model = self\n            .model\n            .ok_or_else(|| Box::new(BuilderError(\"Model missing.\".into())))?;\n        Ok(TokenizerImpl {\n            normalizer: self.normalizer,\n            pre_tokenizer: self.pre_tokenizer,\n            model,\n\n            post_processor: self.post_processor,\n            decoder: self.decoder,\n            added_vocabulary: self.added_vocabulary,\n            truncation: self.truncation,\n            padding: self.padding,\n        })\n    }\n\n    /// Set the model.\n    #[must_use]\n    pub fn with_model(mut self, model: M) -> Self {\n        self.model = Some(model);\n        self\n    }\n\n    /// Set the normalizer.\n    #[must_use]\n    pub fn with_normalizer(mut self, normalizer: Option<N>) -> Self {\n        self.normalizer = normalizer;\n        self\n    }\n\n    /// Set the pre-tokenizer.\n    #[must_use]\n    pub fn with_pre_tokenizer(mut self, pretokenizer: Option<PT>) -> Self {\n        self.pre_tokenizer = pretokenizer;\n        self\n    }\n\n    /// Set the post-processor.\n    #[must_use]\n    pub fn with_post_processor(mut self, post_processor: Option<PP>) -> Self {\n        self.post_processor = post_processor;\n        self\n    }\n\n    /// Set the decoder.\n    #[must_use]\n    pub fn with_decoder(mut self, decoder: Option<D>) -> Self {\n        self.decoder = decoder;\n        self\n    }\n\n    /// Set the added vocabulary.\n    pub fn with_added_vocabulary(mut self, added_vocabulary: AddedVocabulary) -> Self {\n        self.added_vocabulary = added_vocabulary;\n        self\n    }\n\n    /// Set the truncation parameters.\n    #[must_use]\n    pub fn with_truncation(mut self, trunc: Option<TruncationParams>) -> Self {\n        self.truncation = trunc;\n        self\n    }\n\n    /// Set the padding parameters.\n    #[must_use]\n    pub fn with_padding(mut self, padding: Option<PaddingParams>) -> Self {\n        self.padding = padding;\n        self\n    }\n}\n\n#[derive(Serialize, Deserialize, Debug, Clone)]\npub struct Tokenizer(\n    TokenizerImpl<\n        ModelWrapper,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    >,\n);\n\nimpl Tokenizer {\n    /// Construct a new Tokenizer based on the model.\n    pub fn new(model: impl Into<ModelWrapper>) -> Self {\n        Self(TokenizerImpl::new(model.into()))\n    }\n\n    /// Unwrap the TokenizerImpl.\n    pub fn into_inner(\n        self,\n    ) -> TokenizerImpl<\n        ModelWrapper,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    > {\n        self.0\n    }\n    pub fn from_file<P: AsRef<Path>>(file: P) -> Result<Self> {\n        let content = read_to_string(file)?;\n        let tokenizer = serde_json::from_str(&content)?;\n        Ok(tokenizer)\n    }\n    pub fn from_bytes<P: AsRef<[u8]>>(bytes: P) -> Result<Self> {\n        let tokenizer = serde_json::from_slice(bytes.as_ref())?;\n        Ok(tokenizer)\n    }\n    #[cfg(feature = \"http\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"http\")))]\n    pub fn from_pretrained<S: AsRef<str>>(\n        identifier: S,\n        params: Option<crate::utils::from_pretrained::FromPretrainedParameters>,\n    ) -> Result<Self> {\n        let tokenizer_file = crate::utils::from_pretrained::from_pretrained(identifier, params)?;\n        Tokenizer::from_file(tokenizer_file)\n    }\n}\n\nimpl std::str::FromStr for Tokenizer {\n    type Err = Box<dyn std::error::Error + Send + Sync>;\n\n    fn from_str(s: &str) -> Result<Self> {\n        Ok(serde_json::from_str(s)?)\n    }\n}\n\nimpl<M, N, PT, PP, D> From<TokenizerImpl<M, N, PT, PP, D>> for Tokenizer\nwhere\n    M: Into<ModelWrapper>,\n    N: Into<NormalizerWrapper>,\n    PT: Into<PreTokenizerWrapper>,\n    PP: Into<PostProcessorWrapper>,\n    D: Into<DecoderWrapper>,\n{\n    fn from(t: TokenizerImpl<M, N, PT, PP, D>) -> Self {\n        Self(TokenizerImpl {\n            model: t.model.into(),\n            normalizer: t.normalizer.map(Into::into),\n            pre_tokenizer: t.pre_tokenizer.map(Into::into),\n            post_processor: t.post_processor.map(Into::into),\n            decoder: t.decoder.map(Into::into),\n            added_vocabulary: t.added_vocabulary,\n            padding: t.padding,\n            truncation: t.truncation,\n        })\n    }\n}\n\nimpl Deref for Tokenizer {\n    type Target = TokenizerImpl<\n        ModelWrapper,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    >;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl DerefMut for Tokenizer {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.0\n    }\n}\n\n#[derive(thiserror::Error, Debug)]\n#[error(\"{0}\")]\npub struct TruncationParamError(String);\n\n/// A `Tokenizer` is capable of encoding/decoding any text.\n#[derive(Clone, Debug)]\npub struct TokenizerImpl<M, N, PT, PP, D> {\n    // Tokenizer parts\n    normalizer: Option<N>,\n    pre_tokenizer: Option<PT>,\n    model: M,\n    post_processor: Option<PP>,\n    decoder: Option<D>,\n\n    // Added Vocabulary capabilities\n    added_vocabulary: AddedVocabulary,\n\n    // General processing parameters\n    truncation: Option<TruncationParams>,\n    padding: Option<PaddingParams>,\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: Model,\n    N: Normalizer,\n    PT: PreTokenizer,\n    PP: PostProcessor,\n    D: Decoder,\n{\n    /// Instantiate a new Tokenizer, with the given Model\n    pub fn new(model: M) -> Self {\n        Self {\n            normalizer: None,\n            pre_tokenizer: None,\n            model,\n            post_processor: None,\n            decoder: None,\n\n            added_vocabulary: AddedVocabulary::new(),\n\n            truncation: None,\n            padding: None,\n        }\n    }\n\n    /// Set the normalizer\n    pub fn with_normalizer(&mut self, normalizer: Option<impl Into<N>>) -> &mut Self {\n        self.normalizer = normalizer.map(|norm| norm.into());\n        self\n    }\n    /// Get the normalizer\n    pub fn get_normalizer(&self) -> Option<&N> {\n        self.normalizer.as_ref()\n    }\n\n    /// Set the pre tokenizer\n    pub fn with_pre_tokenizer(&mut self, pre_tokenizer: Option<impl Into<PT>>) -> &mut Self {\n        self.pre_tokenizer = pre_tokenizer.map(|tok| tok.into());\n        self\n    }\n\n    /// Get the pre tokenizer\n    pub fn get_pre_tokenizer(&self) -> Option<&PT> {\n        self.pre_tokenizer.as_ref()\n    }\n\n    /// Set the post processor\n    pub fn with_post_processor(&mut self, post_processor: Option<impl Into<PP>>) -> &mut Self {\n        self.post_processor = post_processor.map(|post_proc| post_proc.into());\n        self\n    }\n\n    /// Get the post processor\n    pub fn get_post_processor(&self) -> Option<&PP> {\n        self.post_processor.as_ref()\n    }\n\n    /// Set the decoder\n    pub fn with_decoder(&mut self, decoder: Option<impl Into<D>>) -> &mut Self {\n        self.decoder = decoder.map(|dec| dec.into());\n        self\n    }\n\n    /// Get the decoder\n    pub fn get_decoder(&self) -> Option<&D> {\n        self.decoder.as_ref()\n    }\n\n    /// Set the model\n    pub fn with_model(&mut self, model: impl Into<M>) -> &mut Self {\n        self.model = model.into();\n        self\n    }\n\n    /// Get the model\n    pub fn get_model(&self) -> &M {\n        &self.model\n    }\n\n    /// Set the added vocabulary.\n    pub fn with_added_vocabulary(&mut self, added_vocabulary: AddedVocabulary) -> &mut Self {\n        self.added_vocabulary = added_vocabulary;\n        self\n    }\n\n    /// Get the added vocabulary\n    pub fn get_added_vocabulary(&self) -> &AddedVocabulary {\n        &self.added_vocabulary\n    }\n\n    /// Set the truncation parameters\n    ///\n    /// Fails if `stride` is too high relative to `max_length` and `post_processor.added_tokens()`\n    pub fn with_truncation(&mut self, trunc: Option<TruncationParams>) -> Result<&mut Self> {\n        if let Some(trunc_params) = &trunc {\n            let n_added_tokens = self.get_n_added_tokens(false);\n            let effective_max_length = trunc_params.max_length - n_added_tokens;\n            if effective_max_length < trunc_params.stride {\n                return Err(Box::new(TruncationParamError(format!(\n                    \"tokenizer stride set to {}, which is greater than or equal to its effective max length of {} (= {} original max length - {} added special tokens), \",\n                    trunc_params.stride, effective_max_length, trunc_params.max_length, n_added_tokens\n                ))));\n            }\n        }\n        self.truncation = trunc;\n        Ok(self)\n    }\n\n    /// Get the currently set truncation parameters\n    pub fn get_truncation(&self) -> Option<&TruncationParams> {\n        self.truncation.as_ref()\n    }\n\n    /// Get a mutable reference to the currently set truncation parameters\n    pub fn get_truncation_mut(&mut self) -> Option<&mut TruncationParams> {\n        self.truncation.as_mut()\n    }\n\n    /// Set the padding parameters\n    pub fn with_padding(&mut self, padding: Option<PaddingParams>) -> &mut Self {\n        self.padding = padding;\n        self\n    }\n\n    /// Get the currently set padding parameters\n    pub fn get_padding(&self) -> Option<&PaddingParams> {\n        self.padding.as_ref()\n    }\n\n    /// Get a mutable reference to the currently set padding parameters\n    pub fn get_padding_mut(&mut self) -> Option<&mut PaddingParams> {\n        self.padding.as_mut()\n    }\n\n    // Get the vocabulary as a plain HashMap for bindings compatibility\n    pub fn get_vocab(&self, with_added_tokens: bool) -> HashMap<String, u32> {\n        let mut final_vocab = self.model.get_vocab();\n\n        if with_added_tokens {\n            let added_vocab = self.added_vocabulary.get_vocab();\n            if !added_vocab.is_empty() {\n                final_vocab.reserve(added_vocab.len());\n                for (token, id) in added_vocab {\n                    final_vocab.insert(token.clone(), *id);\n                }\n            }\n        }\n\n        final_vocab\n    }\n\n    /// Get the added tokens decoder\n    pub fn get_added_tokens_decoder(&self) -> AHashMap<u32, AddedToken> {\n        self.added_vocabulary.get_added_tokens_decoder().clone()\n    }\n\n    /// Get the size of the vocabulary\n    pub fn get_vocab_size(&self, with_added_tokens: bool) -> usize {\n        // TODO ArthurZ THIS IS WRONG! We need to measure the length of the `set` because\n        // now some tokens can be both in the added_tokens_encoder and in the vocab\n        if with_added_tokens {\n            self.get_vocab(true).len()\n        } else {\n            self.model.get_vocab_size()\n        }\n    }\n\n    /// Converts a token in the corresponding id.\n    pub fn token_to_id(&self, token: &str) -> Option<u32> {\n        self.added_vocabulary.token_to_id(token, &self.model)\n    }\n\n    /// Converts an id to the corresponding token.\n    pub fn id_to_token(&self, id: u32) -> Option<String> {\n        self.added_vocabulary\n            .simple_id_to_token(id)\n            .or_else(|| self.model.id_to_token(id))\n    }\n\n    /// set the added vocab's splitting scheme\n    pub fn set_encode_special_tokens(&mut self, value: bool) {\n        self.added_vocabulary.set_encode_special_tokens(value);\n    }\n\n    /// Get added token value\n    pub fn get_encode_special_tokens(&self) -> bool {\n        self.added_vocabulary.get_encode_special_tokens()\n    }\n\n    /// Encode a single sequence\n    fn encode_single_sequence(\n        &self,\n        sequence: InputSequence,\n        type_id: u32,\n        offsets_type: OffsetType,\n    ) -> Result<Encoding> {\n        let encode = |is_pre_tokenized, subseq_idx, subseq| -> Result<Encoding> {\n            let normalized = self\n                .added_vocabulary\n                .extract_and_normalize(self.normalizer.as_ref(), subseq);\n            let pre_tokenized = self.do_pre_tokenize(normalized)?;\n            let subseq_encoding = self.do_tokenize(\n                pre_tokenized,\n                type_id,\n                if is_pre_tokenized {\n                    Some(subseq_idx as u32)\n                } else {\n                    None\n                },\n                offsets_type,\n            )?;\n\n            Ok(subseq_encoding)\n        };\n\n        match sequence {\n            InputSequence::PreTokenized(seq) => seq\n                .iter()\n                .enumerate()\n                .map(|(i, sequence)| encode(true, i, sequence))\n                .collect(),\n            InputSequence::PreTokenizedOwned(seq) => seq\n                .iter()\n                .enumerate()\n                .map(|(i, sequence)| encode(true, i, sequence))\n                .collect(),\n            InputSequence::PreTokenizedCow(seq) => seq\n                .iter()\n                .enumerate()\n                .map(|(i, sequence)| encode(true, i, sequence))\n                .collect(),\n            InputSequence::Raw(seq) => encode(false, 0, seq.as_ref()),\n        }\n    }\n\n    /// Encode the given input. This method accepts both single sequences, as well as pair\n    /// sequences. Also, a sequence can be a string, or already pre-tokenized input directly:\n    /// Contrarily to `encode`, it does not compute offsets\n    /// ```\n    /// # use tokenizers::Tokenizer;\n    /// # use tokenizers::models::bpe::BPE;\n    /// # let mut tokenizer = Tokenizer::new(BPE::default());\n    /// #\n    /// // Sequences:\n    /// tokenizer.encode_fast(\"Single sequence\", false);\n    /// tokenizer.encode_fast((\"Sequence A\", \"Sequence B\"), false);\n    ///\n    /// // Pre-tokenized sequences:\n    /// tokenizer.encode_fast(&[\"Single\", \"sequence\"][..], false);\n    /// tokenizer.encode_fast((\n    ///     &[\"Sequence\", \"A\"][..],\n    ///     &[\"Sequence\", \"B\"][..]\n    /// ), false);\n    ///\n    /// // or even both types together:\n    /// tokenizer.encode_fast((\"A complete sequence\", &[\"And\", \"a\", \"tokenized\"][..]), false);\n    /// ```\n    pub fn encode_fast<'s, E>(&self, input: E, add_special_tokens: bool) -> Result<Encoding>\n    where\n        E: Into<EncodeInput<'s>>,\n    {\n        // Extract sequences from the EncodeInput\n        let (sequence, pair) = match input.into() {\n            EncodeInput::Single(s1) => (s1, None),\n            EncodeInput::Dual(s1, s2) => (s1, Some(s2)),\n        };\n\n        // Encode each sequence\n        let encoding = self.encode_single_sequence(sequence, 0, OffsetType::None)?;\n        let pair_encoding = pair\n            .map(|sequence| self.encode_single_sequence(sequence, 1, OffsetType::None))\n            .transpose()?;\n\n        // And finally post process\n        self.post_process(encoding, pair_encoding, add_special_tokens)\n    }\n\n    /// Encode the given input. This method accepts both single sequences, as well as pair\n    /// sequences. Also, a sequence can be a string, or already pre-tokenized input directly:\n    ///\n    /// ```\n    /// # use tokenizers::Tokenizer;\n    /// # use tokenizers::models::bpe::BPE;\n    /// # let mut tokenizer = Tokenizer::new(BPE::default());\n    /// #\n    /// // Sequences:\n    /// tokenizer.encode(\"Single sequence\", false);\n    /// tokenizer.encode((\"Sequence A\", \"Sequence B\"), false);\n    ///\n    /// // Pre-tokenized sequences:\n    /// tokenizer.encode(&[\"Single\", \"sequence\"][..], false);\n    /// tokenizer.encode((\n    ///     &[\"Sequence\", \"A\"][..],\n    ///     &[\"Sequence\", \"B\"][..]\n    /// ), false);\n    ///\n    /// // or even both types together:\n    /// tokenizer.encode((\"A complete sequence\", &[\"And\", \"a\", \"tokenized\"][..]), false);\n    /// ```\n    pub fn encode<'s, E>(&self, input: E, add_special_tokens: bool) -> Result<Encoding>\n    where\n        E: Into<EncodeInput<'s>>,\n    {\n        // Extract sequences from the EncodeInput\n        let (sequence, pair) = match input.into() {\n            EncodeInput::Single(s1) => (s1, None),\n            EncodeInput::Dual(s1, s2) => (s1, Some(s2)),\n        };\n\n        // Encode each sequence\n        let encoding = self.encode_single_sequence(sequence, 0, OffsetType::Byte)?;\n        let pair_encoding = pair\n            .map(|sequence| self.encode_single_sequence(sequence, 1, OffsetType::Byte))\n            .transpose()?;\n\n        // And finally post process\n        self.post_process(encoding, pair_encoding, add_special_tokens)\n    }\n\n    /// Encode the given input, using offsets relative to chars instead of bytes.\n    /// This method accepts both single sequences, as well as pair sequences. Also,\n    /// a sequence can be a string, or already pre-tokenized input directly:\n    ///\n    /// ```\n    /// # use tokenizers::Tokenizer;\n    /// # use tokenizers::models::bpe::BPE;\n    /// # let mut tokenizer = Tokenizer::new(BPE::default());\n    /// #\n    /// // Sequences:\n    /// tokenizer.encode(\"Single sequence\", false);\n    /// tokenizer.encode((\"Sequence A\", \"Sequence B\"), false);\n    ///\n    /// // Pre-tokenized sequences:\n    /// tokenizer.encode(&[\"Single\", \"sequence\"][..], false);\n    /// tokenizer.encode((\n    ///     &[\"Sequence\", \"A\"][..],\n    ///     &[\"Sequence\", \"B\"][..]\n    /// ), false);\n    ///\n    /// // or even both types together:\n    /// tokenizer.encode((\"A complete sequence\", &[\"And\", \"a\", \"tokenized\"][..]), false);\n    /// ```\n    pub fn encode_char_offsets<'s, E>(&self, input: E, add_special_tokens: bool) -> Result<Encoding>\n    where\n        E: Into<EncodeInput<'s>>,\n    {\n        // Extract sequences from the EncodeInput\n        let (sequence, pair) = match input.into() {\n            EncodeInput::Single(s1) => (s1, None),\n            EncodeInput::Dual(s1, s2) => (s1, Some(s2)),\n        };\n\n        // Encode each sequence\n        let encoding = self.encode_single_sequence(sequence, 0, OffsetType::Char)?;\n        let pair_encoding = pair\n            .map(|sequence| self.encode_single_sequence(sequence, 1, OffsetType::Char))\n            .transpose()?;\n\n        // And finally post process\n        self.post_process(encoding, pair_encoding, add_special_tokens)\n    }\n\n    /// Decode the given ids, back to a String\n    pub fn decode(&self, ids: &[u32], skip_special_tokens: bool) -> Result<String> {\n        let tokens = ids\n            .iter()\n            .filter_map(|id| {\n                self.added_vocabulary\n                    .simple_id_to_token(*id)\n                    .or_else(|| self.model.id_to_token(*id))\n                    .filter(|token| {\n                        !skip_special_tokens || !self.added_vocabulary.is_special_token(token)\n                    })\n            })\n            .collect::<Vec<_>>();\n\n        if let Some(decoder) = &self.decoder {\n            decoder.decode(tokens)\n        } else {\n            Ok(tokens.join(\" \"))\n        }\n    }\n\n    /// Decode the given ids, back to a String\n    /// See [`DecodeStream`]\n    pub fn decode_stream(&self, skip_special_tokens: bool) -> DecodeStream<'_, M, N, PT, PP, D> {\n        DecodeStream::new(self, skip_special_tokens)\n    }\n}\n\n/// DecodeStream will keep the state necessary to produce individual chunks of\n/// strings given an input stream of token_ids.\n///\n/// This is necessary because decoding in general cannot achieve that since strings\n/// depend on surrounding ids to provide a valid string. Typically stripping extra spaces\n///\n/// Example:\n///\n/// ```\n/// # #[cfg(not(target_os = \"windows\"))]\n/// # {\n/// use tokenizers::Tokenizer;\n/// let tokenizer = Tokenizer::from_file(\"data/roberta.json\").unwrap();\n///\n/// let mut decode_stream = tokenizer.decode_stream(false);\n/// assert_eq!(decode_stream.step(713).unwrap(), Some(\"This\".to_string()));\n/// assert_eq!(decode_stream.step(16).unwrap(), Some(\" is\".to_string()));\n/// assert_eq!(decode_stream.step(41).unwrap(), Some(\" an\".to_string()));\n/// assert_eq!(\n///     decode_stream.step(1246).unwrap(),\n///     Some(\" example\".to_string())\n/// );\n/// # }\n/// ```\n///\n/// Returning `None` means the given id is not enough to produce a chunk.\n/// This typically happens with `byte_fallback` options where some tokens do\n/// not represent valid utf-8, and only follow-up token_ids will help produce\n/// a valid chunk.\n/// ```\n/// use tokenizers::{Tokenizer, TokenizerBuilder, models::bpe::BPE, decoders::byte_fallback::ByteFallback, pre_tokenizers::byte_level::ByteLevel, normalizers::unicode::NFC};\n/// use std::collections::HashMap;\n/// use std::iter::FromIterator;\n///\n/// let vocab = HashMap::from_iter([\n///     (\"<0x20>\".to_string(), 0),\n///     (\"<0xC3>\".to_string(), 1),\n///     (\"<0xA9>\".to_string(), 2),\n///     (\" This\".to_string(), 3),\n/// ]);\n/// let merges = vec![];\n/// let bpe = BPE::builder()\n///     .vocab_and_merges(vocab, merges)\n///     .byte_fallback(true)\n///     .build()\n///     .unwrap();\n/// let tokenizer = TokenizerBuilder::default()\n///     .with_model(bpe)\n///     .with_decoder(Some(ByteFallback::default()))\n///     .with_normalizer(Some(NFC))\n///     .with_pre_tokenizer(Some(ByteLevel::default()))\n///     .with_post_processor(Some(ByteLevel::default()))\n///     .build().unwrap();\n///\n/// let mut decode_stream = tokenizer.decode_stream(false);\n/// // Single byte_fallback is valid utf-8\n/// assert_eq!(decode_stream.step(0).unwrap(), Some(\" \".to_string()));\n/// // Invalid utf-8\n/// assert_eq!(decode_stream.step(1).unwrap(), None);\n/// // Valid utf-8 again, this corresponds to both tokens: [1, 2]\n/// assert_eq!(decode_stream.step(2).unwrap(), Some(\"é\".to_string()));\n/// ```\n///\n/// To see how [`DecodeStream`] is necessary, let's show how using raw [`TokenizerImpl::decode`] would\n/// fail.\n///\n/// ```\n/// use tokenizers::{Tokenizer, TokenizerBuilder, models::bpe::BPE, pre_tokenizers::{byte_level::ByteLevel, metaspace::Metaspace}, normalizers::unicode::NFC};\n/// use std::collections::HashMap;\n/// use std::iter::FromIterator;\n///\n/// let vocab = HashMap::from_iter([\n///     (\"▁This\".to_string(), 0),\n/// ]);\n/// let merges = vec![];\n/// let bpe = BPE::builder()\n///     .vocab_and_merges(vocab, merges)\n///     .byte_fallback(true)\n///     .build()\n///     .unwrap();\n/// let tokenizer = TokenizerBuilder::new()\n///     .with_model(bpe)\n///     .with_decoder(Some(Metaspace::default()))\n///     .with_normalizer(Some(NFC))\n///     .with_pre_tokenizer(Some(ByteLevel::default()))\n///     .with_post_processor(Some(ByteLevel::default()))\n///     .build()\n///     .unwrap();\n///\n/// // Strip decoder removes the extra initial space\n/// assert_eq!(tokenizer.decode(&[0, 0], false).unwrap(), \"This This\");\n/// // Decoding one token at a time would produce \"ThisThis\"\n/// assert_eq!(tokenizer.decode(&[0], false).unwrap(), \"This\");\n///\n/// // Using a stream fixes it by keeping the necessary state.\n/// let mut decode_stream = tokenizer.decode_stream(false);\n/// assert_eq!(decode_stream.step(0).unwrap(), Some(\"This\".to_string()));\n/// assert_eq!(decode_stream.step(0).unwrap(), Some(\" This\".to_string()));\n/// ```\npub struct DecodeStream<'tok, M, N, PT, PP, D> {\n    /// A reference to the tokenizer\n    tokenizer: &'tok TokenizerImpl<M, N, PT, PP, D>,\n    /// Regular decode option that is kept throughout.\n    skip_special_tokens: bool,\n    /// A temporary buffer of the necessary token_ids needed\n    /// to produce valid string chunks.\n    /// This typically contains 3 parts:\n    ///  - read\n    ///  - prefix\n    ///  - rest\n    ///\n    /// Read is the bit necessary to surround the prefix\n    /// so decoding the whole ids produces a valid prefix.\n    /// Prefix is the previously produced string, kept around to trim off of\n    /// the next valid chunk\n    ids: Vec<u32>,\n    /// The previously returned chunk that needs to be discarded from the\n    /// decoding of the current ids to produce the next chunk\n    prefix: String,\n    /// The index within the ids corresponding to the prefix so we can drain\n    /// correctly\n    prefix_index: usize,\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum DecodeStreamError {\n    #[error(\"Invalid prefix encountered while decoding stream. Token ID: {token_id}, Expected prefix: '{expected_prefix}', Actual string: '{actual_string}'\")]\n    InvalidPrefix {\n        token_id: u32,\n        expected_prefix: String,\n        actual_string: String,\n    },\n}\n\nimpl<'tok, M, N, PT, PP, D> DecodeStream<'tok, M, N, PT, PP, D>\nwhere\n    M: Model,\n    N: Normalizer,\n    PT: PreTokenizer,\n    PP: PostProcessor,\n    D: Decoder,\n{\n    fn new(tokenizer: &'tok TokenizerImpl<M, N, PT, PP, D>, skip_special_tokens: bool) -> Self {\n        Self {\n            tokenizer,\n            ids: vec![],\n            skip_special_tokens,\n            prefix: \"\".to_string(),\n            prefix_index: 0,\n        }\n    }\n\n    /// See [`DecodeStream`]\n    pub fn step(&mut self, id: u32) -> Result<Option<String>> {\n        step_decode_stream(\n            self.tokenizer,\n            vec![id],\n            self.skip_special_tokens,\n            &mut self.ids,\n            &mut self.prefix,\n            &mut self.prefix_index,\n        )\n    }\n}\n\n/// Internal function exposed only to bypass python limitations\npub fn step_decode_stream<M, N, PT, PP, D>(\n    tokenizer: &TokenizerImpl<M, N, PT, PP, D>,\n    token_ids: Vec<u32>,\n    skip_special_tokens: bool,\n    ids: &mut Vec<u32>,\n    prefix: &mut String,\n    prefix_index: &mut usize,\n) -> Result<Option<String>>\nwhere\n    M: Model,\n    N: Normalizer,\n    PT: PreTokenizer,\n    PP: PostProcessor,\n    D: Decoder,\n{\n    if prefix.is_empty() && !ids.is_empty() {\n        let new_prefix = tokenizer.decode(ids, skip_special_tokens)?;\n        if !new_prefix.ends_with('�') {\n            *prefix = new_prefix;\n            *prefix_index = ids.len();\n        }\n    }\n\n    ids.extend(token_ids);\n    let string = tokenizer.decode(ids.as_slice(), skip_special_tokens)?;\n    if string.len() > prefix.len() && !string.ends_with('�') {\n        if !(string.starts_with(&*prefix)) {\n            return Err(Box::new(DecodeStreamError::InvalidPrefix {\n                token_id: *ids.last().unwrap(),\n                expected_prefix: prefix.clone(),\n                actual_string: string,\n            }));\n        }\n\n        let new_text = &string[prefix.len()..].to_string();\n        let new_prefix_index = ids.len() - *prefix_index;\n        *ids = ids.drain(*prefix_index..).collect();\n        *prefix = tokenizer.decode(ids, skip_special_tokens)?;\n        *prefix_index = new_prefix_index;\n        Ok(Some(new_text.to_string()))\n    } else {\n        Ok(None)\n    }\n}\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: Model,\n{\n    /// Tokenization logic, makes the bridge between the pre-tokenization phase and the real\n    /// tokenization phase, and converting offsets back to the original referential.\n    fn do_tokenize<P: Into<PreTokenizedString>>(\n        &self,\n        pretokenized: P,\n        type_id: u32,\n        word_idx: Option<u32>,\n        offsets_type: OffsetType,\n    ) -> Result<Encoding> {\n        let mut pretokenized: PreTokenizedString = pretokenized.into();\n        pretokenized.tokenize(|normalized| self.model.tokenize(normalized.get()))?;\n        pretokenized.into_encoding(word_idx, type_id, offsets_type)\n    }\n}\n\n#[allow(dead_code)]\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    N: Normalizer,\n{\n    /// Normalization logic, go through all normalizers\n    fn do_normalize<V: Into<NormalizedString>>(&self, normalized: V) -> Result<NormalizedString> {\n        let mut normalized: NormalizedString = normalized.into();\n\n        if let Some(ref normalizer) = self.normalizer {\n            normalizer.normalize(&mut normalized)?;\n        }\n\n        Ok(normalized)\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    N: Normalizer,\n    M: Model,\n{\n    /// Register the given tokens as special tokens. This is especially useful for removing\n    /// these special tokens while decoding\n    pub fn add_special_tokens(&mut self, tokens: &[AddedToken]) -> usize {\n        self.added_vocabulary\n            .add_special_tokens(tokens, &self.model, self.normalizer.as_ref())\n    }\n\n    /// Add the given tokens to the added vocabulary\n    pub fn add_tokens(&mut self, tokens: &[AddedToken]) -> usize {\n        self.added_vocabulary\n            .add_tokens(tokens, &self.model, self.normalizer.as_ref())\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    PT: PreTokenizer,\n{\n    /// PreTokenization logic, handling the case where there is no PreTokenizer set\n    fn do_pre_tokenize<P: Into<PreTokenizedString>>(\n        &self,\n        pretokenized: P,\n    ) -> Result<PreTokenizedString> {\n        let mut pretokenized: PreTokenizedString = pretokenized.into();\n        if let Some(ref pretok) = self.pre_tokenizer {\n            pretok.pre_tokenize(&mut pretokenized)?;\n        }\n\n        Ok(pretokenized)\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    PP: PostProcessor,\n{\n    /// Post processing logic, handling the case where there is no PostProcessor set\n    pub fn post_process(\n        &self,\n        encoding: Encoding,\n        pair_encoding: Option<Encoding>,\n        add_special_tokens: bool,\n    ) -> Result<Encoding> {\n        // 1. First we truncate if needed\n        let (encoding, pair_encoding) = {\n            if let Some(trunc) = &self.truncation {\n                let n_added_tokens = self.get_n_added_tokens(pair_encoding.is_some());\n\n                if add_special_tokens && n_added_tokens > 0 {\n                    let params = TruncationParams {\n                        max_length: trunc.max_length - n_added_tokens,\n                        ..*trunc\n                    };\n                    truncate_encodings(encoding, pair_encoding, &params)?\n                } else {\n                    truncate_encodings(encoding, pair_encoding, trunc)?\n                }\n            } else {\n                (encoding, pair_encoding)\n            }\n        };\n\n        // 2. Then We post process\n        let final_encoding = if let Some(processor) = &self.post_processor {\n            processor.process(encoding, pair_encoding, add_special_tokens)?\n        } else {\n            let encodings = if let Some(pair_encoding) = pair_encoding {\n                vec![encoding, pair_encoding]\n            } else {\n                vec![encoding]\n            };\n            let mut encodings =\n                <dyn PostProcessor>::default_process(encodings, add_special_tokens)?;\n            if encodings.len() != 1 {\n                panic!(\"We haven't reduced the encodings like we should have\");\n            }\n            encodings.pop().unwrap()\n        };\n\n        // 3. Then we pad if needed\n        let [final_encoding] = if let Some(params) = &self.padding {\n            let mut arr = [final_encoding];\n            pad_encodings(&mut arr, params)?;\n            arr\n        } else {\n            [final_encoding]\n        };\n\n        Ok(final_encoding)\n    }\n\n    fn get_n_added_tokens(&self, is_pair: bool) -> usize {\n        if let Some(processor) = &self.post_processor {\n            processor.added_tokens(is_pair)\n        } else {\n            0\n        }\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: Model + Send + Sync,\n    N: Normalizer + Send + Sync,\n    PT: PreTokenizer + Send + Sync,\n    PP: PostProcessor + Send + Sync,\n    D: Decoder + Send + Sync,\n{\n    /// Encode all the sentences in parallel, using multiple threads\n    pub fn encode_batch<'s, E>(\n        &self,\n        inputs: Vec<E>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>>\n    where\n        E: Into<EncodeInput<'s>> + Send,\n    {\n        let mut encodings = inputs\n            .into_maybe_par_iter()\n            .map(|input| self.encode(input, add_special_tokens))\n            .collect::<Result<Vec<Encoding>>>()?;\n\n        if let Some(params) = &self.padding {\n            // We do the padding here to make sure we handle the batch padding\n            pad_encodings(&mut encodings, params)?;\n        }\n\n        Ok(encodings)\n    }\n\n    /// Encode all the sentences in parallel, using multiple threads.\n    /// The offsets on each `Encoding` will be relative to chars instead of bytes.\n    pub fn encode_batch_char_offsets<'s, E>(\n        &self,\n        inputs: Vec<E>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>>\n    where\n        E: Into<EncodeInput<'s>> + Send,\n    {\n        let mut encodings = inputs\n            .into_maybe_par_iter()\n            .map(|input| self.encode_char_offsets(input, add_special_tokens))\n            .collect::<Result<Vec<Encoding>>>()?;\n\n        if let Some(params) = &self.padding {\n            // We do the padding here to make sure we handle the batch padding\n            pad_encodings(&mut encodings, params)?;\n        }\n\n        Ok(encodings)\n    }\n\n    /// Encode all the sentences in parallel, using multiple threads\n    pub fn encode_batch_fast<'s, E>(\n        &self,\n        inputs: Vec<E>,\n        add_special_tokens: bool,\n    ) -> Result<Vec<Encoding>>\n    where\n        E: Into<EncodeInput<'s>> + Send,\n    {\n        let mut encodings = inputs\n            .into_maybe_par_iter()\n            .map(|input| self.encode_fast(input, add_special_tokens))\n            .collect::<Result<Vec<Encoding>>>()?;\n\n        if let Some(params) = &self.padding {\n            // We do the padding here to make sure we handle the batch padding\n            pad_encodings(&mut encodings, params)?;\n        }\n\n        Ok(encodings)\n    }\n\n    /// Decode all sentences in parallel\n    pub fn decode_batch(\n        &self,\n        sentences: &[&[u32]],\n        skip_special_tokens: bool,\n    ) -> Result<Vec<String>>\n    where\n        M: Send + Sync,\n    {\n        sentences\n            .into_maybe_par_iter()\n            .map(|sentence| self.decode(sentence, skip_special_tokens))\n            .collect()\n    }\n\n    /// Train our Model from files\n    pub fn train_from_files<T>(&mut self, trainer: &mut T, files: Vec<String>) -> Result<&mut Self>\n    where\n        T: Trainer<Model = M> + Sync,\n    {\n        let mut len = 0;\n        for file in files.iter() {\n            len += File::open(file)\n                .and_then(|f| f.metadata())\n                .map(|m| m.len())?;\n        }\n\n        let max_read = 1_000_000;\n\n        ResultShunt::process(\n            files.into_iter().flat_map(|filename| {\n                match File::open(filename) {\n                    Ok(file) => {\n                        let file = BufReader::with_capacity(max_read, file);\n                        // We read new lines using this API instead of the Lines Iterator\n                        // on purpose. We want to keep the `\\n` and potential `\\r` between each lines\n                        // We use an iterator to be able to chain with par_bridge.\n                        itertools::Either::Left(file.lines_with_ending())\n                    }\n                    Err(e) => itertools::Either::Right(std::iter::once(Err(e))),\n                }\n            }),\n            |sequences| -> Result<()> {\n                let progress = if trainer.should_show_progress() {\n                    let progress = ProgressBar::new(len);\n                    progress.set_style(\n                        ProgressStyle::default_bar()\n                            .template(\"[{elapsed_precise}] {msg:<30!} {wide_bar} {percent:>18!}%\")\n                            .expect(\"Invalid progress template\"),\n                    );\n                    progress\n                        .set_message(format!(\"Pre-processing files ({:.2} Mo)\", len / 1_000_000));\n                    Some(progress)\n                } else {\n                    None\n                };\n\n                trainer.feed(\n                    sequences.inspect(|s| {\n                        if let Some(progress) = &progress {\n                            progress.inc(s.len() as u64)\n                        }\n                    }),\n                    |seq| {\n                        let normalized = self\n                            .added_vocabulary\n                            .extract_and_normalize(self.normalizer.as_ref(), seq.as_ref());\n                        let pre_tokenized = self.do_pre_tokenize(normalized)?;\n                        Ok(pre_tokenized\n                            .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                            .into_iter()\n                            .map(|(s, _, _)| s.to_owned())\n                            .collect())\n                    },\n                )?;\n\n                if let Some(pbar) = progress {\n                    pbar.finish();\n                }\n                let special_tokens = trainer.train(&mut self.model)?;\n                self.add_special_tokens(&special_tokens);\n\n                Ok(())\n            },\n        )??;\n        Ok(self)\n    }\n\n    /// Train our Model, using the given Trainer and iterator\n    pub fn train<T, I, S>(&mut self, trainer: &mut T, sequences: I) -> Result<&mut Self>\n    where\n        T: Trainer<Model = M> + Sync,\n        I: Iterator<Item = S> + Send,\n        S: AsRef<str> + Send,\n    {\n        let (lower, upper) = sequences.size_hint();\n        let len = upper.unwrap_or(lower) as u64;\n        let progress = if trainer.should_show_progress() {\n            let progress = ProgressBar::new(len);\n            progress.set_style(\n                ProgressStyle::default_bar()\n                    .template(\"[{elapsed_precise}] {msg:<30!} {wide_bar} {pos:<9!}/{len:>9!}\")\n                    .expect(\"Invalid progress template\"),\n            );\n            progress.set_message(\"Pre-processing sequences\");\n            Some(progress)\n        } else {\n            None\n        };\n\n        trainer.feed(\n            sequences.inspect(|_s| {\n                if let Some(progress) = &progress {\n                    progress.inc(1)\n                }\n            }),\n            |seq| {\n                let normalized = self\n                    .added_vocabulary\n                    .extract_and_normalize(self.normalizer.as_ref(), seq.as_ref());\n                let pre_tokenized = self.do_pre_tokenize(normalized)?;\n                Ok(pre_tokenized\n                    .get_splits(OffsetReferential::Original, OffsetType::Byte)\n                    .into_iter()\n                    .map(|(s, _, _)| s.to_owned())\n                    .collect())\n            },\n        )?;\n        if let Some(pbar) = progress {\n            pbar.finish();\n        }\n\n        let special_tokens = trainer.train(&mut self.model)?;\n        self.add_special_tokens(&special_tokens);\n\n        Ok(self)\n    }\n}\n\nimpl<M, N, PT, PP, D> std::str::FromStr for TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: for<'de> Deserialize<'de> + Model,\n    N: for<'de> Deserialize<'de> + Normalizer,\n    PT: for<'de> Deserialize<'de> + PreTokenizer,\n    PP: for<'de> Deserialize<'de> + PostProcessor,\n    D: for<'de> Deserialize<'de> + Decoder,\n{\n    type Err = Error;\n\n    fn from_str(s: &str) -> Result<Self> {\n        Ok(serde_json::from_str(s)?)\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: DeserializeOwned + Model,\n    N: DeserializeOwned + Normalizer,\n    PT: DeserializeOwned + PreTokenizer,\n    PP: DeserializeOwned + PostProcessor,\n    D: DeserializeOwned + Decoder,\n{\n    /// Instantiate a new Tokenizer from the given file\n    pub fn from_file<P: AsRef<Path>>(file: P) -> Result<Self> {\n        let content = read_to_string(file)?;\n        let tokenizer = serde_json::from_str(&content)?;\n        Ok(tokenizer)\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: DeserializeOwned + Model,\n    N: DeserializeOwned + Normalizer,\n    PT: DeserializeOwned + PreTokenizer,\n    PP: DeserializeOwned + PostProcessor,\n    D: DeserializeOwned + Decoder,\n{\n    /// Instantiate a new Tokenizer from bytes\n    pub fn from_bytes<P: AsRef<[u8]>>(bytes: P) -> Result<Self> {\n        let tokenizer = serde_json::from_slice(bytes.as_ref())?;\n        Ok(tokenizer)\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: DeserializeOwned + Model,\n    N: DeserializeOwned + Normalizer,\n    PT: DeserializeOwned + PreTokenizer,\n    PP: DeserializeOwned + PostProcessor,\n    D: DeserializeOwned + Decoder,\n{\n    #[deprecated(\n        since = \"0.14.0\",\n        note = \"Users should download the file separately using https://github.com/huggingface/hf-hub instead, which splits concerns of accessing the web, and should use the new cache layout\"\n    )]\n    #[cfg(feature = \"http\")]\n    #[cfg_attr(docsrs, doc(cfg(feature = \"http\")))]\n    /// Instantiate a new Tokenizer from a file hosted on the Hugging Face Hub.\n    /// It expects the `identifier` of a model that includes a `tokenizer.json` file.\n    pub fn from_pretrained<S: AsRef<str>>(\n        identifier: S,\n        params: Option<crate::utils::from_pretrained::FromPretrainedParameters>,\n    ) -> Result<Self> {\n        let tokenizer_file = crate::utils::from_pretrained::from_pretrained(identifier, params)?;\n        TokenizerImpl::from_file(tokenizer_file)\n    }\n}\n\nimpl<M, N, PT, PP, D> TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: Serialize,\n    N: Serialize,\n    PT: Serialize,\n    PP: Serialize,\n    D: Serialize,\n{\n    /// Serialize the current tokenizer as a String\n    pub fn to_string(&self, pretty: bool) -> Result<String> {\n        Ok(if pretty {\n            serde_json::to_string_pretty(self)?\n        } else {\n            serde_json::to_string(self)?\n        })\n    }\n\n    /// Save the current tokenizer at the given path\n    pub fn save<P: AsRef<Path>>(&self, path: P, pretty: bool) -> Result<()> {\n        let serialized = self.to_string(pretty)?;\n\n        let mut file = File::create(path)?;\n        file.write_all(serialized.as_bytes())?;\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/normalizer.rs",
    "content": "use crate::pattern::Pattern;\nuse crate::{Offsets, Result};\nuse std::ops::{Bound, RangeBounds};\nuse unicode_normalization_alignments::UnicodeNormalization;\n\nuse serde::{Deserialize, Serialize};\n\n/// The possible offsets referential\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum OffsetReferential {\n    Original,\n    Normalized,\n}\n\n/// Represents a Range usable by the NormalizedString to index its content.\n/// A Range can use indices relative to either the `Original` or the `Normalized` string\n#[derive(Debug, Clone, PartialEq, Eq)]\npub enum Range<T: RangeBounds<usize> + Clone> {\n    Original(T),\n    Normalized(T),\n}\n\n#[allow(clippy::len_without_is_empty)]\nimpl<T> Range<T>\nwhere\n    T: RangeBounds<usize> + Clone,\n{\n    /// Unwrap the underlying range\n    pub fn unwrap(self) -> T {\n        match self {\n            Self::Original(r) => r,\n            Self::Normalized(r) => r,\n        }\n    }\n\n    /// Return the length of the current Range if not Unbounded\n    pub fn len(&self) -> Option<usize> {\n        let range = self.clone().unwrap();\n\n        let end = match range.end_bound() {\n            Bound::Unbounded => None,\n            Bound::Included(i) => Some(*i + 1),\n            Bound::Excluded(i) => Some(*i),\n        }?;\n\n        match range.start_bound() {\n            Bound::Unbounded => Some(end),\n            Bound::Included(i) => Some(end - *i),\n            Bound::Excluded(i) => Some(end - (*i + 1)),\n        }\n    }\n\n    /// Converts the current Range to a `std::ops::Range<usize>`. This requires the `max_len`\n    /// of the represented string (in chars, not bytes) in order to cover the case where the\n    /// original provided range was unbounded\n    pub fn into_full_range(self, max_len: usize) -> std::ops::Range<usize> {\n        let range = self.unwrap();\n\n        let start = match range.start_bound() {\n            Bound::Unbounded => 0,\n            Bound::Included(i) => *i,\n            Bound::Excluded(i) => *i + 1,\n        };\n        let end = match range.end_bound() {\n            Bound::Unbounded => max_len,\n            Bound::Included(i) => *i + 1,\n            Bound::Excluded(i) => *i,\n        };\n\n        start..end\n    }\n}\n\n/// Defines the expected behavior for the delimiter of a Split Pattern\n/// When splitting on `'-'` for example, with input `the-final--countdown`:\n///  - Removed => `[ \"the\", \"final\", \"countdown\" ]`\n///  - Isolated => `[ \"the\", \"-\", \"final\", \"-\", \"-\", \"countdown\" ]`\n///  - MergedWithPrevious => `[ \"the-\", \"final-\", \"-\", \"countdown\" ]`\n///  - MergedWithNext => `[ \"the\", \"-final\", \"-\", \"-countdown\" ]`\n///  - Contiguous => `[ \"the\", \"-\", \"final\", \"--\", \"countdown\" ]`\n#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Eq)]\npub enum SplitDelimiterBehavior {\n    Removed,\n    Isolated,\n    MergedWithPrevious,\n    MergedWithNext,\n    Contiguous,\n}\n\nimpl std::fmt::Display for SplitDelimiterBehavior {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.serialize(f)\n    }\n}\n\n/// A `NormalizedString` takes care of processing an \"original\" string to modify\n/// it and obtain a \"normalized\" string. It keeps both version of the string,\n/// alignments information between both and provides an interface to retrieve\n/// ranges of each string, using offsets from any of them.\n///\n/// It is possible to retrieve a part of the original string, by indexing it with\n/// offsets from the normalized one, and the other way around too. It is also\n/// possible to convert offsets from one referential to the other one easily.\n#[derive(Default, Debug, Clone, PartialEq, Eq)]\npub struct NormalizedString {\n    /// The original version of the string, before any modification\n    original: String,\n    /// The normalized version of the string, after all modifications\n    normalized: String,\n    /// Mapping from normalized string to original one: (start, end) for each\n    /// byte of the normalized string\n    alignments: Vec<(usize, usize)>,\n    /// If this NormalizedString is a slice of a bigger one, we keep the track\n    /// of the missing part, so that we can still give offsets from this original\n    /// string.\n    original_shift: usize,\n}\n\nimpl NormalizedString {\n    #[cfg(test)]\n    pub(crate) fn new(\n        original: String,\n        normalized: String,\n        alignments: Vec<(usize, usize)>,\n        original_shift: usize,\n    ) -> Self {\n        Self {\n            original,\n            normalized,\n            alignments,\n            original_shift,\n        }\n    }\n    /// Return the normalized string\n    pub fn get(&self) -> &str {\n        &self.normalized\n    }\n\n    /// Return the original string\n    pub fn get_original(&self) -> &str {\n        &self.original\n    }\n\n    /// Return the original offsets\n    pub fn offsets_original(&self) -> Offsets {\n        (\n            self.original_shift,\n            self.original_shift + self.len_original(),\n        )\n    }\n\n    /// Convert the given offsets range from one referential to the other one:\n    /// `Original => Normalized` or `Normalized => Original`\n    ///\n    /// Returns `None` when targeting something that is outside range\n    pub fn convert_offsets<T>(&self, range: Range<T>) -> Option<std::ops::Range<usize>>\n    where\n        T: RangeBounds<usize> + Clone,\n    {\n        let len_original = self.len_original();\n        let len_normalized = self.len();\n\n        let (target, original) = match range {\n            Range::Original(_) => (range.into_full_range(len_original), true),\n            Range::Normalized(_) => (range.into_full_range(len_normalized), false),\n        };\n\n        // If we target an empty range, let's return the same\n        if target.start == target.end {\n            return Some(target);\n        }\n        // If the target goes reverse, return None\n        if target.start > target.end {\n            return None;\n        }\n\n        // If we target 0..0 on an empty string, we want to expand to the entire equivalent\n        if original && self.original.is_empty() && target == (0..0) {\n            return Some(0..len_normalized);\n        }\n        if !original && self.normalized.is_empty() && target == (0..0) {\n            return Some(0..len_original);\n        }\n\n        if original {\n            let (mut start, mut end) = (None, None);\n            self.alignments\n                .iter()\n                .enumerate()\n                .take_while(|(_, alignment)| target.end >= alignment.1)\n                .for_each(|(i, alignment)| {\n                    if start.is_none() && target.start <= alignment.0 {\n                        // For now, don't update if width == 0\n                        if alignment.0 != alignment.1 {\n                            start = Some(i);\n                        }\n                    }\n                    if target.end >= alignment.1 {\n                        end = Some(i + 1);\n                    }\n                });\n\n            match (start, end) {\n                // Targeting inexistent beginning\n                (Some(s), None) => Some(s..s),\n                // Targeting inexistent end\n                (None, Some(e)) => Some(e..e),\n                // Found the range\n                (Some(s), Some(e)) => Some(s..e),\n                _ => None,\n            }\n        } else {\n            self.alignments.get(target).and_then(expand_alignments)\n        }\n    }\n\n    /// Return a range of the normalized string\n    pub fn get_range<T>(&self, range: Range<T>) -> Option<&str>\n    where\n        T: RangeBounds<usize> + Clone,\n    {\n        match range {\n            Range::Original(_) => self.normalized.get(self.convert_offsets(range)?),\n            Range::Normalized(_) => self.normalized.get(range.into_full_range(self.len())),\n        }\n    }\n\n    /// Return a range of the original string\n    pub fn get_range_original<T>(&self, range: Range<T>) -> Option<&str>\n    where\n        T: RangeBounds<usize> + Clone,\n    {\n        match range {\n            Range::Original(_) => self\n                .original\n                .get(range.into_full_range(self.len_original())),\n            Range::Normalized(_) => self.original.get(self.convert_offsets(range)?),\n        }\n    }\n\n    /// Validate the given range, to make sure it is on char boundaries\n    fn validate_range<T: RangeBounds<usize> + Clone>(\n        &self,\n        range: Range<T>,\n    ) -> Option<Range<std::ops::Range<usize>>> {\n        match range {\n            Range::Original(_) => {\n                let r = range.into_full_range(self.original.len());\n                if !(self.original.is_char_boundary(r.start)\n                    && self.original.is_char_boundary(r.end))\n                {\n                    None\n                } else {\n                    Some(Range::Original(r))\n                }\n            }\n            Range::Normalized(_) => {\n                let r = range.into_full_range(self.normalized.len());\n                if !(self.normalized.is_char_boundary(r.start)\n                    && self.normalized.is_char_boundary(r.end))\n                {\n                    None\n                } else {\n                    Some(Range::Normalized(r))\n                }\n            }\n        }\n    }\n\n    /// Return a slice of the current NormalizedString\n    /// If the range is not on char boundaries, return None\n    pub fn slice<T>(&self, range: Range<T>) -> Option<NormalizedString>\n    where\n        T: RangeBounds<usize> + Clone,\n    {\n        let full_range = self.validate_range(range)?;\n        let (normalized_range, original_range) = match full_range {\n            Range::Original(_) => (\n                self.convert_offsets(full_range.clone())?,\n                full_range.clone().unwrap(),\n            ),\n            Range::Normalized(_) => (\n                full_range.clone().unwrap(),\n                self.convert_offsets(full_range.clone())?,\n            ),\n        };\n\n        let n_shift = original_range.start;\n\n        Some(Self {\n            original: self\n                .get_range_original(full_range.clone())\n                .unwrap_or_default()\n                .into(),\n            normalized: self.get_range(full_range).unwrap_or_default().into(),\n            alignments: self\n                .alignments\n                .get(normalized_range)?\n                .to_vec()\n                .iter()\n                .map(|(start, end)| (start - n_shift, end - n_shift))\n                .collect(),\n            original_shift: self.original_shift + original_range.start,\n        })\n    }\n\n    /// Applies transformations to the current normalized version of the string,\n    /// while updating the alignments.\n    /// This method expect an Iterator yielding each char of the new normalized string\n    /// with a `change` isize equals to:\n    ///   - `1` if this is a new char\n    ///   - `-N` if the char is right before N removed chars\n    ///   - `0` if the char is replacing the existing one\n    ///\n    /// Since it is possible that the normalized string doesn't include some of the characters at\n    /// the beginning of the original one, we need an `initial_offset` which represents the number\n    /// of removed chars at the very beginning.\n    pub fn transform_range<T, I>(&mut self, range: Range<T>, dest: I, initial_offset: usize)\n    where\n        T: RangeBounds<usize> + Clone,\n        I: IntoIterator<Item = (char, isize)>,\n    {\n        let n_range = match range {\n            Range::Normalized(_) => range.into_full_range(self.len()),\n            Range::Original(_) => match self.convert_offsets(range) {\n                Some(range) => range,\n                None => return,\n            },\n        };\n        trace!(\n            \"===== transform_range call with {n_range:?} (initial_offset: {initial_offset}) =====\"\n        );\n\n        // Retrieve the original characters that are being replaced. This let us\n        // compute the change in byte sizes along the way.\n        let mut replaced_normalized = self.normalized[n_range.clone()]\n            .chars()\n            .collect::<Vec<_>>()\n            .into_iter();\n        let initial_removed: usize = (&mut replaced_normalized)\n            .take(initial_offset)\n            .map(|c| c.len_utf8())\n            .sum();\n\n        let mut offset = (initial_removed + n_range.start) as isize;\n        let mut alignments = Vec::with_capacity(n_range.len());\n        trace!(\"=> Applying transformations\");\n        let normalized = dest\n            .into_iter()\n            .map(|(c, changes)| {\n                trace!(\n                    \"### {:?} with size {}: {} with offset {} ###\",\n                    c,\n                    c.len_utf8(),\n                    match changes {\n                        0 => \"Replacing\".into(),\n                        ch if ch > 0 => \"Adding\".into(),\n                        ch if ch < 0 => format!(\"Replacing + removing {ch} following chars\"),\n                        _ => \"Undefined\".into(),\n                    },\n                    offset\n                );\n\n                let idx = offset as usize;\n                let align = if changes.is_positive() {\n                    if idx < 1 {\n                        (0, 0)\n                    } else {\n                        // This is a newly inserted character, so it shares the same alignment\n                        // than the previous one\n                        self.alignments[idx - 1]\n                    }\n                } else {\n                    self.alignments[idx]\n                };\n\n                // If we are replacing a character, find it and compute the change in size\n                let replaced_char = if !changes.is_positive() {\n                    replaced_normalized.next()\n                } else {\n                    None\n                };\n                let replaced_char_size = replaced_char.map_or(0, |c| c.len_utf8());\n                let replaced_char_size_change = c.len_utf8() as isize - replaced_char_size as isize;\n                if let Some(ref replaced_char) = replaced_char {\n                    trace!(\n                        \"Replacing char {replaced_char:?} - with a change in size: {replaced_char_size_change}\"\n                    );\n                }\n\n                // If we are removing some characters, find them too\n                let total_bytes_to_remove = if changes.is_negative() {\n                    (&mut replaced_normalized)\n                        .take(-changes as usize)\n                        .map(|c| c.len_utf8())\n                        .sum()\n                } else {\n                    0\n                };\n                trace!(\"Total bytes to remove: {total_bytes_to_remove}\");\n\n                // Keep track of the changes for next offsets\n                offset += replaced_char_size as isize;\n                offset += total_bytes_to_remove as isize;\n                trace!(\"New offset: {offset}\");\n\n                trace!(\"New normalized alignment: {}x {:?}\", c.len_utf8(), align);\n                alignments.extend((0..c.len_utf8()).map(|_| align));\n\n                // Then we keep only the char for string reconstruction\n                c\n            })\n            .collect::<String>();\n\n        self.alignments.splice(n_range.clone(), alignments);\n\n        // This bounds check already happens above (`self.normalized[n_range.clone()]`), but future\n        // code could change to mutate `self` or `self.normalized` in the interim.\n        // Perform it again and hope the optimizer collapses it.\n        assert!(self.normalized.get(n_range.clone()).is_some());\n        unsafe {\n            self.normalized\n                // Safety: This is safe as long as we do not splice across a\n                // UTF-8 character, and we only add UTF-8 text. `normalized` is a String\n                // so the latter is trivially true, and we assert for the former above.\n                .as_mut_vec()\n                .splice(n_range, normalized.bytes());\n        }\n    }\n\n    /// Applies transformations to the current normalized version of the string,\n    /// while updating the alignments.\n    /// This method expect an Iterator yielding each char of the new normalized string\n    /// with a `change` isize equals to:\n    ///   - `1` if this is a new char\n    ///   - `-N` if the char is right before N removed chars\n    ///   - `0` if the char is replacing the existing one\n    ///\n    /// Since it is possible that the normalized string doesn't include some of the characters at\n    /// the beginning of the original one, we need an `initial_offset` which represents the number\n    /// of removed chars at the very beginning.\n    pub fn transform<I>(&mut self, dest: I, initial_offset: usize)\n    where\n        I: IntoIterator<Item = (char, isize)>,\n    {\n        self.transform_range(Range::Original(..), dest, initial_offset)\n    }\n\n    /// Applies NFD normalization\n    pub fn nfd(&mut self) -> &mut Self {\n        self.transform(self.get().to_owned().nfd(), 0);\n        self\n    }\n\n    /// Applies NFKD normalization\n    pub fn nfkd(&mut self) -> &mut Self {\n        self.transform(self.get().to_owned().nfkd(), 0);\n        self\n    }\n\n    /// Applies NFC normalization\n    pub fn nfc(&mut self) -> &mut Self {\n        self.transform(self.get().to_owned().nfc(), 0);\n        self\n    }\n\n    /// Applies NFKC normalization\n    pub fn nfkc(&mut self) -> &mut Self {\n        self.transform(self.get().to_owned().nfkc(), 0);\n        self\n    }\n\n    /// Applies filtering over our characters\n    pub fn filter<F: Fn(char) -> bool>(&mut self, keep: F) -> &mut Self {\n        let mut removed: isize = 0;\n        let mut removed_start: usize = 0;\n\n        let mut transforms = Vec::with_capacity(self.normalized.len());\n        let mut last_c = None;\n        for c in self.normalized.chars() {\n            if keep(c) {\n                match last_c {\n                    Some(lc) => {\n                        transforms.push((lc, -removed));\n                    }\n                    None => {\n                        removed_start = removed as usize;\n                    }\n                }\n                last_c = Some(c);\n                removed = 0;\n            } else {\n                removed += 1;\n            }\n        }\n        if let Some(lc) = last_c {\n            transforms.push((lc, -removed));\n        }\n        self.transform(transforms, removed_start);\n        self\n    }\n\n    /// Prepend the given string to ourself\n    pub fn prepend(&mut self, s: &str) -> &mut Self {\n        if let Some(next) = self.normalized.chars().next() {\n            let transformations = s\n                .chars()\n                .enumerate()\n                .map(|(i, c)| (c, isize::from(i != 0)))\n                .chain(std::iter::once((next, 1)));\n\n            self.transform_range(Range::Normalized(0..next.len_utf8()), transformations, 0);\n        }\n        self\n    }\n\n    /// Append the given string to ourself\n    pub fn append(&mut self, s: &str) -> &mut Self {\n        if let Some((b, prev)) = self.normalized.char_indices().last() {\n            let transformations = std::iter::once((prev, 0)).chain(s.chars().map(|c| (c, 1)));\n            self.transform_range(Range::Normalized(b..), transformations, 0);\n        } else {\n            let transformations = s.chars().map(|c| (c, 1));\n            self.transform_range(Range::Normalized(..), transformations, 0);\n        }\n        self\n    }\n\n    /// Map our characters\n    pub fn map<F: Fn(char) -> char>(&mut self, map: F) -> &mut Self {\n        let transformations = self\n            .normalized\n            .chars()\n            .map(|c| (map(c), 0))\n            .collect::<Vec<_>>();\n        self.transform(transformations, 0);\n        self\n    }\n\n    /// Calls the given function for each characters\n    pub fn for_each<F: FnMut(char)>(&self, foreach: F) -> &Self {\n        self.normalized.chars().for_each(foreach);\n        self\n    }\n\n    /// Lowercase\n    pub fn lowercase(&mut self) -> &mut Self {\n        let mut new_chars: Vec<(char, isize)> = vec![];\n        self.for_each(|c| {\n            c.to_lowercase().enumerate().for_each(|(index, c)| {\n                new_chars.push((c, isize::from(index > 0)));\n            })\n        });\n        self.transform(new_chars, 0);\n        self\n    }\n\n    /// Uppercase\n    pub fn uppercase(&mut self) -> &mut Self {\n        let mut new_chars: Vec<(char, isize)> = vec![];\n        self.for_each(|c| {\n            c.to_uppercase().enumerate().for_each(|(index, c)| {\n                new_chars.push((c, isize::from(index > 0)));\n            })\n        });\n        self.transform(new_chars, 0);\n        self\n    }\n\n    /// Replace anything that matches the pattern with the given content.\n    pub fn replace<P: Pattern>(&mut self, pattern: P, content: &str) -> Result<()> {\n        let mut new_normalized = String::with_capacity(self.normalized.len()); // Initially allocate for the input size\n        let mut new_alignments: Vec<(usize, usize)> = Vec::with_capacity(self.alignments.len());\n        let mut last_end = 0; // Keep track of the last end position\n\n        pattern\n            .find_matches(&self.normalized)?\n            .into_iter()\n            .for_each(|((start, end), is_match)| {\n                if is_match {\n                    let range = start..end;\n\n                    let mut new_len = 0;\n                    let removed_chars = self.normalized[range.clone()].chars().count();\n\n                    /* The following code is equivalent to this call, but computationally much more efficient\n                    self.transform_range(\n                        Range::Normalized(range),\n                        content.chars().map(|c| {\n                            new_len += c.len_utf8();\n                            (c, 1)\n                        }),\n                        removed_chars,\n                    ); */\n\n                    // Copy the part of the string that is before the match\n                    new_normalized.push_str(&self.normalized[last_end..start]);\n                    new_alignments.extend(self.alignments[last_end..start].iter().cloned());\n\n                    let n_range = Range::Normalized(range).into_full_range(self.len());\n\n                    // Retrieve the original characters that are being replaced. This let us\n                    // compute the change in byte sizes along the way.\n                    let mut replaced_normalized = self.normalized[n_range.clone()]\n                        .chars()\n                        .collect::<Vec<_>>()\n                        .into_iter();\n                    let initial_removed: usize = (&mut replaced_normalized)\n                        .take(removed_chars)\n                        .map(|c| c.len_utf8())\n                        .sum();\n\n                    let dest = content.chars().map(|c| {\n                        new_len += c.len_utf8();\n                        (c, 1)\n                    });\n                    let mut offset = (initial_removed + n_range.start) as isize;\n                    let normalized = dest\n                        .into_iter()\n                        .map(|(c, changes): (char, i32)| {\n                            let idx = offset as usize;\n                            let align = if changes.is_positive() {\n                                if idx < 1 {\n                                    (0, 0)\n                                } else {\n                                    // This is a newly inserted character, so it shares the same alignment\n                                    // than the previous one\n                                    self.alignments[idx - 1]\n                                }\n                            } else {\n                                self.alignments[idx]\n                            };\n\n                            // If we are replacing a character, find it and compute the change in size\n                            let replaced_char = if !changes.is_positive() {\n                                replaced_normalized.next()\n                            } else {\n                                None\n                            };\n                            let replaced_char_size = replaced_char.map_or(0, |c| c.len_utf8());\n\n                            // If we are removing some characters, find them too\n                            let total_bytes_to_remove = if changes.is_negative() {\n                                (&mut replaced_normalized)\n                                    .take(-changes as usize)\n                                    .map(|c| c.len_utf8())\n                                    .sum()\n                            } else {\n                                0\n                            };\n\n                            // Keep track of the changes for next offsets\n                            offset += replaced_char_size as isize;\n                            offset += total_bytes_to_remove as isize;\n\n                            new_alignments.extend((0..c.len_utf8()).map(|_| align));\n\n                            // Then we keep only the char for string reconstruction\n                            c\n                        })\n                        .collect::<String>();\n\n                    new_normalized.push_str(&normalized);\n                    last_end = end;\n                }\n            });\n\n        // Copy the remaining part of the input\n        new_normalized.push_str(&self.normalized[last_end..]);\n        new_alignments.extend(&self.alignments[last_end..]);\n\n        self.normalized = new_normalized;\n        self.alignments = new_alignments;\n        Ok(())\n    }\n\n    /// Clear the normalized part of the string\n    pub fn clear(&mut self) -> usize {\n        let len = self.len();\n        self.transform(std::iter::empty(), len);\n        len\n    }\n\n    /// Split the current string in many subparts. Specify what to do with the\n    /// delimiter.\n    ///\n    /// ## Splitting Behavior for the delimiter\n    ///\n    /// The behavior can be one of the followings:\n    /// When splitting on `'-'` for example, with input `the-final--countdown`:\n    ///  - Removed => `[ \"the\", \"\", \"final\", \"\", \"\", \"countdown\" ]`\n    ///  - Isolated => `[ \"the\", \"-\", \"final\", \"-\", \"-\", \"countdown\" ]`\n    ///  - MergedWithPrevious => `[ \"the-\", \"final-\", \"-\", \"countdown\" ]`\n    ///  - MergedWithNext => `[ \"the\", \"-final\", \"-\", \"-countdown\" ]`\n    pub fn split<P: Pattern>(\n        &self,\n        pattern: P,\n        behavior: SplitDelimiterBehavior,\n    ) -> Result<Vec<NormalizedString>> {\n        let matches = pattern.find_matches(&self.normalized)?;\n\n        // Process the matches according to the selected behavior: Vec<(Offsets, should_remove)>\n        use SplitDelimiterBehavior::*;\n        let splits = match behavior {\n            Isolated => matches\n                .into_iter()\n                .map(|(offsets, _)| (offsets, false))\n                .collect(),\n            Removed => matches,\n            Contiguous => {\n                let mut previous_match = false;\n                matches\n                    .into_iter()\n                    .fold(vec![], |mut acc, (offsets, is_match)| {\n                        if is_match == previous_match {\n                            if let Some(((_, end), _)) = acc.last_mut() {\n                                *end = offsets.1;\n                            } else {\n                                acc.push((offsets, false));\n                            }\n                        } else {\n                            acc.push((offsets, false));\n                        }\n                        previous_match = is_match;\n                        acc\n                    })\n            }\n            MergedWithPrevious => {\n                let mut previous_match = false;\n                matches\n                    .into_iter()\n                    .fold(vec![], |mut acc, (offsets, is_match)| {\n                        if is_match && !previous_match {\n                            if let Some(((_, end), _)) = acc.last_mut() {\n                                *end = offsets.1;\n                            } else {\n                                acc.push((offsets, false));\n                            }\n                        } else {\n                            acc.push((offsets, false));\n                        }\n                        previous_match = is_match;\n                        acc\n                    })\n            }\n            MergedWithNext => {\n                let mut previous_match = false;\n                let mut matches =\n                    matches\n                        .into_iter()\n                        .rev()\n                        .fold(vec![], |mut acc, (offsets, is_match)| {\n                            if is_match && !previous_match {\n                                if let Some(((start, _), _)) = acc.last_mut() {\n                                    *start = offsets.0;\n                                } else {\n                                    acc.push((offsets, false));\n                                }\n                            } else {\n                                acc.push((offsets, false));\n                            }\n                            previous_match = is_match;\n                            acc\n                        });\n                matches.reverse();\n                matches\n            }\n        };\n\n        // Then we split according to the computed splits\n        Ok(splits\n            .into_iter()\n            .filter_map(|(offsets, remove)| {\n                if !remove {\n                    Some(\n                        self.slice(Range::Normalized(offsets.0..offsets.1))\n                            .expect(\"NormalizedString bad split\"),\n                    )\n                } else {\n                    None\n                }\n            })\n            .collect())\n    }\n\n    /// Remove any leading space(s) of the normalized string\n    pub fn lstrip(&mut self) -> &mut Self {\n        self.lrstrip(true, false)\n    }\n\n    /// Remove any trailing space(s) of the normalized string\n    pub fn rstrip(&mut self) -> &mut Self {\n        self.lrstrip(false, true)\n    }\n\n    /// Remove any leading and trailing space(s) of the normalized string\n    pub fn strip(&mut self) -> &mut Self {\n        self.lrstrip(true, true)\n    }\n\n    fn lrstrip(&mut self, left: bool, right: bool) -> &mut Self {\n        let leading_spaces = if left {\n            self.get().chars().take_while(|c| c.is_whitespace()).count()\n        } else {\n            0\n        };\n        let trailing_spaces = if right {\n            self.get()\n                .chars()\n                .rev()\n                .take_while(|c| c.is_whitespace())\n                .count()\n        } else {\n            0\n        };\n\n        if leading_spaces > 0 || trailing_spaces > 0 {\n            let count = self.get().chars().count();\n            let transformation = self\n                .normalized\n                .chars()\n                .enumerate()\n                .filter_map(|(i, c)| {\n                    if i < leading_spaces || i >= count - trailing_spaces {\n                        None\n                    } else if i == self.len() - trailing_spaces - 1 {\n                        Some((c, -(trailing_spaces as isize)))\n                    } else {\n                        Some((c, 0))\n                    }\n                })\n                .collect::<Vec<_>>();\n            self.transform(transformation, leading_spaces);\n        }\n        self\n    }\n\n    /// Returns the length of the normalized string (counting chars not bytes)\n    pub fn len(&self) -> usize {\n        self.normalized.len()\n    }\n\n    /// Returns the length of the original string (counting chars not bytes)\n    pub fn len_original(&self) -> usize {\n        self.original.len()\n    }\n\n    /// Whether empty\n    pub fn is_empty(&self) -> bool {\n        self.normalized.is_empty()\n    }\n\n    /// Recalculate original alignments\n    #[allow(dead_code)]\n    pub(crate) fn alignments_original(&self) -> Vec<(usize, usize)> {\n        // Start, end are in alignments\n        // offset, length are in alignments_original\n        let mut alignments_original = Vec::with_capacity(self.original.len());\n\n        // Eventual gap before first group\n        let start = self.alignments[0].0;\n        if start != 0 {\n            alignments_original.extend(vec![(0, 0); start]);\n        }\n\n        let mut last = (&self.alignments[0].0, &self.alignments[0].1);\n        let mut offset = 0;\n        let mut length = 0;\n        for (start, end) in &self.alignments {\n            if last == (start, end) {\n                // This is the same group\n                length += 1;\n            } else {\n                // This is a new group\n                if start < last.1 {\n                    panic!(\"We can't have overlapping ranges.\");\n                }\n\n                // Add the old group\n                alignments_original.extend(vec![(offset, offset + length); last.1 - last.0]);\n                offset += length;\n                length = 1;\n\n                // Eventual gap between the 2 groups\n                alignments_original.extend(vec![(offset, offset); start - last.1]);\n            }\n\n            last = (start, end);\n        }\n        // Add the last group\n        alignments_original.extend(vec![(offset, offset + length); last.1 - last.0]);\n\n        // Add eventual last gap\n        offset += length;\n        alignments_original.extend(vec![\n            (offset, offset);\n            self.original.len() - alignments_original.len()\n        ]);\n\n        // assert_eq!(alignments_original.len(), self.original.len());\n        alignments_original\n    }\n}\n\n/// Returns the range covered by a slice of alignments\nfn expand_alignments(alignments: &[(usize, usize)]) -> Option<std::ops::Range<usize>> {\n    if alignments.is_empty() {\n        None\n    } else {\n        let start = alignments[0].0;\n        let end = alignments[alignments.len() - 1].1;\n        Some(start..end)\n    }\n}\n\n/// Returns a range of the given string slice, by indexing chars instead of bytes\npub fn get_range_of<T: RangeBounds<usize>>(s: &str, range: T) -> Option<&str> {\n    let len = s.chars().count();\n    let start = match range.start_bound() {\n        Bound::Unbounded => 0,\n        Bound::Included(i) => *i,\n        Bound::Excluded(i) => *i + 1,\n    };\n    let end = match range.end_bound() {\n        Bound::Unbounded => len,\n        Bound::Included(i) => *i + 1,\n        Bound::Excluded(i) => *i,\n    };\n\n    if start == 0 && end == 0 {\n        Some(&s[0..0])\n    } else if start >= len || end > len || start >= end {\n        None\n    } else {\n        let start_b = s.char_indices().map(|(i, _)| i).nth(start).unwrap_or(0);\n        let end_b = s.char_indices().map(|(i, _)| i).nth(end).unwrap_or(s.len());\n        Some(&s[start_b..end_b])\n    }\n}\n\n/// Convert the given range from bytes to char\npub fn bytes_to_char(s: &str, range: std::ops::Range<usize>) -> Option<std::ops::Range<usize>> {\n    let (mut start, mut end) = if range == (0..0) {\n        (Some(0), Some(0))\n    } else {\n        (None, None)\n    };\n\n    s.char_indices()\n        .enumerate()\n        .take_while(|(_, (b, _))| *b <= range.end)\n        .filter(|(_, (b, _))| *b >= range.start)\n        .for_each(|(i, (b, c))| {\n            if b == range.start {\n                start = Some(i);\n            }\n            if b == range.end {\n                end = Some(i);\n            }\n            if b + c.len_utf8() == range.end {\n                end = Some(i + 1);\n            }\n        });\n\n    Some(start?..end?)\n}\n\n/// Convert the given range from char to bytes\npub fn char_to_bytes(s: &str, range: std::ops::Range<usize>) -> Option<std::ops::Range<usize>> {\n    let (mut start, mut end) = if range == (0..0) {\n        (Some(0), Some(0))\n    } else {\n        (None, None)\n    };\n\n    if range.start == range.end {\n        s.char_indices()\n            .skip(range.start)\n            .take(1)\n            .for_each(|(b, _)| {\n                start = Some(b);\n                end = Some(b);\n            });\n    } else {\n        s.char_indices()\n            .skip(range.start)\n            .take(range.end - range.start)\n            .for_each(|(b, c)| {\n                if start.is_none() {\n                    start = Some(b);\n                }\n                end = Some(b + c.len_utf8());\n            });\n    }\n\n    Some(start?..end?)\n}\n\nimpl From<String> for NormalizedString {\n    fn from(s: String) -> Self {\n        let alignments = s\n            .char_indices()\n            .flat_map(|(b, c)| {\n                let len = c.len_utf8();\n                (0..len).map(move |_| (b, b + len))\n            })\n            .collect::<Vec<_>>();\n        Self {\n            original: s.clone(),\n            normalized: s,\n            alignments,\n            original_shift: 0,\n        }\n    }\n}\n\nimpl From<&str> for NormalizedString {\n    fn from(s: &str) -> Self {\n        Self::from(s.to_owned())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use regex::Regex;\n    use unicode_categories::UnicodeCategories;\n\n    #[test]\n    fn test_len_range_inclusive() {\n        let range = Range::Original(3..=7);\n        let len = range.len();\n        assert_eq!(len, Some(5)); // 7 - 3 + 1 = 5\n    }\n\n    #[test]\n    fn test_len_range_exclusive() {\n        let range = Range::Original(3..7);\n        let len = range.len();\n        assert_eq!(len, Some(4)); // 7 - 3 = 4\n    }\n\n    #[test]\n    fn nfd_adds_new_chars() {\n        let mut n = NormalizedString::from(\"élégant\");\n        n.nfd();\n        assert_eq!(\n            &n.alignments,\n            &[\n                (0, 2),\n                (0, 2),\n                (0, 2),\n                (2, 3),\n                (3, 5),\n                (3, 5),\n                (3, 5),\n                (5, 6),\n                (6, 7),\n                (7, 8),\n                (8, 9)\n            ]\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 3),\n                (0, 3),\n                (3, 4),\n                (4, 7),\n                (4, 7),\n                (7, 8),\n                (8, 9),\n                (9, 10),\n                (10, 11)\n            ]\n        );\n    }\n\n    #[test]\n    fn remove_chars_added_by_nfd() {\n        let mut n = NormalizedString::from(\"élégant\");\n        n.nfd().filter(|c| !c.is_mark_nonspacing());\n\n        assert_eq!(n.get(), \"elegant\");\n\n        assert_eq!(\n            &n.alignments,\n            &[(0, 2), (2, 3), (3, 5), (5, 6), (6, 7), (7, 8), (8, 9)]\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 1),\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7)\n            ]\n        );\n    }\n\n    #[test]\n    fn remove_chars() {\n        let mut n = NormalizedString::from(\"élégant\");\n        n.filter(|c| c != 'n');\n        assert_eq!(n.get(), \"élégat\");\n        assert_eq!(\n            &n.alignments,\n            &[\n                (0, 2),\n                (0, 2),\n                (2, 3),\n                (3, 5),\n                (3, 5),\n                (5, 6),\n                (6, 7),\n                // Skipped range\n                (8, 9)\n            ]\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 2),\n                (0, 2),\n                (2, 3),\n                (3, 5),\n                (3, 5),\n                (5, 6),\n                (6, 7),\n                (7, 7), // Eaten n\n                (7, 8)\n            ]\n        );\n    }\n\n    #[test]\n    fn mixed_addition_and_removal() {\n        let mut n = NormalizedString::from(\"élégant\");\n        n.nfd().filter(|c| !c.is_mark_nonspacing() && c != 'n');\n        assert_eq!(n.get(), \"elegat\");\n        assert_eq!(\n            &n.alignments,\n            &[(0, 2), (2, 3), (3, 5), (5, 6), (6, 7), (8, 9)]\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 1),\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (2, 3),\n                (3, 4), // g\n                (4, 5), // a\n                (5, 5), // Eaten n\n                (5, 6)\n            ]\n        );\n    }\n\n    #[test]\n    fn range_conversion() {\n        let mut n = NormalizedString::from(\"    __Hello__   \");\n        n.filter(|c| !c.is_whitespace()).lowercase();\n        let hello_n = n.convert_offsets(Range::Original(6..11));\n        assert_eq!(hello_n, Some(2..7));\n        assert_eq!(\n            n.get_range(Range::Normalized(hello_n.clone().unwrap())),\n            Some(\"hello\")\n        );\n        assert_eq!(\n            n.get_range_original(Range::Normalized(hello_n.unwrap())),\n            Some(\"Hello\")\n        );\n        assert_eq!(n.get_range(Range::Original(6..11)), Some(\"hello\"));\n        assert_eq!(n.get_range_original(Range::Original(6..11)), Some(\"Hello\"));\n\n        // Make sure we get None only in specific cases\n        assert_eq!(n.convert_offsets(Range::Original(0..0)), Some(0..0));\n        assert_eq!(n.convert_offsets(Range::Original(3..3)), Some(3..3));\n        assert_eq!(n.convert_offsets(Range::Original(15..)), Some(9..9));\n        assert_eq!(n.convert_offsets(Range::Original(16..)), Some(16..16));\n        assert_eq!(n.convert_offsets(Range::Original(17..)), None);\n        assert_eq!(n.convert_offsets(Range::Normalized(0..0)), Some(0..0));\n        assert_eq!(n.convert_offsets(Range::Normalized(3..3)), Some(3..3));\n        assert_eq!(n.convert_offsets(Range::Normalized(9..)), Some(9..9));\n        assert_eq!(n.convert_offsets(Range::Normalized(10..)), None);\n    }\n\n    #[test]\n    fn original_range() {\n        let mut n = NormalizedString::from(\"Hello_______ World!\");\n        n.filter(|c| c != '_').lowercase();\n        let world_n = n.get_range(Range::Normalized(6..11)).unwrap();\n        let world_o = n.get_range_original(Range::Normalized(6..11)).unwrap();\n        assert_eq!(world_n, \"world\");\n        assert_eq!(world_o, \"World\");\n        let original_range = Range::Original(n.convert_offsets(Range::Normalized(6..11)).unwrap());\n        assert_eq!(n.get_range(original_range.clone()).unwrap(), \"world\");\n        assert_eq!(\n            n.get_range_original(original_range.clone()).unwrap(),\n            \"World\"\n        );\n        assert_eq!(original_range.into_full_range(n.len_original()), 13..18);\n    }\n\n    #[test]\n    fn added_around_edges() {\n        let mut n = NormalizedString::from(\"Hello\");\n        n.transform(\n            vec![\n                (' ', 1),\n                ('H', 0),\n                ('e', 0),\n                ('l', 0),\n                ('l', 0),\n                ('o', 0),\n                (' ', 1),\n            ],\n            0,\n        );\n\n        assert_eq!(&n.normalized, \" Hello \");\n        assert_eq!(\n            n.get_range_original(Range::Normalized(1..n.normalized.len() - 1)),\n            Some(\"Hello\")\n        );\n    }\n\n    #[test]\n    fn added_characters_alignment() {\n        let mut n = NormalizedString::from(\"野口 No\");\n        n.transform(\n            n.get().to_owned().chars().flat_map(|c| {\n                if (c as usize) > 0x4E00 {\n                    vec![(' ', 0), (c, 1), (' ', 1)]\n                } else {\n                    vec![(c, 0)]\n                }\n            }),\n            0,\n        );\n\n        assert_eq!(\n            n,\n            NormalizedString {\n                original: \"野口 No\".into(),\n                normalized: \" 野  口  No\".into(),\n                alignments: vec![\n                    (0, 3),\n                    (0, 3),\n                    (0, 3),\n                    (0, 3),\n                    (0, 3),\n                    (3, 6),\n                    (3, 6),\n                    (3, 6),\n                    (3, 6),\n                    (3, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9)\n                ],\n                original_shift: 0\n            }\n        );\n        assert_eq!(\n            n.alignments_original(),\n            vec![\n                (0, 5),\n                (0, 5),\n                (0, 5),\n                (5, 10),\n                (5, 10),\n                (5, 10),\n                (10, 11),\n                (11, 12),\n                (12, 13)\n            ]\n        );\n    }\n\n    #[test]\n    fn remove_at_beginning() {\n        let mut n = NormalizedString::from(\"     Hello\");\n        n.filter(|c| !c.is_whitespace());\n        assert_eq!(\n            n.get_range_original(Range::Normalized(1..\"Hello\".len())),\n            Some(\"ello\")\n        );\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..n.normalized.len())),\n            Some(\"Hello\")\n        );\n    }\n\n    #[test]\n    fn remove_at_end() {\n        let mut n = NormalizedString::from(\"Hello    \");\n        n.filter(|c| !c.is_whitespace());\n        assert_eq!(n.get_range_original(Range::Normalized(0..4)), Some(\"Hell\"));\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..n.normalized.len())),\n            Some(\"Hello\")\n        );\n    }\n\n    #[test]\n    fn removed_around_both_edges() {\n        let mut n = NormalizedString::from(\"  Hello  \");\n        n.filter(|c| !c.is_whitespace());\n        assert_eq!(&n.normalized, \"Hello\");\n\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..\"Hello\".len())),\n            Some(\"Hello\")\n        );\n        assert_eq!(\n            n.get_range_original(Range::Normalized(1..\"Hell\".len())),\n            Some(\"ell\")\n        );\n    }\n\n    #[test]\n    fn lstrip() {\n        let mut n = NormalizedString::from(\"  This is an example  \");\n        n.lstrip();\n        assert_eq!(&n.normalized, \"This is an example  \");\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..n.normalized.len())),\n            Some(\"This is an example  \")\n        );\n    }\n\n    #[test]\n    fn rstrip() {\n        let mut n = NormalizedString::from(\"  This is an example  \");\n        n.rstrip();\n        assert_eq!(&n.normalized, \"  This is an example\");\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..n.normalized.len())),\n            Some(\"  This is an example\")\n        );\n    }\n\n    #[test]\n    fn strip() {\n        let mut n = NormalizedString::from(\"  This is an example  \");\n        n.strip();\n        assert_eq!(&n.normalized, \"This is an example\");\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..n.normalized.len())),\n            Some(\"This is an example\")\n        );\n    }\n\n    #[test]\n    fn strip_unicode() {\n        let mut n = NormalizedString::from(\"  你好asa \\n\");\n        n.strip();\n        assert_eq!(&n.normalized, \"你好asa\");\n        assert_eq!(\n            n.get_range_original(Range::Normalized(0..n.normalized.len())),\n            Some(\"你好asa\")\n        );\n    }\n\n    #[test]\n    fn prepend() {\n        let mut n = NormalizedString::from(\"there\");\n        n.prepend(\"Hey \");\n        assert_eq!(&n.normalized, \"Hey there\");\n        assert_eq!(\n            n.alignments,\n            vec![\n                (0, 1),\n                (0, 1),\n                (0, 1),\n                (0, 1),\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5)\n            ]\n        );\n        assert_eq!(n.convert_offsets(Range::Normalized(0..4)), Some(0..1));\n    }\n\n    #[test]\n    fn append() {\n        let mut n = NormalizedString::from(\"Hey\");\n        n.append(\" there\");\n        assert_eq!(&n.normalized, \"Hey there\");\n        assert_eq!(\n            n.alignments,\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (2, 3),\n                (2, 3),\n                (2, 3),\n                (2, 3),\n                (2, 3),\n                (2, 3)\n            ]\n        );\n        assert_eq!(\n            n.convert_offsets(Range::Normalized(3..\" there\".len())),\n            Some(2..3)\n        );\n    }\n\n    #[test]\n    fn get_range() {\n        let s = String::from(\"Hello my name is John 👋\");\n        assert_eq!(get_range_of(&s, ..), Some(&s[..]));\n        assert_eq!(get_range_of(&s, 17..), Some(\"John 👋\"));\n    }\n\n    #[test]\n    fn slice() {\n        let mut s = NormalizedString::from(\"𝔾𝕠𝕠𝕕 𝕞𝕠𝕣𝕟𝕚𝕟𝕘\");\n        s.nfkc();\n\n        let original_slice = s.slice(Range::Original(0..4)).unwrap();\n        assert_eq!(original_slice.get(), \"G\");\n        assert_eq!(original_slice.get_original(), \"𝔾\");\n\n        let normalized_slice = s.slice(Range::Normalized(0..4)).unwrap();\n        assert_eq!(normalized_slice.get(), \"Good\");\n        assert_eq!(normalized_slice.get_original(), \"𝔾𝕠𝕠𝕕\");\n\n        // Make sure the sliced NormalizedString is still aligned as expected\n        let mut s = NormalizedString::from(\"   Good Morning!   \");\n        s.strip();\n\n        // If we keep the whole slice\n        let slice = s.slice(Range::Original(..)).unwrap();\n        assert_eq!(\n            slice.get_range_original(Range::Normalized(0..4)),\n            Some(\"Good\")\n        );\n        let slice = s.slice(Range::Normalized(..)).unwrap();\n        assert_eq!(\n            slice.get_range_original(Range::Normalized(0..4)),\n            Some(\"Good\")\n        );\n\n        // If we keep after the modified piece\n        let slice = s.slice(Range::Original(4..15)).unwrap();\n        assert_eq!(\n            slice.get_range_original(Range::Normalized(0..3)),\n            Some(\"ood\")\n        );\n\n        // If we keep only the modified piece\n        let slice = s.slice(Range::Original(3..16)).unwrap();\n        assert_eq!(\n            slice.get_range_original(Range::Normalized(0..4)),\n            Some(\"Good\")\n        );\n    }\n\n    #[test]\n    fn replace() {\n        // Simple\n        let mut s = NormalizedString::from(\" Hello   friend \");\n        s.replace(' ', \"_\").unwrap();\n        assert_eq!(s.get(), \"_Hello___friend_\");\n        let mut s = NormalizedString::from(\"aaaab\");\n        s.replace('a', \"b\").unwrap();\n        assert_eq!(s.get(), \"bbbbb\");\n\n        // Overlapping\n        let mut s = NormalizedString::from(\"aaaab\");\n        s.replace(\"aaa\", \"b\").unwrap();\n        assert_eq!(s.get(), \"bab\");\n\n        // Regex\n        let mut s = NormalizedString::from(\" Hello   friend \");\n        let re = Regex::new(r\"\\s+\").unwrap();\n        s.replace(&re, \"_\").unwrap();\n        assert_eq!(s.get(), \"_Hello_friend_\");\n    }\n\n    #[test]\n    fn split() {\n        use SplitDelimiterBehavior::*;\n        let s = NormalizedString::from(\"The-final--countdown\");\n\n        let test = |behavior: SplitDelimiterBehavior, result: Vec<&str>| {\n            let splits = s.split('-', behavior).unwrap();\n            assert_eq!(splits.iter().map(|n| n.get()).collect::<Vec<_>>(), result);\n        };\n\n        test(Removed, vec![\"The\", \"final\", \"countdown\"]);\n        test(Isolated, vec![\"The\", \"-\", \"final\", \"-\", \"-\", \"countdown\"]);\n        test(MergedWithPrevious, vec![\"The-\", \"final-\", \"-\", \"countdown\"]);\n        test(MergedWithNext, vec![\"The\", \"-final\", \"-\", \"-countdown\"]);\n        test(Contiguous, vec![\"The\", \"-\", \"final\", \"--\", \"countdown\"]);\n    }\n\n    #[test]\n    fn transform_range_single_bytes() {\n        let s = NormalizedString::from(\"Hello friend\");\n\n        // Removing at the beginning\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..4), vec![('Y', 0)], 3);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"Yo friend\".into(),\n                alignments: vec![\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9),\n                    (9, 10),\n                    (10, 11),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 0),\n                (0, 0),\n                (0, 0),\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (7, 8),\n                (8, 9)\n            ]\n        );\n\n        // Removing in the middle\n        let mut current = s.clone();\n        current.transform_range(\n            Range::Original(3..10),\n            vec![('_', 0), ('F', 0), ('R', -2)],\n            2,\n        );\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"Hel_FRnd\".into(),\n                alignments: vec![\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (10, 11),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 3),\n                (3, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 6),\n                (6, 6),\n                (6, 7),\n                (7, 8)\n            ]\n        );\n\n        // Removing at the end\n        let mut current = s.clone();\n        current.transform_range(Range::Original(5..), vec![('_', 0), ('F', -5)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"Hello_F\".into(),\n                alignments: vec![(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (7, 7),\n                (7, 7),\n                (7, 7),\n                (7, 7),\n                (7, 7)\n            ]\n        );\n\n        // Adding at the beginning\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..1), vec![('H', 1), ('H', 0)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"HHello friend\".into(),\n                alignments: vec![\n                    (0, 0),\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9),\n                    (9, 10),\n                    (10, 11),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (7, 8),\n                (8, 9),\n                (9, 10),\n                (10, 11),\n                (11, 12),\n                (12, 13)\n            ]\n        );\n        // Equivalent to the previous one\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..0), vec![('H', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"HHello friend\".into(),\n                alignments: vec![\n                    (0, 0),\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9),\n                    (9, 10),\n                    (10, 11),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (7, 8),\n                (8, 9),\n                (9, 10),\n                (10, 11),\n                (11, 12),\n                (12, 13)\n            ]\n        );\n        // Adding as part of the first character\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..1), vec![('H', 0), ('H', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"HHello friend\".into(),\n                alignments: vec![\n                    (0, 1),\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9),\n                    (9, 10),\n                    (10, 11),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (7, 8),\n                (8, 9),\n                (9, 10),\n                (10, 11),\n                (11, 12),\n                (12, 13)\n            ]\n        );\n\n        // Adding in the middle\n        let mut current = s.clone();\n        current.transform_range(\n            Range::Original(5..6),\n            vec![('_', 0), ('m', 1), ('y', 1), ('_', 1)],\n            0,\n        );\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"Hello_my_friend\".into(),\n                alignments: vec![\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (5, 6),\n                    (5, 6),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9),\n                    (9, 10),\n                    (10, 11),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 9),\n                (9, 10),\n                (10, 11),\n                (11, 12),\n                (12, 13),\n                (13, 14),\n                (14, 15)\n            ]\n        );\n\n        // Adding at the end\n        let mut current = s;\n        current.transform_range(Range::Original(11..), vec![('d', 0), ('_', 1), ('!', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"Hello friend\".into(),\n                normalized: \"Hello friend_!\".into(),\n                alignments: vec![\n                    (0, 1),\n                    (1, 2),\n                    (2, 3),\n                    (3, 4),\n                    (4, 5),\n                    (5, 6),\n                    (6, 7),\n                    (7, 8),\n                    (8, 9),\n                    (9, 10),\n                    (10, 11),\n                    (11, 12),\n                    (11, 12),\n                    (11, 12)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (7, 8),\n                (8, 9),\n                (9, 10),\n                (10, 11),\n                (11, 14)\n            ]\n        );\n    }\n\n    #[test]\n    fn transform_range_multiple_bytes() {\n        let s = NormalizedString::from(\"𝔾𝕠𝕠𝕕\");\n\n        // Removing at the beginning\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..8), vec![('G', -1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"G𝕠𝕕\".into(),\n                alignments: vec![\n                    (0, 4),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 1),\n                (0, 1),\n                (0, 1),\n                (0, 1),\n                (1, 1),\n                (1, 1),\n                (1, 1),\n                (1, 1),\n                (1, 5),\n                (1, 5),\n                (1, 5),\n                (1, 5),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (5, 9)\n            ]\n        );\n        assert_eq!(current.get_range(Range::Original(0..8)).unwrap(), \"G\");\n        assert_eq!(current.get_range(Range::Original(0..4)).unwrap(), \"G\");\n        assert_eq!(\n            current.get_range_original(Range::Original(0..4)).unwrap(),\n            \"𝔾\"\n        );\n        assert_eq!(\n            current.get_range_original(Range::Original(0..8)).unwrap(),\n            \"𝔾𝕠\"\n        );\n\n        // Removing in the middle\n        let mut current = s.clone();\n        current.transform_range(Range::Original(4..12), vec![('o', -1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"𝔾o𝕕\".into(),\n                alignments: vec![\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 4),\n                (0, 4),\n                (0, 4),\n                (0, 4),\n                (4, 5),\n                (4, 5),\n                (4, 5),\n                (4, 5),\n                (5, 5),\n                (5, 5),\n                (5, 5),\n                (5, 5),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (5, 9)\n            ]\n        );\n\n        // Removing at the end\n        let mut current = s.clone();\n        current.transform_range(Range::Original(12..), vec![('d', 0), ('!', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"𝔾𝕠𝕠d!\".into(),\n                alignments: vec![\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n\n        // Adding at the beginning\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..4), vec![('_', 1), ('𝔾', 0)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"_𝔾𝕠𝕠𝕕\".into(),\n                alignments: vec![\n                    (0, 0),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (1, 5),\n                (1, 5),\n                (1, 5),\n                (1, 5),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (9, 13),\n                (9, 13),\n                (9, 13),\n                (9, 13),\n                (13, 17),\n                (13, 17),\n                (13, 17),\n                (13, 17)\n            ]\n        );\n\n        assert_eq!(current.get_range(Range::Original(0..8)).unwrap(), \"𝔾𝕠\");\n        assert_eq!(current.get_range(Range::Original(0..4)).unwrap(), \"𝔾\");\n        assert_eq!(\n            current.get_range_original(Range::Original(0..4)).unwrap(),\n            \"𝔾\"\n        );\n        assert_eq!(\n            current.get_range_original(Range::Original(0..8)).unwrap(),\n            \"𝔾𝕠\"\n        );\n        // Equivalent to the previous one\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..0), vec![('_', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"_𝔾𝕠𝕠𝕕\".into(),\n                alignments: vec![\n                    (0, 0),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (1, 5),\n                (1, 5),\n                (1, 5),\n                (1, 5),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (9, 13),\n                (9, 13),\n                (9, 13),\n                (9, 13),\n                (13, 17),\n                (13, 17),\n                (13, 17),\n                (13, 17)\n            ]\n        );\n\n        assert_eq!(current.get_range(Range::Original(0..8)).unwrap(), \"𝔾𝕠\");\n        assert_eq!(current.get_range(Range::Original(0..4)).unwrap(), \"𝔾\");\n        assert_eq!(\n            current.get_range_original(Range::Original(0..4)).unwrap(),\n            \"𝔾\"\n        );\n        assert_eq!(\n            current.get_range_original(Range::Original(0..8)).unwrap(),\n            \"𝔾𝕠\"\n        );\n        // Adding as part of the first character\n        let mut current = s.clone();\n        current.transform_range(Range::Original(0..4), vec![('𝔾', 0), ('o', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"𝔾o𝕠𝕠𝕕\".into(),\n                alignments: vec![\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 5),\n                (0, 5),\n                (0, 5),\n                (0, 5),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (5, 9),\n                (9, 13),\n                (9, 13),\n                (9, 13),\n                (9, 13),\n                (13, 17),\n                (13, 17),\n                (13, 17),\n                (13, 17)\n            ]\n        );\n        assert_eq!(current.get_range(Range::Original(0..8)).unwrap(), \"𝔾o𝕠\");\n        assert_eq!(current.get_range(Range::Original(0..4)).unwrap(), \"𝔾o\");\n        assert_eq!(\n            current.get_range_original(Range::Original(0..4)).unwrap(),\n            \"𝔾\"\n        );\n        assert_eq!(\n            current.get_range_original(Range::Original(0..8)).unwrap(),\n            \"𝔾𝕠\"\n        );\n\n        // Adding in the middle\n        let mut current = s.clone();\n        current.transform_range(\n            Range::Original(4..8),\n            vec![('𝕠', 0), ('o', 1), ('o', 1), ('o', 1)],\n            0,\n        );\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"𝔾𝕠ooo𝕠𝕕\".into(),\n                alignments: vec![\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 4),\n                (0, 4),\n                (0, 4),\n                (0, 4),\n                (4, 11),\n                (4, 11),\n                (4, 11),\n                (4, 11),\n                (11, 15),\n                (11, 15),\n                (11, 15),\n                (11, 15),\n                (15, 19),\n                (15, 19),\n                (15, 19),\n                (15, 19)\n            ]\n        );\n\n        // Adding at the end\n        let mut current = s;\n        current.transform_range(Range::Original(16..), vec![('!', 1)], 0);\n        assert_eq!(\n            current,\n            NormalizedString {\n                original: \"𝔾𝕠𝕠𝕕\".into(),\n                normalized: \"𝔾𝕠𝕠𝕕!\".into(),\n                alignments: vec![\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (0, 4),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (4, 8),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (8, 12),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16),\n                    (12, 16)\n                ],\n                original_shift: 0,\n            }\n        );\n        assert_eq!(\n            current.alignments_original(),\n            vec![\n                (0, 4),\n                (0, 4),\n                (0, 4),\n                (0, 4),\n                (4, 8),\n                (4, 8),\n                (4, 8),\n                (4, 8),\n                (8, 12),\n                (8, 12),\n                (8, 12),\n                (8, 12),\n                (12, 17),\n                (12, 17),\n                (12, 17),\n                (12, 17)\n            ]\n        );\n    }\n\n    #[test]\n    fn transform_check() {\n        let mut s = NormalizedString::from(\"abc…\");\n        s.nfkd();\n        let transforms = vec![('a', -2), ('.', 0), ('.', 0), ('.', 0)];\n        s.transform(transforms, 0);\n        s.lowercase();\n        assert_eq!(s.get(), \"a...\");\n    }\n\n    #[test]\n    fn test_append_after_clear() {\n        let mut n = NormalizedString::from(\"Hello\");\n        assert_eq!(n.get(), \"Hello\");\n\n        n.clear();\n        assert_eq!(n.get(), \"\");\n\n        n.append(\" World\");\n        assert_eq!(n.get(), \" World\");\n\n        assert_eq!(n.len_original(), 5);\n        assert_eq!(n.len(), 6);\n\n        assert_eq!(n.get_range_original(Range::Original(0..5)), Some(\"Hello\"));\n        assert_eq!(n.get_range_original(Range::Normalized(0..6)), Some(\"\"));\n\n        assert_eq!(n.get_range(Range::Normalized(0..6)), Some(\" World\"));\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/pattern.rs",
    "content": "use crate::utils::SysRegex;\nuse crate::{Offsets, Result};\nuse regex::Regex;\n\n/// Pattern used to split a NormalizedString\npub trait Pattern {\n    /// Slice the given string in a list of pattern match positions, with\n    /// a boolean indicating whether this is a match or not.\n    ///\n    /// This method *must* cover the whole string in its outputs, with\n    /// contiguous ordered slices.\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>>;\n}\n\nimpl Pattern for char {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        let is_char = |c: char| -> bool { c == *self };\n        is_char.find_matches(inside)\n    }\n}\n\nimpl Pattern for &str {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        if self.is_empty() {\n            // If we try to find the matches with an empty string, just don't match anything\n            return Ok(vec![((0, inside.chars().count()), false)]);\n        }\n\n        let re = Regex::new(&regex::escape(self))?;\n        (&re).find_matches(inside)\n    }\n}\n\nimpl Pattern for &String {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        let s: &str = self;\n        s.find_matches(inside)\n    }\n}\n\nimpl Pattern for &Regex {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        if inside.is_empty() {\n            return Ok(vec![((0, 0), false)]);\n        }\n\n        let mut prev = 0;\n        let mut splits = Vec::with_capacity(inside.len());\n        for m in self.find_iter(inside) {\n            if prev != m.start() {\n                splits.push(((prev, m.start()), false));\n            }\n            splits.push(((m.start(), m.end()), true));\n            prev = m.end();\n        }\n        if prev != inside.len() {\n            splits.push(((prev, inside.len()), false))\n        }\n        Ok(splits)\n    }\n}\n\nimpl Pattern for &SysRegex {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        if inside.is_empty() {\n            return Ok(vec![((0, 0), false)]);\n        }\n\n        let mut prev = 0;\n        let mut splits = Vec::with_capacity(inside.len());\n        for (start, end) in self.find_iter(inside) {\n            if prev != start {\n                splits.push(((prev, start), false));\n            }\n            splits.push(((start, end), true));\n            prev = end;\n        }\n        if prev != inside.len() {\n            splits.push(((prev, inside.len()), false))\n        }\n        Ok(splits)\n    }\n}\n\nimpl<F> Pattern for F\nwhere\n    F: Fn(char) -> bool,\n{\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        if inside.is_empty() {\n            return Ok(vec![((0, 0), false)]);\n        }\n\n        let mut last_offset = 0;\n        let mut last_seen = 0;\n\n        let mut matches = inside\n            .char_indices()\n            .flat_map(|(b, c)| {\n                last_seen = b + c.len_utf8();\n                if self(c) {\n                    let mut events = Vec::with_capacity(2);\n                    if last_offset < b {\n                        // We need to emit what was before this match\n                        events.push(((last_offset, b), false));\n                    }\n                    events.push(((b, b + c.len_utf8()), true));\n                    last_offset = b + c.len_utf8();\n                    events\n                } else {\n                    vec![]\n                }\n            })\n            .collect::<Vec<_>>();\n\n        // Do not forget the last potential split\n        if last_seen > last_offset {\n            matches.push(((last_offset, last_seen), false));\n        }\n\n        Ok(matches)\n    }\n}\n\n/// Invert the `is_match` flags for the wrapped Pattern. This is useful\n/// for example when we use a regex that matches words instead of a delimiter,\n/// and we want to match the delimiter.\npub struct Invert<P: Pattern>(pub P);\nimpl<P: Pattern> Pattern for Invert<P> {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        Ok(self\n            .0\n            .find_matches(inside)?\n            .into_iter()\n            .map(|(offsets, flag)| (offsets, !flag))\n            .collect())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use regex::Regex;\n\n    macro_rules! do_test {\n        ($inside: expr, $pattern: expr => @ERROR) => {\n            assert!($pattern.find_matches($inside).is_err());\n        };\n        ($inside: expr, $pattern: expr => $result: expr) => {\n            assert_eq!($pattern.find_matches($inside).unwrap(), $result);\n            assert_eq!(\n                Invert($pattern).find_matches($inside).unwrap(),\n                $result\n                    .into_iter()\n                    .map(|v: (Offsets, bool)| (v.0, !v.1))\n                    .collect::<Vec<_>>()\n            );\n        };\n    }\n\n    #[test]\n    fn char() {\n        do_test!(\"aba\", 'a' => vec![((0, 1), true), ((1, 2), false), ((2, 3), true)]);\n        do_test!(\"bbbba\", 'a' => vec![((0, 4), false), ((4, 5), true)]);\n        do_test!(\"aabbb\", 'a' => vec![((0, 1), true), ((1, 2), true), ((2, 5), false)]);\n        do_test!(\"\", 'a' => vec![((0, 0), false)]);\n        do_test!(\"aaa\", 'b' => vec![((0, 3), false)]);\n    }\n\n    #[test]\n    fn str() {\n        do_test!(\"aba\", \"a\" => vec![((0, 1), true), ((1, 2), false), ((2, 3), true)]);\n        do_test!(\"bbbba\", \"a\" => vec![((0, 4), false), ((4, 5), true)]);\n        do_test!(\"aabbb\", \"a\" => vec![((0, 1), true), ((1, 2), true), ((2, 5), false)]);\n        do_test!(\"aabbb\", \"ab\" => vec![((0, 1), false), ((1, 3), true), ((3, 5), false)]);\n        do_test!(\"aabbab\", \"ab\" =>\n            vec![((0, 1), false), ((1, 3), true), ((3, 4), false), ((4, 6), true)]\n        );\n        do_test!(\"\", \"\" => vec![((0, 0), false)]);\n        do_test!(\"aaa\", \"\" => vec![((0, 3), false)]);\n        do_test!(\"aaa\", \"b\" => vec![((0, 3), false)]);\n    }\n\n    #[test]\n    fn functions() {\n        let is_b = |c| c == 'b';\n        do_test!(\"aba\", is_b => vec![((0, 1), false), ((1, 2), true), ((2, 3), false)]);\n        do_test!(\"aaaab\", is_b => vec![((0, 4), false), ((4, 5), true)]);\n        do_test!(\"bbaaa\", is_b => vec![((0, 1), true), ((1, 2), true), ((2, 5), false)]);\n        do_test!(\"\", is_b => vec![((0, 0), false)]);\n        do_test!(\"aaa\", is_b => vec![((0, 3), false)]);\n    }\n\n    #[test]\n    fn regex() {\n        let is_whitespace = Regex::new(r\"\\s+\").unwrap();\n        do_test!(\"a   b\", &is_whitespace => vec![((0, 1), false), ((1, 4), true), ((4, 5), false)]);\n        do_test!(\"   a   b   \", &is_whitespace =>\n            vec![((0, 3), true), ((3, 4), false), ((4, 7), true), ((7, 8), false), ((8, 11), true)]\n        );\n        do_test!(\"\", &is_whitespace => vec![((0, 0), false)]);\n        do_test!(\"𝔾𝕠𝕠𝕕 𝕞𝕠𝕣𝕟𝕚𝕟𝕘\", &is_whitespace =>\n            vec![((0, 16), false), ((16, 17), true), ((17, 45), false)]\n        );\n        do_test!(\"aaa\", &is_whitespace => vec![((0, 3), false)]);\n    }\n\n    #[test]\n    fn sys_regex() {\n        let is_whitespace = SysRegex::new(r\"\\s+\").unwrap();\n        do_test!(\"a   b\", &is_whitespace => vec![((0, 1), false), ((1, 4), true), ((4, 5), false)]);\n        do_test!(\"   a   b   \", &is_whitespace =>\n            vec![((0, 3), true), ((3, 4), false), ((4, 7), true), ((7, 8), false), ((8, 11), true)]\n        );\n        do_test!(\"\", &is_whitespace => vec![((0, 0), false)]);\n        do_test!(\"𝔾𝕠𝕠𝕕 𝕞𝕠𝕣𝕟𝕚𝕟𝕘\", &is_whitespace =>\n            vec![((0, 16), false), ((16, 17), true), ((17, 45), false)]\n        );\n        do_test!(\"aaa\", &is_whitespace => vec![((0, 3), false)]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/pre_tokenizer.rs",
    "content": "use crate::{\n    normalizer::Range, Encoding, NormalizedString, OffsetReferential, Offsets, Result, Token,\n};\nuse std::collections::HashMap;\n\n/// Various possible types of offsets\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum OffsetType {\n    Byte,\n    Char,\n    None,\n}\n\n/// Wrapper for a subpart of a `NormalizedString`.\n///\n/// This Split contains the underlying `NormalizedString` as well as its offsets\n/// in the original string. These offsets are in the `original` referential.\n/// It also contains any `Token` associated to the current split\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct Split {\n    /// The underlying `NormalizedString`. Each SubString is represented by a `NormalizedString`\n    /// and in the end we might be carrying a lot of SubString representing various parts of the\n    /// original input string.\n    normalized: NormalizedString,\n    /// Optional Tokens associated to this Split\n    tokens: Option<Vec<Token>>,\n}\n\nimpl From<NormalizedString> for Split {\n    fn from(n: NormalizedString) -> Self {\n        Self {\n            normalized: n,\n            tokens: None,\n        }\n    }\n}\n\nimpl From<(NormalizedString, Option<Vec<Token>>)> for Split {\n    fn from(f: (NormalizedString, Option<Vec<Token>>)) -> Self {\n        Self {\n            normalized: f.0,\n            tokens: f.1,\n        }\n    }\n}\n\n/// The `PreTokenizedString` is in charge of splitting an underlying string,\n/// making sure everything is fine while doing so, and providing ways to normalize\n/// and tokenize these splits.\n/// Once everything has been normalized and tokenized, the `PreTokenizedString` is able\n/// to build an `Encoding` with all the relevant offsets and word ids, relative to the\n/// original string.\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct PreTokenizedString {\n    original: String,\n    splits: Vec<Split>,\n}\n\nimpl PreTokenizedString {\n    /// Split the `PreTokenizedString` by providing a `split_fn` in charge of splitting\n    /// each substring (`NormalizedString`) into multiple parts.\n    ///\n    /// `split_fn` takes a `NormalizedString` and is in charge of returning an iterator\n    /// over the produced `NormalizedString`. `split_fn` is free of modifying these\n    /// `NormalizedString` as relevant, as long as it respects the constraint stated below.\n    ///\n    /// There are only one constraint that *MUST* be respected:\n    /// > The produced `NormalizedString`, if combined back together, must have the\n    /// > same `original` string as the original one given to `split_fn`. This concretely\n    /// > means that for the offset tracking to work as expected, `split_fn` must produce\n    /// > \"splits\" of the original string.\n    pub fn split<F, U, R>(&mut self, mut split_fn: F) -> Result<()>\n    where\n        F: FnMut(usize, NormalizedString) -> Result<U>,\n        U: IntoIterator<Item = R>,\n        R: Into<Split>,\n    {\n        // new_splits is at least as big as self.splits\n        let mut new_splits = Vec::with_capacity(self.splits.len());\n        for (i, original_split) in self.splits.drain(..).enumerate() {\n            if original_split.tokens.is_some() {\n                new_splits.push(original_split);\n                continue;\n            }\n\n            new_splits.extend(\n                split_fn(i, original_split.normalized)?\n                    .into_iter()\n                    .filter_map(|split| {\n                        let split: Split = split.into();\n                        if split.normalized.is_empty() {\n                            None\n                        } else {\n                            Some(split)\n                        }\n                    }),\n            );\n        }\n        self.splits = new_splits;\n\n        Ok(())\n    }\n\n    /// Normalized all the splits that do not have attached `Tokens`, using the provided\n    /// `normalize` function.\n    pub fn normalize<F>(&mut self, normalize: F) -> Result<()>\n    where\n        F: Fn(&mut NormalizedString) -> Result<()>,\n    {\n        for split in self.splits.iter_mut().filter(|s| s.tokens.is_none()) {\n            normalize(&mut split.normalized)?;\n        }\n        Ok(())\n    }\n\n    /// Tokenize all the splits that do not have attached `Tokens`, using the provided\n    /// `tokenize` function\n    pub fn tokenize<F>(&mut self, tokenize: F) -> Result<()>\n    where\n        F: Fn(&NormalizedString) -> Result<Vec<Token>>,\n    {\n        for split in self.splits.iter_mut().filter(|s| s.tokens.is_none()) {\n            split.tokens = Some(tokenize(&split.normalized)?);\n        }\n\n        Ok(())\n    }\n\n    /// Transform the current `PreTokenizedString` into an `Encoding`.\n    ///\n    /// If a `word_idx` is provided, any word in the generated `Encoding`\n    /// will be set to this value. This is generally used with pre-tokenized\n    /// input, that do not need the `PreTokenizedString` to generate word ids.\n    ///\n    /// This method will fail if some splits do not have associated `Token`.\n    pub fn into_encoding(\n        self,\n        word_idx: Option<u32>,\n        type_id: u32,\n        offset_type: OffsetType,\n    ) -> Result<Encoding> {\n        if self.splits.is_empty() {\n            Ok(Encoding::default())\n        } else if !self.splits.iter().all(|split| split.tokens.is_some()) {\n            Err(\"Split has not been tokenized, call `PreTokenizedString::tokenize` first\".into())\n        } else {\n            let offset_converter = match offset_type {\n                OffsetType::Char => Some(BytesToCharOffsetConverter::new(&self.original)),\n                OffsetType::Byte => None,\n                OffsetType::None => {\n                    let tokens = self\n                        .splits\n                        .into_iter()\n                        .flat_map(|split| {\n                            split.tokens.unwrap().into_iter().map(|token| {\n                                // Replace this with the actual fields you need for the Encoding type\n                                (token.id, String::with_capacity(0), (0, 0), None, 0)\n                            })\n                        })\n                        .collect();\n                    return Ok(tokens);\n                }\n            };\n\n            Ok(self\n                .splits\n                .into_iter()\n                .enumerate()\n                .flat_map(|(idx, split)| {\n                    let normalized = split.normalized;\n                    let offsets = normalized.offsets_original();\n                    let offset_converter = &offset_converter;\n\n                    split.tokens.unwrap().into_iter().map(move |token| {\n                        let mut offsets = normalized\n                            .convert_offsets(Range::Normalized(token.offsets.0..token.offsets.1))\n                            .map_or(token.offsets, |range| {\n                                (offsets.0 + range.start, offsets.0 + range.end)\n                            });\n\n                        // Convert to char offsets if relevant\n                        if let Some(converter) = offset_converter {\n                            offsets = converter.convert(offsets).unwrap_or(offsets);\n                        }\n\n                        (\n                            token.id,\n                            token.value,\n                            offsets,\n                            if word_idx.is_some() {\n                                word_idx\n                            } else {\n                                Some(idx as u32)\n                            },\n                            type_id,\n                        )\n                    })\n                })\n                .collect())\n        }\n    }\n\n    /// Returns a list of splits, each of them being a slice of the normalized\n    /// string, the associated offsets either in original or normalized\n    /// referential, as well as the potention tokens\n    pub fn get_splits(\n        &self,\n        offset_ref: OffsetReferential,\n        offset_type: OffsetType,\n    ) -> Vec<(&str, Offsets, &Option<Vec<Token>>)> {\n        let offset_converter = match offset_type {\n            OffsetType::Char => Some(BytesToCharOffsetConverter::new(&self.original)),\n            OffsetType::Byte => None,\n            OffsetType::None => None,\n        };\n\n        let mut offset = 0;\n        self.splits\n            .iter()\n            .map(|split| {\n                let mut offsets = match offset_ref {\n                    OffsetReferential::Original => split.normalized.offsets_original(),\n                    OffsetReferential::Normalized => {\n                        let len = split.normalized.len();\n                        offset += len;\n                        (offset - len, offset)\n                    }\n                };\n\n                // Convert to char offsets if relevant\n                if let Some(ref converter) = offset_converter {\n                    offsets = converter.convert(offsets).unwrap_or(offsets);\n                }\n\n                (split.normalized.get(), offsets, &split.tokens)\n            })\n            .collect()\n    }\n}\n\nimpl From<NormalizedString> for PreTokenizedString {\n    fn from(s: NormalizedString) -> Self {\n        Self {\n            original: s.get_original().to_owned(),\n            splits: vec![Split {\n                normalized: s,\n                tokens: None,\n            }],\n        }\n    }\n}\n\nimpl From<&str> for PreTokenizedString {\n    fn from(s: &str) -> Self {\n        let normalized: NormalizedString = s.into();\n        normalized.into()\n    }\n}\n\nimpl From<String> for PreTokenizedString {\n    fn from(s: String) -> Self {\n        let normalized: NormalizedString = s.into();\n        normalized.into()\n    }\n}\n\nstruct BytesToCharOffsetConverter {\n    map: HashMap<usize, usize>,\n}\n\nimpl BytesToCharOffsetConverter {\n    pub fn new(sequence: &str) -> Self {\n        Self {\n            map: sequence\n                .char_indices()\n                .enumerate()\n                .flat_map(|(i, (b, c))| {\n                    let mut n = 0;\n                    std::iter::repeat_with(move || {\n                        let o = (b + n, i);\n                        n += 1;\n                        o\n                    })\n                    .take(c.len_utf8())\n                })\n                .collect(),\n        }\n    }\n\n    pub fn convert(&self, offsets: Offsets) -> Option<Offsets> {\n        match (self.map.get(&offsets.0), self.map.get(&offsets.1)) {\n            (Some(start), Some(end)) => Some((*start, *end)),\n            // If we reached the end, `end` is not in the map\n            (Some(start), None) => {\n                // But the one just before should be\n                let last = self.map.get(&(offsets.1 - 1)).copied().unwrap_or(start + 1);\n                Some((*start, last + 1))\n            }\n            _ => None,\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/tokenizer/serialization.rs",
    "content": "use std::marker::PhantomData;\n\nuse serde::{\n    self,\n    de::{Error, MapAccess, Visitor},\n    ser::SerializeStruct,\n    Deserialize, Deserializer, Serialize, Serializer,\n};\n\nuse super::{added_vocabulary::AddedTokenWithId, TokenizerImpl};\nuse crate::{Decoder, Model, Normalizer, PostProcessor, PreTokenizer, TokenizerBuilder};\n\nstatic SERIALIZATION_VERSION: &str = \"1.0\";\n\nimpl<M, N, PT, PP, D> Serialize for TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: Serialize,\n    N: Serialize,\n    PT: Serialize,\n    PP: Serialize,\n    D: Serialize,\n{\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        let mut tokenizer = serializer.serialize_struct(\"Tokenizer\", 9)?;\n\n        // Start by adding the current version\n        tokenizer.serialize_field(\"version\", SERIALIZATION_VERSION)?;\n\n        // Params\n        tokenizer.serialize_field(\"truncation\", &self.truncation)?;\n        tokenizer.serialize_field(\"padding\", &self.padding)?;\n\n        // Added tokens\n        tokenizer.serialize_field(\"added_tokens\", &self.added_vocabulary)?;\n\n        // Then add our parts\n        tokenizer.serialize_field(\"normalizer\", &self.normalizer)?;\n        tokenizer.serialize_field(\"pre_tokenizer\", &self.pre_tokenizer)?;\n        tokenizer.serialize_field(\"post_processor\", &self.post_processor)?;\n        tokenizer.serialize_field(\"decoder\", &self.decoder)?;\n        tokenizer.serialize_field(\"model\", &self.model)?;\n\n        tokenizer.end()\n    }\n}\n\nimpl<'de, M, N, PT, PP, D> Deserialize<'de> for TokenizerImpl<M, N, PT, PP, D>\nwhere\n    M: Deserialize<'de> + Model,\n    N: Deserialize<'de> + Normalizer,\n    PT: Deserialize<'de> + PreTokenizer,\n    PP: Deserialize<'de> + PostProcessor,\n    D: Deserialize<'de> + Decoder,\n{\n    fn deserialize<De>(deserializer: De) -> Result<Self, De::Error>\n    where\n        De: Deserializer<'de>,\n    {\n        deserializer.deserialize_struct(\n            \"Tokenizer\",\n            &[\n                \"version\",\n                \"truncation\",\n                \"padding\",\n                \"added_tokens\",\n                \"normalizer\",\n                \"pre_tokenizer\",\n                \"post_processor\",\n                \"decoder\",\n                \"model\",\n            ],\n            TokenizerVisitor(\n                PhantomData,\n                PhantomData,\n                PhantomData,\n                PhantomData,\n                PhantomData,\n            ),\n        )\n    }\n}\n\nstruct TokenizerVisitor<M, N, PT, PP, D>(\n    PhantomData<M>,\n    PhantomData<N>,\n    PhantomData<PT>,\n    PhantomData<PP>,\n    PhantomData<D>,\n);\n\nimpl<'de, M, N, PT, PP, D> Visitor<'de> for TokenizerVisitor<M, N, PT, PP, D>\nwhere\n    M: Deserialize<'de> + Model,\n    N: Deserialize<'de> + Normalizer,\n    PT: Deserialize<'de> + PreTokenizer,\n    PP: Deserialize<'de> + PostProcessor,\n    D: Deserialize<'de> + Decoder,\n{\n    type Value = TokenizerImpl<M, N, PT, PP, D>;\n\n    fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(fmt, \"struct Tokenizer\")\n    }\n\n    fn visit_map<V>(self, mut map: V) -> Result<Self::Value, V::Error>\n    where\n        V: MapAccess<'de>,\n    {\n        let mut builder = TokenizerBuilder::new();\n        let mut tokens: Vec<AddedTokenWithId> = vec![];\n        while let Some(key) = map.next_key::<String>()? {\n            match key.as_ref() {\n                \"version\" => {\n                    let v: String = map.next_value()?;\n                    if &v != \"1.0\" {\n                        return Err(Error::custom(format!(\"Unknown tokenizer version '{v}'\")));\n                    }\n                }\n                \"truncation\" => {\n                    builder = builder.with_truncation(map.next_value()?);\n                }\n                \"padding\" => {\n                    builder = builder.with_padding(map.next_value()?);\n                }\n                \"added_tokens\" => {\n                    tokens = map.next_value()?;\n                }\n                \"normalizer\" => {\n                    builder = builder.with_normalizer(map.next_value()?);\n                }\n                \"pre_tokenizer\" => {\n                    builder = builder.with_pre_tokenizer(map.next_value()?);\n                }\n                \"model\" => {\n                    builder = builder.with_model(map.next_value()?);\n                }\n                \"decoder\" => {\n                    builder = builder.with_decoder(map.next_value()?);\n                }\n                \"post_processor\" => {\n                    builder = builder.with_post_processor(map.next_value()?);\n                }\n                _ => {}\n            };\n        }\n        let mut tokenizer = builder\n            .build()\n            .map_err(|e| V::Error::custom(e.to_string()))?;\n\n        // We take care of deserializing the added_tokens (instead of `AddedVocabulary` directly\n        // because it let us check that associated IDs are still good, and warn the user otherwise\n        for token in &tokens {\n            // Warn the user if the id is different than expected\n            let received_id = tokenizer.token_to_id(&token.token.content);\n            if let Some(rid) = received_id {\n                if rid != token.id {\n                    warn!(\n                        \"Warning: Token '{}' was expected to have ID '{}' but was given ID '{}'\",\n                        token.token.content, token.id, rid\n                    );\n                }\n            }\n        }\n        let added_tokens: Vec<_> = tokens.into_iter().map(|token| token.token).collect();\n        tokenizer.add_tokens(&added_tokens[..]);\n\n        Ok(tokenizer)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::tokenizer::Tokenizer;\n    use std::str::FromStr;\n\n    #[test]\n    fn test_deserialization_serialization_invariant() {\n        let tok_json = r#\"{\n  \"version\": \"1.0\",\n  \"truncation\": null,\n  \"padding\": null,\n  \"added_tokens\": [\n    {\n      \"id\": 0,\n      \"content\": \"[SPECIAL_0]\",\n      \"single_word\": false,\n      \"lstrip\": false,\n      \"rstrip\": false,\n      \"normalized\": false,\n      \"special\": true\n    },\n    {\n      \"id\": 1,\n      \"content\": \"[SPECIAL_1]\",\n      \"single_word\": false,\n      \"lstrip\": false,\n      \"rstrip\": false,\n      \"normalized\": true,\n      \"special\": false\n    },\n    {\n      \"id\": 2,\n      \"content\": \"[SPECIAL_2]\",\n      \"single_word\": false,\n      \"lstrip\": false,\n      \"rstrip\": false,\n      \"normalized\": false,\n      \"special\": true\n    }\n  ],\n  \"normalizer\": null,\n  \"pre_tokenizer\": null,\n  \"post_processor\": null,\n  \"decoder\": null,\n  \"model\": {\n    \"type\": \"WordPiece\",\n    \"unk_token\": \"[UNK]\",\n    \"continuing_subword_prefix\": \"\",\n    \"max_input_chars_per_word\": 100,\n    \"vocab\": {}\n  }\n}\"#;\n        let tokenizer = Tokenizer::from_str(tok_json).unwrap();\n\n        let tok_str = serde_json::to_string_pretty(&tokenizer).unwrap();\n        // It should be exactly the same as above\n        assert_eq!(tok_str, tok_json);\n    }\n\n    #[cfg(feature = \"http\")]\n    #[test]\n    fn test_from_pretrained() {\n        tracing_subscriber::fmt()\n            .with_max_level(tracing::Level::DEBUG)\n            .with_target(false)\n            .init();\n        let _ = Tokenizer::from_pretrained(\"Qwen/Qwen2-7B-Instruct\", None);\n        warn!(\"This should be the first warning\");\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/cache.rs",
    "content": "use ahash::AHashMap;\nuse std::borrow::Borrow;\nuse std::hash::Hash;\nuse std::sync::RwLock;\n\n/// The default capacity for a `BPE`'s internal cache.\npub static DEFAULT_CACHE_CAPACITY: usize = 10_000;\n/// The maximum length we should cache in a model\n/// Strings that are too long have minimal chances to cache hit anyway\npub static MAX_LENGTH: usize = 256;\n\n/// Provides a simple multithread cache to speed up BPE tokenization that will try to read values\n/// concurrently but won't block if another thread is writing.\n/// The goal is clearly not the accuracy of the content, both get and set\n/// are not guaranteed to actually get or set.\n#[derive(Debug)]\npub(crate) struct Cache<K, V>\nwhere\n    K: Eq + Hash + Clone,\n    V: Clone,\n{\n    map: RwLock<AHashMap<K, V>>,\n    pub capacity: usize,\n}\n\n// We dont really care about Cache comparison, so let's make them always equal\nimpl<K, V> PartialEq for Cache<K, V>\nwhere\n    K: Eq + Hash + Clone,\n    V: Clone,\n{\n    fn eq(&self, _other: &Cache<K, V>) -> bool {\n        true\n    }\n}\n\nimpl<K, V> Default for Cache<K, V>\nwhere\n    K: Eq + Hash + Clone,\n    V: Clone,\n{\n    fn default() -> Self {\n        Self::new(DEFAULT_CACHE_CAPACITY)\n    }\n}\n\nimpl<K, V> Cache<K, V>\nwhere\n    K: Eq + Hash + Clone,\n    V: Clone,\n{\n    /// Create new `Cache` with the given capacity.\n    pub(crate) fn new(capacity: usize) -> Self {\n        let map = RwLock::new(AHashMap::with_capacity(capacity));\n        Cache { map, capacity }\n    }\n\n    /// Create a fresh `Cache` with the same configuration.\n    pub(crate) fn fresh(&self) -> Self {\n        Self::new(self.capacity)\n    }\n\n    /// Clear the cache.\n    pub(crate) fn clear(&self) {\n        self.map.write().unwrap().clear();\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn get_values<'a, I, Q>(&self, keys_iter: I) -> Option<Vec<Option<V>>>\n    where\n        I: Iterator<Item = &'a Q>,\n        K: Borrow<Q>,\n        Q: Hash + Eq + ?Sized + 'a,\n    {\n        if let Ok(ref mut cache) = self.map.try_read() {\n            Some(keys_iter.map(|k| cache.get(k).cloned()).collect())\n        } else {\n            None\n        }\n    }\n\n    pub(crate) fn get<Q>(&self, key: &Q) -> Option<V>\n    where\n        K: Borrow<Q>,\n        Q: Hash + Eq + ?Sized,\n    {\n        if let Ok(ref mut cache) = self.map.try_read() {\n            cache.get(key).cloned()\n        } else {\n            None\n        }\n    }\n\n    pub(crate) fn set_values<I>(&self, entries: I)\n    where\n        I: IntoIterator<Item = (K, V)>,\n    {\n        // Before trying to acquire a write lock, we check if we are already at\n        // capacity with a read handler.\n        if let Ok(cache) = self.map.try_read() {\n            if cache.len() >= self.capacity {\n                // At capacity, so do nothing.\n                return;\n            }\n        } else {\n            // If we couldn't acquire a read handle then we probably won't be able to acquire\n            // a write handle one quadrillionth of a second later.\n            return;\n        }\n\n        // Not at capacity, so try acquiring a write handle.\n        if let Ok(mut cache) = self.map.try_write() {\n            let free = self.capacity - cache.len();\n            cache.extend(entries.into_iter().take(free));\n        }\n    }\n\n    pub(crate) fn set(&self, key: K, value: V) {\n        self.set_values(std::iter::once((key, value)))\n    }\n\n    pub(crate) fn resize(&mut self, capacity: usize) {\n        self.capacity = capacity;\n        if let Ok(mut cache) = self.map.try_write() {\n            cache.shrink_to(capacity);\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/fancy.rs",
    "content": "use crate::tokenizer::pattern::Pattern;\nuse crate::Offsets;\nuse fancy_regex::Regex;\nuse std::error::Error;\n\n#[derive(Debug)]\npub struct SysRegex {\n    regex: Regex,\n}\n\nimpl SysRegex {\n    pub fn find_iter<'r, 't>(&'r self, inside: &'t str) -> Matches<'r, 't> {\n        Matches(self.regex.find_iter(inside))\n    }\n\n    pub fn new(regex_str: &str) -> Result<Self, Box<dyn Error + Send + Sync + 'static>> {\n        Ok(Self {\n            regex: Regex::new(regex_str)?,\n        })\n    }\n}\n\npub struct Matches<'r, 't>(fancy_regex::Matches<'r, 't>);\n\nimpl Iterator for Matches<'_, '_> {\n    type Item = (usize, usize);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        match self.0.next() {\n            Some(Ok(mat)) => Some((mat.start(), mat.end())),\n            // stop if an error is encountered\n            None | Some(Err(_)) => None,\n        }\n    }\n}\n\nimpl Pattern for &Regex {\n    fn find_matches(\n        &self,\n        inside: &str,\n    ) -> Result<Vec<(Offsets, bool)>, Box<dyn Error + Send + Sync + 'static>> {\n        if inside.is_empty() {\n            return Ok(vec![((0, 0), false)]);\n        }\n\n        let mut prev = 0;\n        let mut splits = Vec::with_capacity(inside.len());\n        for match_ in self.find_iter(inside) {\n            let match_ = match_?;\n            let start = match_.start();\n            let end = match_.end();\n            if prev != start {\n                splits.push(((prev, start), false));\n            }\n            splits.push(((start, end), true));\n            prev = end;\n        }\n        if prev != inside.len() {\n            splits.push(((prev, inside.len()), false))\n        }\n        Ok(splits)\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/from_pretrained.rs",
    "content": "use crate::Result;\nuse hf_hub::{api::sync::ApiBuilder, Repo, RepoType};\nuse std::collections::HashMap;\nuse std::path::PathBuf;\n\n/// Defines the additional parameters available for the `from_pretrained` function\n#[derive(Debug, Clone)]\npub struct FromPretrainedParameters {\n    pub revision: String,\n    pub user_agent: HashMap<String, String>,\n    pub token: Option<String>,\n}\n\nimpl Default for FromPretrainedParameters {\n    fn default() -> Self {\n        Self {\n            revision: \"main\".into(),\n            user_agent: HashMap::new(),\n            token: None,\n        }\n    }\n}\n\n/// Downloads and cache the identified tokenizer if it exists on\n/// the Hugging Face Hub, and returns a local path to the file\npub fn from_pretrained<S: AsRef<str>>(\n    identifier: S,\n    params: Option<FromPretrainedParameters>,\n) -> Result<PathBuf> {\n    let identifier: String = identifier.as_ref().to_string();\n\n    let valid_chars = ['-', '_', '.', '/'];\n    let is_valid_char = |x: char| x.is_alphanumeric() || valid_chars.contains(&x);\n\n    let valid = identifier.chars().all(is_valid_char);\n    let valid_chars_stringified = valid_chars\n        .iter()\n        .fold(vec![], |mut buf, x| {\n            buf.push(format!(\"'{x}'\"));\n            buf\n        })\n        .join(\", \"); // \"'/', '-', '_', '.'\"\n    if !valid {\n        return Err(format!(\n            \"Model \\\"{identifier}\\\" contains invalid characters, expected only alphanumeric or {valid_chars_stringified}\"\n        )\n        .into());\n    }\n    let params = params.unwrap_or_default();\n\n    let revision = &params.revision;\n    let valid_revision = revision.chars().all(is_valid_char);\n    if !valid_revision {\n        return Err(format!(\n            \"Revision \\\"{revision}\\\" contains invalid characters, expected only alphanumeric or {valid_chars_stringified}\"\n        )\n        .into());\n    }\n\n    let mut builder = ApiBuilder::from_env();\n    if let Some(token) = params.token {\n        builder = builder.with_token(Some(token));\n    }\n    let api = builder.build()?;\n    let repo = Repo::with_revision(identifier, RepoType::Model, params.revision);\n    let api = api.repo(repo);\n    Ok(api.get(\"tokenizer.json\")?)\n}\n"
  },
  {
    "path": "tokenizers/src/utils/iter.rs",
    "content": "//! This comes from the Rust libcore and is duplicated here because it is not exported\n//! (cf <https://github.com/rust-lang/rust/blob/25091ed9b7739e12466fb2490baa1e8a2815121c/src/libcore/iter/adapters/mod.rs#L2664>)\n//! We are now using the version from <https://stackoverflow.com/questions/44544323/how-to-unzip-a-sequence-of-resulta-b-e-to-a-veca-vecb-and-stop-on-f>\n//! because the one from the libcore seems to cause overflowing stacks in some cases\n//! It also contains a lines_with_ending that copies std::io::BufRead but keeps line endings.\nuse std::io::BufRead;\n\npub struct ResultShunt<I, E> {\n    iter: I,\n    error: Option<E>,\n}\n\nimpl<I, T, E> ResultShunt<I, E>\nwhere\n    I: Iterator<Item = Result<T, E>>,\n{\n    /// Process the given iterator as if it yielded a `T` instead of a\n    /// `Result<T, _>`. Any errors will stop the inner iterator and\n    /// the overall result will be an error.\n    pub fn process<F, U>(iter: I, mut f: F) -> Result<U, E>\n    where\n        F: FnMut(&mut Self) -> U,\n    {\n        let mut shunt = ResultShunt::new(iter);\n        let value = f(shunt.by_ref());\n        shunt.reconstruct(value)\n    }\n\n    fn new(iter: I) -> Self {\n        ResultShunt { iter, error: None }\n    }\n\n    /// Consume the adapter and rebuild a `Result` value. This should\n    /// *always* be called, otherwise any potential error would be\n    /// lost.\n    fn reconstruct<U>(self, val: U) -> Result<U, E> {\n        match self.error {\n            None => Ok(val),\n            Some(e) => Err(e),\n        }\n    }\n}\n\nimpl<I, T, E> Iterator for ResultShunt<I, E>\nwhere\n    I: Iterator<Item = Result<T, E>>,\n{\n    type Item = T;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        match self.iter.next() {\n            Some(Ok(v)) => Some(v),\n            Some(Err(e)) => {\n                self.error = Some(e);\n                None\n            }\n            None => None,\n        }\n    }\n}\n\n/// Copied from std::io::BufRead but keep newline characters.\n#[derive(Debug)]\npub struct Lines<B> {\n    buf: B,\n}\n\npub trait LinesWithEnding<B> {\n    fn lines_with_ending(self) -> Lines<B>;\n}\n\nimpl<B> LinesWithEnding<B> for B\nwhere\n    B: BufRead,\n{\n    fn lines_with_ending(self) -> Lines<B> {\n        Lines::<B> { buf: self }\n    }\n}\nimpl<B: BufRead> Iterator for Lines<B> {\n    type Item = std::io::Result<String>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let mut buf = String::new();\n        match self.buf.read_line(&mut buf) {\n            Ok(0) => None,\n            Ok(_n) => {\n                // if buf.ends_with('\\n') {\n                //     buf.pop();\n                //     if buf.ends_with('\\r') {\n                //         buf.pop();\n                //     }\n                // }\n                Some(Ok(buf))\n            }\n            Err(e) => Some(Err(e)),\n        }\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/mod.rs",
    "content": "pub(crate) mod cache;\n#[cfg(feature = \"http\")]\npub(crate) mod from_pretrained;\n\n#[cfg(all(feature = \"fancy-regex\", not(feature = \"onig\")))]\nmod fancy;\n#[cfg(all(feature = \"fancy-regex\", not(feature = \"onig\")))]\npub use fancy::SysRegex;\n#[cfg(feature = \"onig\")]\nmod onig;\n#[cfg(feature = \"onig\")]\npub use crate::utils::onig::SysRegex;\n\n#[cfg(not(any(feature = \"onig\", feature = \"fancy-regex\")))]\ncompile_error!(\"One of the `onig`, or `fancy-regex` features must be enabled\");\n\npub mod iter;\npub mod padding;\npub mod parallelism;\npub(crate) mod progress;\npub mod truncation;\n\nuse ahash::AHashMap;\nuse serde::{Serialize, Serializer};\nuse std::collections::BTreeMap;\n\npub(crate) fn ordered_map<S, K, V>(\n    value: &AHashMap<K, V>,\n    serializer: S,\n) -> std::result::Result<S::Ok, S::Error>\nwhere\n    S: Serializer,\n    K: Serialize + std::cmp::Ord,\n    V: Serialize,\n{\n    let ordered: BTreeMap<_, _> = value.iter().collect();\n    ordered.serialize(serializer)\n}\n\nmacro_rules! impl_enum_from (\n    ($from_ty:ty, $enum:ty, $variant:ident) => {\n        impl From<$from_ty> for $enum {\n            fn from(from: $from_ty) -> Self {\n                <$enum>::$variant(from)\n            }\n        }\n    }\n);\n\n/// Implement `serde::{Serialize, Serializer}` with `#[serde(tag = \"type\")]` attribute for a given struct.\n/// Panic when a json string being deserilized misses field `type`.\n///\n/// # Examples\n///\n/// ```\n/// # #[macro_use] extern crate tokenizers;\n/// use serde::{Serialize, Deserialize};\n///\n/// fn main() {\n///    impl_serde_type!{\n///        #[derive(Debug)]\n///        struct Point {\n///            x: i32,\n///            #[serde(default = \"default_y\")]\n///            y: i32,\n///        }\n///    }\n///    fn default_y() -> i32 {\n///        5\n///    }\n///\n///    let point = Point { x: 1, y: 2 };\n///    let serialized_s = r#\"{\"type\":\"Point\",\"x\":1,\"y\":2}\"#;\n///    assert_eq!(serde_json::to_string(&point).unwrap(), serialized_s);\n/// }\n/// ```\n///\n/// ```should_panic\n/// # #[macro_use] extern crate tokenizers;\n/// use serde::{Serialize, Deserialize};\n///\n/// fn main() {\n///    impl_serde_type!{\n///        #[derive(Debug)]\n///        struct Point1D {\n///            x: i32,\n///        }\n///    }\n///\n///    let serialized_s = r#\"{\"x\":1}\"#;\n///    let deserialized: Point1D = serde_json::from_str(serialized_s).unwrap();\n/// }\n/// ```\n///\n/// # Examples (unit structs)\n///\n/// ```\n/// # #[macro_use] extern crate tokenizers;\n/// use serde::{Serialize, Deserialize};\n///\n/// fn main() {\n///    impl_serde_type!{\n///        struct Unit;\n///    }\n///\n///    let unit = Unit;\n///    let serialized_s = r#\"{\"type\":\"Unit\"}\"#;\n///    assert_eq!(serde_json::to_string(&unit).unwrap(), serialized_s);\n/// }\n/// ```\n///\n/// ```should_panic\n/// # #[macro_use] extern crate tokenizers;\n/// use serde::{Serialize, Deserialize};\n///\n/// fn main() {\n///    impl_serde_type!{\n///        struct Unit;\n///    }\n///\n///    let serialized_s = r#\"{\"some_field\":1}\"#;\n///    let deserialized: Unit = serde_json::from_str(serialized_s).unwrap();\n/// }\n/// ```\n#[macro_export]\nmacro_rules! impl_serde_type{\n    (\n     $(#[$meta:meta])*\n     $vis:vis struct $struct_name:ident {\n        $(\n        $(#[$field_meta:meta])*\n        $field_vis:vis $field_name:ident : $field_type:ty\n        ),*$(,)+\n    }\n    ) => {\n        paste::paste!{\n            $(#[$meta])*\n            #[derive(Serialize, Deserialize)]\n            #[serde(tag = \"type\", from = $struct_name \"Deserializer\")]\n            $vis struct $struct_name{\n                $(\n                    $(#[$field_meta])*\n                    $field_vis $field_name : $field_type,\n                )*\n            }\n\n            #[doc(hidden)]\n            $(#[$meta])*\n            #[derive(Deserialize)]\n            #[serde(tag = \"type\", remote = $struct_name \"\")]\n            struct [<$struct_name Def>]{\n                $(\n                    $(#[$field_meta])*\n                    $field_vis $field_name : $field_type,\n                )*\n            }\n\n            #[doc(hidden)]\n            #[derive(Deserialize)]\n            enum [<$struct_name Type>] {\n                $struct_name,\n            }\n\n            #[doc(hidden)]\n            #[derive(Deserialize)]\n            struct [<$struct_name Deserializer>] {\n                #[allow(dead_code)]\n                r#type: [<$struct_name Type>],\n                #[serde(flatten, with = $struct_name \"Def\")]\n                r#struct: $struct_name,\n            }\n\n            #[doc(hidden)]\n            impl std::convert::From<[<$struct_name Deserializer>]> for $struct_name {\n                fn from(v: [<$struct_name Deserializer>]) -> Self {\n                    v.r#struct\n                }\n            }\n        }\n    };\n    (\n     $(#[$meta:meta])*\n     $vis:vis struct $struct_name:ident;\n    ) => {\n        paste::paste!{\n            $(#[$meta])*\n            $vis struct $struct_name;\n\n            impl serde::Serialize for $struct_name {\n                fn serialize<S>(&self, serializer: S)  -> std::result::Result<S::Ok, S::Error> where\n                    S: serde::ser::Serializer {\n                    let helper = [<$struct_name Helper>]{r#type: [<$struct_name Type>]::$struct_name};\n                    helper.serialize(serializer)\n                }\n            }\n\n            impl<'de> serde::Deserialize<'de> for $struct_name {\n                fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>\n                where\n                    D: serde::Deserializer<'de>,\n                {\n                    let _helper = [<$struct_name Helper>]::deserialize(deserializer)?;\n                    Ok($struct_name)\n                }\n            }\n\n            #[derive(serde::Serialize, serde::Deserialize)]\n            enum [<$struct_name Type>] {\n                $struct_name,\n            }\n\n            #[derive(serde::Serialize, serde::Deserialize)]\n            struct [<$struct_name Helper>] {\n                #[allow(dead_code)]\n                r#type: [<$struct_name Type>],\n            }\n        }\n    }\n}\n\n// Re-export macro_rules_attribute\npub use macro_rules_attribute::macro_rules_attribute;\n"
  },
  {
    "path": "tokenizers/src/utils/onig.rs",
    "content": "use crate::tokenizer::pattern::Pattern;\nuse crate::{Offsets, Result};\nuse onig::Regex;\nuse std::error::Error;\n\n#[derive(Debug)]\npub struct SysRegex {\n    regex: Regex,\n}\n\nimpl SysRegex {\n    pub fn find_iter<'r, 't>(&'r self, inside: &'t str) -> onig::FindMatches<'r, 't> {\n        self.regex.find_iter(inside)\n    }\n\n    pub fn new(\n        regex_str: &str,\n    ) -> std::result::Result<Self, Box<dyn Error + Send + Sync + 'static>> {\n        Ok(Self {\n            regex: Regex::new(regex_str)?,\n        })\n    }\n}\n\nimpl Pattern for &Regex {\n    fn find_matches(&self, inside: &str) -> Result<Vec<(Offsets, bool)>> {\n        if inside.is_empty() {\n            return Ok(vec![((0, 0), false)]);\n        }\n\n        let mut prev = 0;\n        let mut splits = Vec::with_capacity(inside.len());\n        for (start, end) in self.find_iter(inside) {\n            if prev != start {\n                splits.push(((prev, start), false));\n            }\n            splits.push(((start, end), true));\n            prev = end;\n        }\n        if prev != inside.len() {\n            splits.push(((prev, inside.len()), false))\n        }\n        Ok(splits)\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/padding.rs",
    "content": "use crate::parallelism::*;\nuse crate::tokenizer::{Encoding, Result};\nuse serde::{Deserialize, Serialize};\n\n/// The various possible padding directions.\n#[derive(Debug, Clone, Copy, Serialize, Deserialize)]\npub enum PaddingDirection {\n    Left,\n    Right,\n}\n\nimpl std::convert::AsRef<str> for PaddingDirection {\n    fn as_ref(&self) -> &str {\n        match self {\n            PaddingDirection::Left => \"left\",\n            PaddingDirection::Right => \"right\",\n        }\n    }\n}\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct PaddingParams {\n    pub strategy: PaddingStrategy,\n    pub direction: PaddingDirection,\n    pub pad_to_multiple_of: Option<usize>,\n    pub pad_id: u32,\n    pub pad_type_id: u32,\n    pub pad_token: String,\n}\n\nimpl Default for PaddingParams {\n    fn default() -> Self {\n        Self {\n            strategy: PaddingStrategy::BatchLongest,\n            direction: PaddingDirection::Right,\n            pad_to_multiple_of: None,\n            pad_id: 0,\n            pad_type_id: 0,\n            pad_token: String::from(\"[PAD]\"),\n        }\n    }\n}\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub enum PaddingStrategy {\n    BatchLongest,\n    Fixed(usize),\n}\n\npub fn pad_encodings(encodings: &mut [Encoding], params: &PaddingParams) -> Result<()> {\n    if encodings.is_empty() {\n        return Ok(());\n    }\n\n    let mut pad_length = match params.strategy {\n        PaddingStrategy::Fixed(size) => size,\n        PaddingStrategy::BatchLongest => encodings\n            .maybe_par_iter()\n            .map(|e| e.get_ids().len())\n            .max()\n            .unwrap(),\n    };\n\n    if let Some(multiple) = params.pad_to_multiple_of {\n        if multiple > 0 && pad_length % multiple > 0 {\n            pad_length += multiple - pad_length % multiple;\n        }\n    }\n\n    encodings.maybe_par_iter_mut().for_each(|encoding| {\n        encoding.pad(\n            pad_length,\n            params.pad_id,\n            params.pad_type_id,\n            &params.pad_token,\n            params.direction,\n        )\n    });\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::tokenizer::Encoding;\n    use ahash::AHashMap;\n\n    #[test]\n    fn pad_to_multiple() {\n        fn get_encodings() -> [Encoding; 2] {\n            [\n                Encoding::new(\n                    vec![0, 1, 2, 3, 4],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    AHashMap::new(),\n                ),\n                Encoding::new(\n                    vec![0, 1, 2],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    vec![],\n                    AHashMap::new(),\n                ),\n            ]\n        }\n\n        // Test fixed\n        let mut encodings = get_encodings();\n        let mut params = PaddingParams {\n            strategy: PaddingStrategy::Fixed(7),\n            direction: PaddingDirection::Right,\n            pad_to_multiple_of: Some(8),\n            pad_id: 0,\n            pad_type_id: 0,\n            pad_token: String::from(\"[PAD]\"),\n        };\n        pad_encodings(&mut encodings, &params).unwrap();\n        assert!(encodings.iter().all(|e| e.get_ids().len() == 8));\n\n        // Test batch\n        let mut encodings = get_encodings();\n        params.strategy = PaddingStrategy::BatchLongest;\n        params.pad_to_multiple_of = Some(6);\n        pad_encodings(&mut encodings, &params).unwrap();\n        assert!(encodings.iter().all(|e| e.get_ids().len() == 6));\n\n        // Do not crash with 0\n        params.pad_to_multiple_of = Some(0);\n        pad_encodings(&mut encodings, &params).unwrap();\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/parallelism.rs",
    "content": "//!\n//! This module defines helpers to allow optional Rayon usage.\n//!\n\nuse rayon::iter::IterBridge;\nuse rayon::prelude::*;\nuse rayon_cond::CondIterator;\nuse std::sync::atomic::AtomicBool;\nuse std::sync::atomic::AtomicU8;\nuse std::sync::atomic::Ordering;\n\n// Re-export rayon current_num_threads\npub use rayon::current_num_threads;\n\npub const ENV_VARIABLE: &str = \"TOKENIZERS_PARALLELISM\";\n\nstatic USED_PARALLELISM: AtomicBool = AtomicBool::new(false);\nstatic PARALLELISM: AtomicU8 = AtomicU8::new(0);\n\n/// Check if the TOKENIZERS_PARALLELISM env variable has been explicitly set\npub fn is_parallelism_configured() -> bool {\n    std::env::var(ENV_VARIABLE).is_ok() || get_override_parallelism().is_some()\n}\n\n/// Check if at some point we used a parallel iterator\npub fn has_parallelism_been_used() -> bool {\n    USED_PARALLELISM.load(Ordering::SeqCst)\n}\n\n/// Get internally set parallelism\nfn get_override_parallelism() -> Option<bool> {\n    match PARALLELISM.load(Ordering::SeqCst) {\n        0 => None,\n        1 => Some(false),\n        2 => Some(true),\n        _ => unreachable!(),\n    }\n}\n\n/// Get the currently set value for `TOKENIZERS_PARALLELISM` env variable\nfn get_env_parallelism() -> bool {\n    match std::env::var(ENV_VARIABLE) {\n        Ok(mut v) => {\n            v.make_ascii_lowercase();\n            !matches!(v.as_ref(), \"\" | \"off\" | \"false\" | \"f\" | \"no\" | \"n\" | \"0\")\n        }\n        Err(_) => true, // If we couldn't get the variable, we use the default\n    }\n}\n\npub fn get_parallelism() -> bool {\n    if let Some(parallel) = get_override_parallelism() {\n        parallel\n    } else {\n        get_env_parallelism()\n    }\n}\n\n/// Set the value for `TOKENIZERS_PARALLELISM` for the current process\npub fn set_parallelism(val: bool) {\n    PARALLELISM.store(if val { 2 } else { 1 }, Ordering::SeqCst);\n}\n\n/// Allows to convert into an iterator that can be executed either parallelly or serially.\n///\n/// The choice is made according to the currently set `TOKENIZERS_PARALLELISM` environment variable.\n/// This variable can have one of the following values\n///   - False => \"\" (empty value), \"false\", \"f\", \"off\", \"no\", \"n\", \"0\"\n///   - True => Any other value\n///\npub trait MaybeParallelIterator<P, S>\nwhere\n    P: ParallelIterator,\n    S: Iterator<Item = P::Item>,\n{\n    /// Convert ourself in a CondIterator, that will be executed either in parallel or serially,\n    /// based solely on the `TOKENIZERS_PARALLELISM` environment variable\n    fn into_maybe_par_iter(self) -> CondIterator<P, S>;\n    /// Convert ourself in a CondIterator, that will be executed either in parallel or serially,\n    /// based on both the `TOKENIZERS_PARALLELISM` environment variable and the provided bool.\n    /// Both must be true to run with parallelism activated.\n    fn into_maybe_par_iter_cond(self, cond: bool) -> CondIterator<P, S>;\n}\n\nimpl<P, S, I> MaybeParallelIterator<P, S> for I\nwhere\n    I: IntoParallelIterator<Iter = P, Item = P::Item> + IntoIterator<IntoIter = S, Item = S::Item>,\n    P: ParallelIterator,\n    S: Iterator<Item = P::Item>,\n{\n    fn into_maybe_par_iter(self) -> CondIterator<P, S> {\n        let parallelism = get_parallelism();\n        if parallelism {\n            USED_PARALLELISM.store(true, Ordering::SeqCst);\n        }\n        CondIterator::new(self, parallelism)\n    }\n\n    fn into_maybe_par_iter_cond(self, cond: bool) -> CondIterator<P, S> {\n        if cond {\n            self.into_maybe_par_iter()\n        } else {\n            CondIterator::from_serial(self)\n        }\n    }\n}\n\n/// Shared reference version of MaybeParallelIterator, works the same but returns an iterator\n/// over references, does not consume self\npub trait MaybeParallelRefIterator<'data, P, S>\nwhere\n    P: ParallelIterator,\n    S: Iterator<Item = P::Item>,\n    P::Item: 'data,\n{\n    fn maybe_par_iter(&'data self) -> CondIterator<P, S>;\n    fn maybe_par_iter_cond(&'data self, cond: bool) -> CondIterator<P, S>;\n}\n\nimpl<'data, P, S, I: 'data + ?Sized> MaybeParallelRefIterator<'data, P, S> for I\nwhere\n    &'data I: MaybeParallelIterator<P, S>,\n    P: ParallelIterator,\n    S: Iterator<Item = P::Item>,\n    P::Item: 'data,\n{\n    fn maybe_par_iter(&'data self) -> CondIterator<P, S> {\n        self.into_maybe_par_iter()\n    }\n\n    fn maybe_par_iter_cond(&'data self, cond: bool) -> CondIterator<P, S> {\n        self.into_maybe_par_iter_cond(cond)\n    }\n}\n\n/// Exclusive reference version of MaybeParallelIterator, works the same but returns an iterator\n/// over mutable references, does not consume self\npub trait MaybeParallelRefMutIterator<'data, P, S>\nwhere\n    P: ParallelIterator,\n    S: Iterator<Item = P::Item>,\n    P::Item: 'data,\n{\n    fn maybe_par_iter_mut(&'data mut self) -> CondIterator<P, S>;\n    fn maybe_par_iter_mut_cond(&'data mut self, cond: bool) -> CondIterator<P, S>;\n}\n\nimpl<'data, P, S, I: 'data + ?Sized> MaybeParallelRefMutIterator<'data, P, S> for I\nwhere\n    &'data mut I: MaybeParallelIterator<P, S>,\n    P: ParallelIterator,\n    S: Iterator<Item = P::Item>,\n    P::Item: 'data,\n{\n    fn maybe_par_iter_mut(&'data mut self) -> CondIterator<P, S> {\n        self.into_maybe_par_iter()\n    }\n\n    fn maybe_par_iter_mut_cond(&'data mut self, cond: bool) -> CondIterator<P, S> {\n        self.into_maybe_par_iter_cond(cond)\n    }\n}\n\n/// Converts any serial iterator into a CondIterator, that can either run parallelly or serially.\npub trait MaybeParallelBridge<T, S>\nwhere\n    S: Iterator<Item = T> + Send,\n    T: Send,\n{\n    fn maybe_par_bridge(self) -> CondIterator<IterBridge<S>, S>;\n    fn maybe_par_bridge_cond(self, cond: bool) -> CondIterator<IterBridge<S>, S>;\n}\n\nimpl<T, S> MaybeParallelBridge<T, S> for S\nwhere\n    S: Iterator<Item = T> + Send,\n    T: Send,\n{\n    fn maybe_par_bridge(self) -> CondIterator<IterBridge<S>, S> {\n        let iter = CondIterator::from_serial(self);\n\n        if get_parallelism() {\n            USED_PARALLELISM.store(true, Ordering::SeqCst);\n            CondIterator::from_parallel(iter.into_parallel().right().unwrap())\n        } else {\n            iter\n        }\n    }\n\n    fn maybe_par_bridge_cond(self, cond: bool) -> CondIterator<IterBridge<S>, S> {\n        if cond {\n            self.maybe_par_bridge()\n        } else {\n            CondIterator::from_serial(self)\n        }\n    }\n}\n\n/// Allows to convert into `chunks` that can be executed either parallelly or serially.\npub trait MaybeParallelSlice<'data, T>\nwhere\n    T: Sync,\n{\n    /// Create a CondIterator, that will be executed either in parallel or serially,\n    /// based solely on the `TOKENIZERS_PARALLELISM` environment variable\n    fn maybe_par_chunks(\n        &'_ self,\n        chunk_size: usize,\n    ) -> CondIterator<rayon::slice::Chunks<'_, T>, std::slice::Chunks<'_, T>>;\n    /// Create a CondIterator, that will be executed either in parallel or serially,\n    /// based on both the `TOKENIZERS_PARALLELISM` environment variable and the provided bool.\n    /// Both must be true to run with parallelism activated.\n    fn maybe_par_chunks_cond(\n        &'_ self,\n        cond: bool,\n        chunk_size: usize,\n    ) -> CondIterator<rayon::slice::Chunks<'_, T>, std::slice::Chunks<'_, T>>;\n}\n\nimpl<T> MaybeParallelSlice<'_, T> for [T]\nwhere\n    T: Sync,\n{\n    fn maybe_par_chunks(\n        &'_ self,\n        chunk_size: usize,\n    ) -> CondIterator<rayon::slice::Chunks<'_, T>, std::slice::Chunks<'_, T>> {\n        let parallelism = get_parallelism();\n        if parallelism {\n            CondIterator::from_parallel(self.par_chunks(chunk_size))\n        } else {\n            CondIterator::from_serial(self.chunks(chunk_size))\n        }\n    }\n    fn maybe_par_chunks_cond(\n        &'_ self,\n        cond: bool,\n        chunk_size: usize,\n    ) -> CondIterator<rayon::slice::Chunks<'_, T>, std::slice::Chunks<'_, T>> {\n        if cond {\n            self.maybe_par_chunks(chunk_size)\n        } else {\n            CondIterator::from_serial(self.chunks(chunk_size))\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_maybe_parallel_iterator() {\n        let mut v = vec![1u32, 2, 3, 4, 5, 6];\n\n        assert_eq!(v.maybe_par_iter().sum::<u32>(), 21);\n        assert_eq!(\n            v.maybe_par_iter_mut()\n                .map(|v| {\n                    *v *= 2;\n                    *v\n                })\n                .sum::<u32>(),\n            42\n        );\n        assert_eq!(v.maybe_par_iter().sum::<u32>(), 42);\n        assert_eq!(v.into_maybe_par_iter().sum::<u32>(), 42);\n    }\n\n    #[test]\n    fn test_maybe_parallel_slice() {\n        let v = [1, 2, 3, 4, 5];\n\n        let chunks: Vec<_> = v.maybe_par_chunks(2).collect();\n        assert_eq!(chunks, vec![&[1, 2][..], &[3, 4], &[5]]);\n    }\n}\n"
  },
  {
    "path": "tokenizers/src/utils/progress.rs",
    "content": "#[cfg(feature = \"progressbar\")]\npub(crate) use indicatif::{ProgressBar, ProgressStyle};\n\n#[cfg(not(feature = \"progressbar\"))]\nmod progressbar {\n    use std::borrow::Cow;\n    pub struct ProgressBar;\n    impl ProgressBar {\n        pub fn new(_length: u64) -> Self {\n            Self {}\n        }\n\n        pub fn set_length(&self, _length: u64) {}\n        pub fn set_message(&self, _message: impl Into<Cow<'static, str>>) {}\n        pub fn finish(&self) {}\n        pub fn reset(&self) {}\n        pub fn inc(&self, _inc: u64) {}\n        pub fn set_style(&self, _style: ProgressStyle) {}\n    }\n\n    pub struct ProgressStyle {}\n    impl ProgressStyle {\n        pub fn default_bar() -> Self {\n            Self {}\n        }\n        pub fn template(self, _template: &str) -> Result<Self, String> {\n            Ok(self)\n        }\n    }\n}\n#[cfg(not(feature = \"progressbar\"))]\npub(crate) use progressbar::{ProgressBar, ProgressStyle};\n"
  },
  {
    "path": "tokenizers/src/utils/truncation.rs",
    "content": "use crate::tokenizer::{Encoding, Result};\nuse serde::{Deserialize, Serialize};\nuse std::cmp;\nuse std::mem;\n\n#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Eq, Default)]\npub enum TruncationDirection {\n    Left,\n    #[default]\n    Right,\n}\n\nimpl std::convert::AsRef<str> for TruncationDirection {\n    fn as_ref(&self) -> &str {\n        match self {\n            TruncationDirection::Left => \"left\",\n            TruncationDirection::Right => \"right\",\n        }\n    }\n}\n\n#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct TruncationParams {\n    #[serde(default)]\n    pub direction: TruncationDirection,\n    pub max_length: usize,\n    pub strategy: TruncationStrategy,\n    pub stride: usize,\n}\n\nimpl Default for TruncationParams {\n    fn default() -> Self {\n        Self {\n            max_length: 512,\n            strategy: TruncationStrategy::default(),\n            stride: 0,\n            direction: TruncationDirection::default(),\n        }\n    }\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum TruncationError {\n    /// We are supposed to truncate the pair sequence, but it has not been provided.\n    #[error(\"Truncation error: Second sequence not provided\")]\n    SecondSequenceNotProvided,\n    /// We cannot truncate the target sequence enough to respect the provided max length.\n    #[error(\"Truncation error: Sequence to truncate too short to respect the provided max_length\")]\n    SequenceTooShort,\n}\n\n#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Eq, Default)]\npub enum TruncationStrategy {\n    #[default]\n    LongestFirst,\n    OnlyFirst,\n    OnlySecond,\n}\n\nimpl std::convert::AsRef<str> for TruncationStrategy {\n    fn as_ref(&self) -> &str {\n        match self {\n            Self::LongestFirst => \"longest_first\",\n            Self::OnlyFirst => \"only_first\",\n            Self::OnlySecond => \"only_second\",\n        }\n    }\n}\n\npub fn truncate_encodings(\n    mut encoding: Encoding,\n    mut pair_encoding: Option<Encoding>,\n    params: &TruncationParams,\n) -> Result<(Encoding, Option<Encoding>)> {\n    if params.max_length == 0 {\n        encoding.truncate(0, params.stride, params.direction);\n        if let Some(other_encoding) = pair_encoding.as_mut() {\n            other_encoding.truncate(0, params.stride, params.direction);\n        }\n        return Ok((encoding, pair_encoding));\n    }\n\n    let total_length = encoding.get_ids().len()\n        + pair_encoding\n            .as_ref()\n            .map(|e| e.get_ids().len())\n            .unwrap_or(0);\n    let to_remove = if total_length > params.max_length {\n        total_length - params.max_length\n    } else {\n        return Ok((encoding, pair_encoding));\n    };\n\n    match params.strategy {\n        TruncationStrategy::LongestFirst => {\n            if let Some(other_encoding) = pair_encoding.as_mut() {\n                // Assuming n1 <= n2, there are 3 cases\n                // Case 1:\n                //   No truncation needs to be performed.\n                //   This scenario is handled before the match.\n                // Case 2:\n                //   Only the longer input needs to be truncated.\n                //   n1 = n1\n                //   n2 = max_length - n1\n                // Case 3:\n                //   Both inputs must be truncated.\n                //   n1 = max_length / 2\n                //   n2 = n1 + max_length % 2\n\n                let mut n1 = encoding.get_ids().len();\n                let mut n2 = other_encoding.get_ids().len();\n                let mut swap = false;\n\n                // Ensure n1 is the length of the shortest input\n                if n1 > n2 {\n                    swap = true;\n                    mem::swap(&mut n1, &mut n2);\n                }\n\n                if n1 > params.max_length {\n                    // This needs to be a special case\n                    // to avoid max_length - n1 < 0\n                    // since n1 and n2 are unsigned\n                    n2 = n1;\n                } else {\n                    n2 = cmp::max(n1, params.max_length - n1);\n                }\n\n                if n1 + n2 > params.max_length {\n                    n1 = params.max_length / 2;\n                    n2 = n1 + params.max_length % 2;\n                }\n\n                // Swap lengths if we swapped previously\n                if swap {\n                    mem::swap(&mut n1, &mut n2);\n                }\n                encoding.truncate(n1, params.stride, params.direction);\n                other_encoding.truncate(n2, params.stride, params.direction);\n            } else {\n                encoding.truncate(total_length - to_remove, params.stride, params.direction);\n            }\n        }\n        TruncationStrategy::OnlyFirst | TruncationStrategy::OnlySecond => {\n            let target = if params.strategy == TruncationStrategy::OnlyFirst {\n                Ok(&mut encoding)\n            } else if let Some(encoding) = pair_encoding.as_mut() {\n                Ok(encoding)\n            } else {\n                Err(Box::new(TruncationError::SecondSequenceNotProvided))\n            }?;\n\n            let target_len = target.get_ids().len();\n            if target_len > to_remove {\n                target.truncate(target_len - to_remove, params.stride, params.direction);\n            } else {\n                return Err(Box::new(TruncationError::SequenceTooShort));\n            }\n        }\n    }\n    Ok((encoding, pair_encoding))\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::tokenizer::Encoding;\n    use ahash::AHashMap;\n\n    fn get_empty() -> Encoding {\n        Encoding::new(\n            vec![],\n            vec![],\n            vec![],\n            vec![],\n            vec![],\n            vec![],\n            vec![],\n            vec![],\n            AHashMap::new(),\n        )\n    }\n\n    fn get_short() -> Encoding {\n        Encoding::new(\n            vec![1, 2],\n            vec![0, 0],\n            vec![String::from(\"a\"), String::from(\"b\")],\n            vec![Some(0), Some(1)],\n            vec![(0, 1), (1, 2)],\n            vec![0, 0],\n            vec![1, 1],\n            vec![],\n            AHashMap::new(),\n        )\n    }\n\n    fn get_medium() -> Encoding {\n        Encoding::new(\n            vec![3, 4, 5, 6],\n            vec![0, 0, 0, 0],\n            vec![\n                String::from(\"d\"),\n                String::from(\"e\"),\n                String::from(\"f\"),\n                String::from(\"g\"),\n            ],\n            vec![Some(0), Some(1), Some(2), Some(3)],\n            vec![(0, 1), (1, 2), (2, 3), (3, 4)],\n            vec![0, 0, 0, 0],\n            vec![1, 1, 1, 1],\n            vec![],\n            AHashMap::new(),\n        )\n    }\n\n    fn get_long() -> Encoding {\n        Encoding::new(\n            vec![7, 8, 9, 10, 11, 12, 13, 14],\n            vec![0, 0, 0, 0, 0, 0, 0, 0],\n            vec![\n                String::from(\"h\"),\n                String::from(\"i\"),\n                String::from(\"j\"),\n                String::from(\"k\"),\n                String::from(\"l\"),\n                String::from(\"m\"),\n                String::from(\"n\"),\n                String::from(\"o\"),\n            ],\n            vec![\n                Some(0),\n                Some(1),\n                Some(2),\n                Some(3),\n                Some(4),\n                Some(5),\n                Some(6),\n                Some(7),\n            ],\n            vec![\n                (0, 1),\n                (1, 2),\n                (2, 3),\n                (3, 4),\n                (4, 5),\n                (5, 6),\n                (6, 7),\n                (6, 8),\n            ],\n            vec![0, 0, 0, 0, 0, 0, 0, 0],\n            vec![1, 1, 1, 1, 1, 1, 1, 1],\n            vec![],\n            AHashMap::new(),\n        )\n    }\n\n    fn truncate_and_assert(\n        encoding1: Encoding,\n        encoding2: Encoding,\n        params: &TruncationParams,\n        n1: usize,\n        n2: usize,\n    ) {\n        match truncate_encodings(encoding1, Some(encoding2), params) {\n            Ok((e1, Some(e2))) => {\n                assert!(e1.get_ids().len() == n1);\n                assert!(e2.get_ids().len() == n2);\n            }\n            _ => panic!(),\n        };\n    }\n\n    #[test]\n    fn truncate_encodings_longest_first() {\n        let params = TruncationParams {\n            max_length: 7,\n            strategy: TruncationStrategy::LongestFirst,\n            stride: 0,\n            direction: TruncationDirection::Right,\n        };\n\n        truncate_and_assert(get_empty(), get_empty(), &params, 0, 0);\n        truncate_and_assert(get_empty(), get_short(), &params, 0, 2);\n        truncate_and_assert(get_empty(), get_medium(), &params, 0, 4);\n        truncate_and_assert(get_empty(), get_long(), &params, 0, 7);\n\n        truncate_and_assert(get_short(), get_empty(), &params, 2, 0);\n        truncate_and_assert(get_short(), get_short(), &params, 2, 2);\n        truncate_and_assert(get_short(), get_medium(), &params, 2, 4);\n        truncate_and_assert(get_short(), get_long(), &params, 2, 5);\n\n        truncate_and_assert(get_medium(), get_empty(), &params, 4, 0);\n        truncate_and_assert(get_medium(), get_short(), &params, 4, 2);\n        truncate_and_assert(get_medium(), get_medium(), &params, 3, 4);\n        truncate_and_assert(get_medium(), get_long(), &params, 3, 4);\n\n        truncate_and_assert(get_long(), get_empty(), &params, 7, 0);\n        truncate_and_assert(get_long(), get_short(), &params, 5, 2);\n        truncate_and_assert(get_long(), get_medium(), &params, 4, 3);\n        truncate_and_assert(get_long(), get_long(), &params, 3, 4);\n    }\n\n    #[test]\n    fn truncate_encodings_empty() {\n        let params = TruncationParams {\n            max_length: 0,\n            strategy: TruncationStrategy::LongestFirst,\n            stride: 0,\n            direction: TruncationDirection::Right,\n        };\n\n        truncate_and_assert(get_empty(), get_short(), &params, 0, 0);\n        truncate_and_assert(get_medium(), get_medium(), &params, 0, 0);\n        truncate_and_assert(get_long(), get_long(), &params, 0, 0);\n    }\n\n    #[test]\n    fn test_deserialize_defaults() {\n        let old_truncation_params = r#\"{\"max_length\":256,\"strategy\":\"LongestFirst\",\"stride\":0}\"#;\n\n        let params: TruncationParams = serde_json::from_str(old_truncation_params).unwrap();\n\n        assert_eq!(params.direction, TruncationDirection::Right);\n    }\n}\n"
  },
  {
    "path": "tokenizers/tests/added_tokens.rs",
    "content": "mod common;\n\nuse common::*;\nuse tokenizers::tokenizer::AddedToken;\n\n#[test]\nfn add_tokens() {\n    let mut tokenizer = get_empty();\n\n    assert_eq!(\n        tokenizer.add_special_tokens(&[\n            AddedToken::from(\"<cls>\", true),\n            AddedToken::from(\"<sep>\", true)\n        ]),\n        2\n    );\n    assert_eq!(tokenizer.token_to_id(\"<cls>\"), Some(0));\n    assert_eq!(tokenizer.token_to_id(\"<sep>\"), Some(1));\n\n    assert_eq!(\n        tokenizer.add_tokens(&[\n            AddedToken::from(\"hello\", false),\n            AddedToken::from(\"world\", false)\n        ]),\n        2\n    );\n    assert_eq!(tokenizer.token_to_id(\"hello\"), Some(2));\n    assert_eq!(tokenizer.token_to_id(\"world\"), Some(3));\n}\n\n#[test]\nfn lstrip_tokens() {\n    let mut tokenizer = get_byte_level(true, false);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"<mask>\", true).lstrip(true)]);\n\n    let input = \"I saw a <mask> 😺\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(\n        output.get_tokens(),\n        &[\"ĠI\", \"Ġsaw\", \"Ġa\", \" <mask>\", \"ĠðŁĺ\", \"º\"]\n    );\n    assert_eq!(\n        output.get_offsets(),\n        &[(0, 1), (1, 5), (5, 7), (7, 14), (14, 19), (15, 19)]\n    );\n}\n\n#[test]\nfn rstrip_tokens() {\n    let mut tokenizer = get_byte_level(false, false);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"<mask>\", true).rstrip(true)]);\n\n    let input = \"I saw a <mask> 😺\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(\n        output.get_tokens(),\n        &[\"I\", \"Ġsaw\", \"Ġa\", \"Ġ\", \"<mask> \", \"ðŁĺ\", \"º\"]\n    );\n\n    // When `add_prefix_space = true` rstrip cannot work as a prefix space is added\n    // to the next token\n    let mut tokenizer = get_byte_level(true, false);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"<mask>\", true).rstrip(true)]);\n\n    let input = \"I saw a <mask> 😺\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(\n        output.get_tokens(),\n        &[\"ĠI\", \"Ġsaw\", \"Ġa\", \"Ġ\", \"<mask> \", \"ĠðŁĺ\", \"º\"]\n    );\n}\n\n#[test]\nfn single_word_tokens() {\n    // If `single_word = true` it shouldn't split `dancing`\n    let mut tokenizer = get_byte_level(false, false);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"ing\", true).single_word(true)]);\n\n    let input = \"I like dancing\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(output.get_tokens(), &[\"I\", \"Ġlike\", \"Ġdancing\"]);\n\n    // If `single_word = false` it should split `dancing`\n    let mut tokenizer = get_byte_level(false, false);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"ing\", true).single_word(false)]);\n\n    let input = \"I like dancing\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(output.get_tokens(), &[\"I\", \"Ġlike\", \"Ġd\", \"anc\", \"ing\"]);\n}\n\n#[test]\nfn overlapping_tokens() {\n    let mut tokenizer = get_byte_level(false, false);\n\n    tokenizer.add_special_tokens(&[AddedToken::from(\"danc\", true)]);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"nci\", true)]);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"ing\", true)]);\n\n    let input = \"I like dancing\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(output.get_tokens(), &[\"I\", \"Ġlike\", \"Ġ\", \"danc\", \"ing\"]);\n\n    let mut tokenizer = get_byte_level(false, false);\n\n    tokenizer.add_special_tokens(&[AddedToken::from(\"nci\", true)]);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"danc\", true)]);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"ing\", true)]);\n    tokenizer.add_special_tokens(&[AddedToken::from(\"ike\", true)]);\n\n    let output = tokenizer.encode(input, false).unwrap();\n\n    // Breaking change but following `transformers` breaking change.\n    // This behavior is deemed not used in practice:\n    // https://github.com/huggingface/transformers/pull/13220\n    // Order does NOT matter. (We could make it work again but the trie\n    // would need to keep insertion order too)\n    //\n    // assert_eq!(output.get_tokens(), &[\"I\", \"Ġlike\", \"Ġda\", \"nci\", \"ng\"]);\n    assert_eq!(output.get_tokens(), &[\"I\", \"Ġl\", \"ike\", \"Ġ\", \"danc\", \"ing\"]);\n}\n"
  },
  {
    "path": "tokenizers/tests/common/mod.rs",
    "content": "use tokenizers::decoders::wordpiece::WordPiece as WordPieceDecoder;\nuse tokenizers::models::bpe::BPE;\nuse tokenizers::models::wordpiece::WordPiece;\nuse tokenizers::normalizers::bert::BertNormalizer;\nuse tokenizers::pre_tokenizers::bert::BertPreTokenizer;\nuse tokenizers::pre_tokenizers::byte_level::ByteLevel;\nuse tokenizers::processors::bert::BertProcessing;\nuse tokenizers::tokenizer::{Model, Tokenizer};\n\n#[allow(dead_code)]\npub fn get_empty() -> Tokenizer {\n    Tokenizer::new(BPE::default())\n}\n\n#[allow(dead_code)]\npub fn get_byte_level_bpe() -> BPE {\n    BPE::from_file(\"data/gpt2-vocab.json\", \"data/gpt2-merges.txt\")\n        .build()\n        .expect(\"Files not found, run `make test` to download these files\")\n}\n\n#[allow(dead_code)]\npub fn get_byte_level(add_prefix_space: bool, trim_offsets: bool) -> Tokenizer {\n    let mut tokenizer = Tokenizer::new(get_byte_level_bpe());\n    tokenizer\n        .with_pre_tokenizer(Some(\n            ByteLevel::default().add_prefix_space(add_prefix_space),\n        ))\n        .with_decoder(Some(ByteLevel::default()))\n        .with_post_processor(Some(ByteLevel::default().trim_offsets(trim_offsets)));\n\n    tokenizer\n}\n\n#[allow(dead_code)]\npub fn get_bert_wordpiece() -> WordPiece {\n    WordPiece::from_file(\"data/bert-base-uncased-vocab.txt\")\n        .build()\n        .expect(\"Files not found, run `make test` to download these files\")\n}\n\n#[allow(dead_code)]\npub fn get_bert() -> Tokenizer {\n    let mut tokenizer = Tokenizer::new(get_bert_wordpiece());\n    let sep = tokenizer.get_model().token_to_id(\"[SEP]\").unwrap();\n    let cls = tokenizer.get_model().token_to_id(\"[CLS]\").unwrap();\n    tokenizer\n        .with_normalizer(Some(BertNormalizer::default()))\n        .with_pre_tokenizer(Some(BertPreTokenizer))\n        .with_decoder(Some(WordPieceDecoder::default()))\n        .with_post_processor(Some(BertProcessing::new(\n            (String::from(\"[SEP]\"), sep),\n            (String::from(\"[CLS]\"), cls),\n        )));\n\n    tokenizer\n}\n"
  },
  {
    "path": "tokenizers/tests/documentation.rs",
    "content": "use std::iter::FromIterator;\n\nuse ahash::AHashMap;\nuse tokenizers::decoders::byte_fallback::ByteFallback;\nuse tokenizers::models::bpe::{BpeTrainerBuilder, BPE};\nuse tokenizers::normalizers::{Sequence, Strip, NFC};\nuse tokenizers::pre_tokenizers::byte_level::ByteLevel;\nuse tokenizers::{AddedToken, TokenizerBuilder};\nuse tokenizers::{DecoderWrapper, NormalizerWrapper, PostProcessorWrapper, PreTokenizerWrapper};\nuse tokenizers::{Tokenizer, TokenizerImpl};\n\n#[test]\nfn train_tokenizer() {\n    let vocab_size: usize = 100;\n    let mut tokenizer = TokenizerBuilder::new()\n        .with_model(BPE::default())\n        .with_normalizer(Some(Sequence::new(vec![\n            Strip::new(true, true).into(),\n            NFC.into(),\n        ])))\n        .with_pre_tokenizer(Some(ByteLevel::default()))\n        .with_post_processor(Some(ByteLevel::default()))\n        .with_decoder(Some(ByteLevel::default()))\n        .build()\n        .unwrap();\n\n    let mut trainer = BpeTrainerBuilder::new()\n        .show_progress(false)\n        .vocab_size(vocab_size)\n        .min_frequency(0)\n        .special_tokens(vec![\n            AddedToken::from(String::from(\"<s>\"), true),\n            AddedToken::from(String::from(\"<pad>\"), true),\n            AddedToken::from(String::from(\"</s>\"), true),\n            AddedToken::from(String::from(\"<unk>\"), true),\n            AddedToken::from(String::from(\"<mask>\"), true),\n        ])\n        .build();\n\n    let pretty = true;\n    tokenizer\n        .train_from_files(&mut trainer, vec![\"data/small.txt\".to_string()])\n        .unwrap()\n        .save(\"data/tokenizer.json\", pretty)\n        .unwrap();\n}\n\n#[test]\nfn load_tokenizer() {\n    let tokenizer = Tokenizer::from_file(\"data/roberta.json\").unwrap();\n\n    let example = \"This is an example\";\n    let ids = vec![713, 16, 41, 1246];\n    let tokens = vec![\"This\", \"Ġis\", \"Ġan\", \"Ġexample\"];\n\n    let encodings = tokenizer.encode(example, false).unwrap();\n\n    assert_eq!(encodings.get_ids(), ids);\n    assert_eq!(encodings.get_tokens(), tokens);\n\n    let decoded = tokenizer.decode(&ids, false).unwrap();\n    assert_eq!(decoded, example);\n}\n\n#[test]\nfn streaming_tokenizer() {\n    let tokenizer = Tokenizer::from_file(\"data/roberta.json\").unwrap();\n\n    let mut decode_stream = tokenizer.decode_stream(false);\n    assert_eq!(decode_stream.step(713).unwrap(), Some(\"This\".to_string()));\n    assert_eq!(decode_stream.step(16).unwrap(), Some(\" is\".to_string()));\n    assert_eq!(decode_stream.step(41).unwrap(), Some(\" an\".to_string()));\n    assert_eq!(\n        decode_stream.step(1246).unwrap(),\n        Some(\" example\".to_string())\n    );\n\n    let tokenizer = Tokenizer::from_file(\"data/albert-base-v1-tokenizer.json\").unwrap();\n    let encoded = tokenizer.encode(\"This is an example\", false).unwrap();\n    assert_eq!(encoded.get_ids(), &[48, 25, 40, 823]);\n    let mut decode_stream = tokenizer.decode_stream(false);\n    // No space anymore\n    assert_eq!(decode_stream.step(25).unwrap(), Some(\"is\".to_string()));\n    let mut decode_stream = tokenizer.decode_stream(false);\n    assert_eq!(decode_stream.step(48).unwrap(), Some(\"this\".to_string()));\n    assert_eq!(decode_stream.step(25).unwrap(), Some(\" is\".to_string()));\n    assert_eq!(decode_stream.step(40).unwrap(), Some(\" an\".to_string()));\n    assert_eq!(\n        decode_stream.step(823).unwrap(),\n        Some(\" example\".to_string())\n    );\n\n    // None example\n    let vocab = AHashMap::from_iter([\n        (\"<0x20>\".to_string(), 0),\n        (\"<0xC3>\".to_string(), 1),\n        (\"<0xA9>\".to_string(), 2),\n        (\" This\".to_string(), 3),\n    ]);\n    let merges = vec![];\n    let bpe = BPE::builder()\n        .vocab_and_merges(vocab, merges)\n        .byte_fallback(true)\n        .build()\n        .unwrap();\n    let tokenizer = TokenizerBuilder::new()\n        .with_model(bpe)\n        .with_normalizer(Some(Sequence::new(vec![\n            Strip::new(true, true).into(),\n            NFC.into(),\n        ])))\n        .with_pre_tokenizer(Some(ByteLevel::default()))\n        .with_post_processor(Some(ByteLevel::default()))\n        .with_decoder(Some(ByteFallback::default()))\n        .build()\n        .unwrap();\n    let mut decode_stream = tokenizer.decode_stream(false);\n    assert_eq!(decode_stream.step(0).unwrap(), Some(\" \".to_string()));\n    assert_eq!(decode_stream.step(1).unwrap(), None);\n    assert_eq!(decode_stream.step(2).unwrap(), Some(\"é\".to_string()));\n    assert_eq!(decode_stream.step(2).unwrap(), None);\n}\n\n#[test]\n#[ignore]\nfn quicktour_slow_train() -> tokenizers::Result<()> {\n    // START quicktour_init_tokenizer\n    use tokenizers::models::bpe::BPE;\n\n    let mut tokenizer: TokenizerImpl<\n        BPE,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    > = TokenizerImpl::new(\n        BPE::builder()\n            .unk_token(\"[UNK]\".to_string())\n            .build()\n            .unwrap(),\n    );\n    // END quicktour_init_tokenizer\n    // START quicktour_init_trainer\n    use tokenizers::models::bpe::BpeTrainer;\n\n    let mut trainer = BpeTrainer::builder()\n        .special_tokens(vec![\n            AddedToken::from(\"[UNK]\", true),\n            AddedToken::from(\"[CLS]\", true),\n            AddedToken::from(\"[SEP]\", true),\n            AddedToken::from(\"[PAD]\", true),\n            AddedToken::from(\"[MASK]\", true),\n        ])\n        .build();\n    // END quicktour_init_trainer\n    // START quicktour_init_pretok\n    use tokenizers::pre_tokenizers::whitespace::Whitespace;\n\n    tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    // END quicktour_init_pretok\n\n    // START quicktour_train\n    let files = vec![\n        \"data/wikitext-103-raw/wiki.train.raw\".into(),\n        \"data/wikitext-103-raw/wiki.test.raw\".into(),\n        \"data/wikitext-103-raw/wiki.valid.raw\".into(),\n    ];\n    tokenizer.train_from_files(&mut trainer, files)?;\n    // END quicktour_train\n    // START quicktour_save\n    tokenizer.save(\"data/tokenizer-wiki.json\", false)?;\n    // END quicktour_save\n\n    Ok(())\n}\n\n#[test]\nfn quicktour() -> tokenizers::Result<()> {\n    // START quicktour_reload_tokenizer\n    let mut tokenizer = Tokenizer::from_file(\"data/tokenizer-wiki.json\")?;\n    // END quicktour_reload_tokenizer\n    // START quicktour_encode\n    let output = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\", true)?;\n    // END quicktour_encode\n    // START quicktour_print_tokens\n    println!(\"{:?}\", output.get_tokens());\n    // [\"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\",]\n    // END quicktour_print_tokens\n    assert_eq!(\n        output.get_tokens(),\n        [\"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\",]\n    );\n    // START quicktour_print_ids\n    println!(\"{:?}\", output.get_ids());\n    // [27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35]\n    // END quicktour_print_ids\n    assert_eq!(\n        output.get_ids(),\n        [27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35]\n    );\n    // START quicktour_print_offsets\n    println!(\"{:?}\", output.get_offsets()[9]);\n    // (26, 30)\n    // END quicktour_print_offsets\n    assert_eq!(output.get_offsets()[9], (26, 30));\n    // START quicktour_use_offsets\n    let sentence = \"Hello, y'all! How are you 😁 ?\";\n    println!(\"{}\", &sentence[26..30]);\n    // \"😁\"\n    // END quicktour_use_offsets\n    // START quicktour_check_sep\n    println!(\"{}\", tokenizer.token_to_id(\"[SEP]\").unwrap());\n    // 2\n    // END quicktour_check_sep\n    assert_eq!(tokenizer.token_to_id(\"[SEP]\"), Some(2));\n    // START quicktour_init_template_processing\n    use tokenizers::processors::template::TemplateProcessing;\n\n    let special_tokens = vec![\n        (\"[CLS]\", tokenizer.token_to_id(\"[CLS]\").unwrap()),\n        (\"[SEP]\", tokenizer.token_to_id(\"[SEP]\").unwrap()),\n    ];\n    tokenizer.with_post_processor(Some(\n        TemplateProcessing::builder()\n            .try_single(\"[CLS] $A [SEP]\")\n            .unwrap()\n            .try_pair(\"[CLS] $A [SEP] $B:1 [SEP]:1\")\n            .unwrap()\n            .special_tokens(special_tokens)\n            .build()?,\n    ));\n    // END quicktour_init_template_processing\n    // START quicktour_print_special_tokens\n    let output = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\", true)?;\n    println!(\"{:?}\", output.get_tokens());\n    // [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n    // END quicktour_print_special_tokens\n    assert_eq!(\n        output.get_tokens(),\n        [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n    );\n    // START quicktour_print_special_tokens_pair\n    let output = tokenizer.encode((\"Hello, y'all!\", \"How are you 😁 ?\"), true)?;\n    println!(\"{:?}\", output.get_tokens());\n    // [\"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"[SEP]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\"]\n    // END quicktour_print_special_tokens_pair\n    assert_eq!(\n        output.get_tokens(),\n        [\n            \"[CLS]\", \"Hello\", \",\", \"y\", \"'\", \"all\", \"!\", \"[SEP]\", \"How\", \"are\", \"you\", \"[UNK]\",\n            \"?\", \"[SEP]\"\n        ]\n    );\n    // START quicktour_print_type_ids\n    println!(\"{:?}\", output.get_type_ids());\n    // [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\n    // END quicktour_print_type_ids\n    assert_eq!(\n        output.get_type_ids(),\n        [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\n    );\n    // START quicktour_encode_batch\n    let output = tokenizer.encode_batch(vec![\"Hello, y'all!\", \"How are you 😁 ?\"], true)?;\n    // END quicktour_encode_batch\n    println!(\"{output:?}\");\n    // START quicktour_encode_batch_pair\n    let output = tokenizer.encode_batch(\n        vec![\n            (\"Hello, y'all!\", \"How are you 😁 ?\"),\n            (\"Hello to you too!\", \"I'm fine, thank you!\"),\n        ],\n        true,\n    )?;\n    // END quicktour_encode_batch_pair\n    println!(\"{output:?}\");\n    // START quicktour_enable_padding\n    use tokenizers::PaddingParams;\n\n    tokenizer.with_padding(Some(PaddingParams {\n        pad_id: 3,\n        pad_token: \"[PAD]\".to_string(),\n        ..PaddingParams::default()\n    }));\n    // END quicktour_enable_padding\n    // START quicktour_print_batch_tokens\n    let output = tokenizer.encode_batch(vec![\"Hello, y'all!\", \"How are you 😁 ?\"], true)?;\n    println!(\"{:?}\", output[1].get_tokens());\n    // [\"[CLS]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\", \"[PAD]\"]\n    // END quicktour_print_batch_tokens\n    assert_eq!(\n        output[1].get_tokens(),\n        [\"[CLS]\", \"How\", \"are\", \"you\", \"[UNK]\", \"?\", \"[SEP]\", \"[PAD]\"]\n    );\n    // START quicktour_print_attention_mask\n    println!(\"{:?}\", output[1].get_attention_mask());\n    // [1, 1, 1, 1, 1, 1, 1, 0]\n    // END quicktour_print_attention_mask\n    assert_eq!(output[1].get_attention_mask(), [1, 1, 1, 1, 1, 1, 1, 0]);\n    Ok(())\n}\n\n#[test]\nfn pipeline() -> tokenizers::Result<()> {\n    // START pipeline_reload_tokenizer\n    use tokenizers::Tokenizer;\n\n    let mut tokenizer = Tokenizer::from_file(\"data/tokenizer-wiki.json\")?;\n    // END pipeline_reload_tokenizer\n    // START pipeline_setup_normalizer\n    use tokenizers::normalizers::{\n        strip::StripAccents, unicode::NFD, utils::Sequence as NormalizerSequence,\n    };\n\n    let normalizer = NormalizerSequence::new(vec![NFD.into(), StripAccents.into()]);\n    // END pipeline_setup_normalizer\n    // START pipeline_test_normalizer\n    use tokenizers::{NormalizedString, Normalizer};\n\n    let mut normalized = NormalizedString::from(\"Héllò hôw are ü?\");\n    normalizer.normalize(&mut normalized)?;\n\n    println!(\"{}\", normalized.get());\n    // \"Hello how are u?\"\n    // END pipeline_test_normalizer\n    assert_eq!(normalized.get(), \"Hello how are u?\");\n    // START pipeline_replace_normalizer\n    tokenizer.with_normalizer(Some(normalizer));\n    // END pipeline_replace_normalizer\n    // START pipeline_setup_pre_tokenizer\n    use tokenizers::pre_tokenizers::whitespace::Whitespace;\n    use tokenizers::{OffsetReferential, OffsetType, PreTokenizedString, PreTokenizer};\n\n    let pre_tokenizer = Whitespace {};\n    let mut pre_tokenized = PreTokenizedString::from(\"Hello! How are you? I'm fine, thank you.\");\n\n    pre_tokenizer.pre_tokenize(&mut pre_tokenized)?;\n\n    println!(\n        \"{:?}\",\n        pre_tokenized.get_splits(OffsetReferential::Original, OffsetType::Byte)\n    );\n    // [(\"Hello\", (0, 5), None), (\"!\", (5, 6), None), (\"How\", (7, 10), None),\n    //  (\"are\", (11, 14), None), (\"you\", (15, 18), None), (\"?\", (18, 19), None),\n    //  (\"I\", (20, 21), None), (\"\\'\", (21, 22), None), (\"m\", (22, 23), None),\n    //  (\"fine\", (24, 28), None), (\",\", (28, 29), None), (\"thank\", (30, 35), None),\n    //  (\"you\", (36, 39), None), (\".\", (39, 40), None)]\n    // END pipeline_setup_pre_tokenizer\n    assert_eq!(\n        pre_tokenized.get_splits(OffsetReferential::Original, OffsetType::Byte),\n        vec![\n            (\"Hello\", (0, 5), &None),\n            (\"!\", (5, 6), &None),\n            (\"How\", (7, 10), &None),\n            (\"are\", (11, 14), &None),\n            (\"you\", (15, 18), &None),\n            (\"?\", (18, 19), &None),\n            (\"I\", (20, 21), &None),\n            (\"\\'\", (21, 22), &None),\n            (\"m\", (22, 23), &None),\n            (\"fine\", (24, 28), &None),\n            (\",\", (28, 29), &None),\n            (\"thank\", (30, 35), &None),\n            (\"you\", (36, 39), &None),\n            (\".\", (39, 40), &None)\n        ]\n    );\n    // START pipeline_combine_pre_tokenizer\n    use tokenizers::pre_tokenizers::{digits::Digits, sequence::Sequence};\n\n    let pre_tokenizer = Sequence::new(vec![Whitespace {}.into(), Digits::new(true).into()]);\n    let mut pre_tokenized = PreTokenizedString::from(\"Call 911!\");\n\n    pre_tokenizer.pre_tokenize(&mut pre_tokenized)?;\n\n    println!(\n        \"{:?}\",\n        pre_tokenized.get_splits(OffsetReferential::Original, OffsetType::Byte)\n    );\n    // END pipeline_combine_pre_tokenizer\n    assert_eq!(\n        pre_tokenized.get_splits(OffsetReferential::Original, OffsetType::Byte),\n        vec![\n            (\"Call\", (0, 4), &None),\n            (\"9\", (5, 6), &None),\n            (\"1\", (6, 7), &None),\n            (\"1\", (7, 8), &None),\n            (\"!\", (8, 9), &None)\n        ]\n    );\n    // START pipeline_replace_pre_tokenizer\n    tokenizer.with_pre_tokenizer(Some(pre_tokenizer));\n    // END pipeline_replace_pre_tokenizer\n    // START pipeline_setup_processor\n    use tokenizers::processors::template::TemplateProcessing;\n\n    tokenizer.with_post_processor(Some(\n        TemplateProcessing::builder()\n            .try_single(\"[CLS] $A [SEP]\")\n            .unwrap()\n            .try_pair(\"[CLS] $A [SEP] $B:1 [SEP]:1\")\n            .unwrap()\n            .special_tokens(vec![(\"[CLS]\", 1), (\"[SEP]\", 2)])\n            .build()\n            .unwrap(),\n    ));\n    // END pipeline_setup_processor\n    // START pipeline_test_decoding\n    let output = tokenizer.encode(\"Hello, y'all! How are you 😁 ?\", true)?;\n    println!(\"{:?}\", output.get_ids());\n    // [1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2]\n\n    let decoded = tokenizer.decode(\n        &[1, 27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35, 2],\n        true,\n    )?;\n    println!(\"{decoded}\");\n    // \"Hello , y ' all ! How are you ?\"\n    // END pipeline_test_decoding\n\n    Ok(())\n}\n\n#[test]\n#[ignore]\nfn train_pipeline_bert() -> tokenizers::Result<()> {\n    // START bert_setup_tokenizer\n    use tokenizers::models::wordpiece::WordPiece;\n    use tokenizers::Tokenizer;\n\n    let mut bert_tokenizer = Tokenizer::new(\n        WordPiece::builder()\n            .unk_token(\"[UNK]\".to_string())\n            .build()\n            .unwrap(),\n    );\n    // END bert_setup_tokenizer\n    // START bert_setup_normalizer\n    use tokenizers::normalizers::utils::Sequence as NormalizerSequence;\n    use tokenizers::normalizers::{strip::StripAccents, unicode::NFD, utils::Lowercase};\n\n    bert_tokenizer.with_normalizer(Some(NormalizerSequence::new(vec![\n        NFD.into(),\n        Lowercase.into(),\n        StripAccents.into(),\n    ])));\n    // END bert_setup_normalizer\n    // START bert_setup_pre_tokenizer\n    use tokenizers::pre_tokenizers::whitespace::Whitespace;\n\n    bert_tokenizer.with_pre_tokenizer(Some(Whitespace {}));\n    // END bert_setup_pre_tokenizer\n    // START bert_setup_processor\n    use tokenizers::processors::template::TemplateProcessing;\n\n    bert_tokenizer.with_post_processor(Some(\n        TemplateProcessing::builder()\n            .try_single(\"[CLS] $A [SEP]\")\n            .unwrap()\n            .try_pair(\"[CLS] $A [SEP] $B:1 [SEP]:1\")\n            .unwrap()\n            .special_tokens(vec![(\"[CLS]\", 1), (\"[SEP]\", 2)])\n            .build()\n            .unwrap(),\n    ));\n    // END bert_setup_processor\n    // START bert_train_tokenizer\n    use tokenizers::models::{wordpiece::WordPieceTrainer, TrainerWrapper};\n\n    let mut trainer: TrainerWrapper = WordPieceTrainer::builder()\n        .vocab_size(30_522)\n        .special_tokens(vec![\n            AddedToken::from(\"[UNK]\", true),\n            AddedToken::from(\"[CLS]\", true),\n            AddedToken::from(\"[SEP]\", true),\n            AddedToken::from(\"[PAD]\", true),\n            AddedToken::from(\"[MASK]\", true),\n        ])\n        .build()\n        .into();\n    let files = vec![\n        \"data/wikitext-103-raw/wiki.train.raw\".into(),\n        \"data/wikitext-103-raw/wiki.test.raw\".into(),\n        \"data/wikitext-103-raw/wiki.valid.raw\".into(),\n    ];\n    bert_tokenizer.train_from_files(&mut trainer, files)?;\n\n    bert_tokenizer.save(\"data/bert-wiki.json\", false)?;\n    // END bert_train_tokenizer\n    Ok(())\n}\n\n#[test]\nfn pipeline_bert() -> tokenizers::Result<()> {\n    let mut bert_tokenizer = Tokenizer::from_file(\"data/bert-wiki.json\")?;\n\n    // START bert_test_decoding\n    let output = bert_tokenizer.encode(\"Welcome to the 🤗 Tokenizers library.\", true)?;\n    println!(\"{:?}\", output.get_tokens());\n    // [\"[CLS]\", \"welcome\", \"to\", \"the\", \"[UNK]\", \"tok\", \"##eni\", \"##zer\", \"##s\", \"library\", \".\", \"[SEP]\"]\n\n    let decoded = bert_tokenizer.decode(output.get_ids(), true)?;\n    println!(\"{decoded}\");\n    // \"welcome to the tok ##eni ##zer ##s library .\"\n    // END bert_test_decoding\n    assert_eq!(\n        output.get_tokens(),\n        &[\n            \"[CLS]\", \"welcome\", \"to\", \"the\", \"[UNK]\", \"tok\", \"##eni\", \"##zer\", \"##s\", \"library\",\n            \".\", \"[SEP]\"\n        ]\n    );\n    assert_eq!(decoded, \"welcome to the tok ##eni ##zer ##s library .\");\n    // START bert_proper_decoding\n    use tokenizers::decoders::wordpiece::WordPiece as WordPieceDecoder;\n\n    bert_tokenizer.with_decoder(Some(WordPieceDecoder::default()));\n    let decoded = bert_tokenizer.decode(output.get_ids(), true)?;\n    // \"welcome to the tokenizers library.\"\n    // END bert_proper_decoding\n    assert_eq!(decoded, \"welcome to the tokenizers library.\");\n\n    Ok(())\n}\n"
  },
  {
    "path": "tokenizers/tests/from_pretrained.rs",
    "content": "#![cfg(feature = \"http\")]\nuse tokenizers::{FromPretrainedParameters, Result, Tokenizer};\n\n#[test]\nfn test_from_pretrained() -> Result<()> {\n    let tokenizer = Tokenizer::from_pretrained(\"bert-base-cased\", None)?;\n    let encoding = tokenizer.encode(\"Hey there dear friend!\", false)?;\n    assert_eq!(\n        encoding.get_tokens(),\n        &[\"Hey\", \"there\", \"dear\", \"friend\", \"!\"]\n    );\n    Ok(())\n}\n\n#[test]\nfn test_from_pretrained_revision() -> Result<()> {\n    let tokenizer = Tokenizer::from_pretrained(\"anthony/tokenizers-test\", None)?;\n    let encoding = tokenizer.encode(\"Hey there dear friend!\", false)?;\n    assert_eq!(\n        encoding.get_tokens(),\n        &[\"hey\", \"there\", \"dear\", \"friend\", \"!\"]\n    );\n\n    let tokenizer = Tokenizer::from_pretrained(\n        \"anthony/tokenizers-test\",\n        Some(FromPretrainedParameters {\n            revision: \"gpt-2\".to_string(),\n            ..Default::default()\n        }),\n    )?;\n    let encoding = tokenizer.encode(\"Hey there dear friend!\", false)?;\n    assert_eq!(\n        encoding.get_tokens(),\n        &[\"Hey\", \"Ġthere\", \"Ġdear\", \"Ġfriend\", \"!\"]\n    );\n\n    Ok(())\n}\n\n#[test]\nfn test_from_pretrained_invalid_model() {\n    let tokenizer = Tokenizer::from_pretrained(\"docs?\", None);\n    assert!(tokenizer.is_err());\n}\n\n#[test]\nfn test_from_pretrained_invalid_revision() {\n    let tokenizer = Tokenizer::from_pretrained(\n        \"bert-base-cased\",\n        Some(FromPretrainedParameters {\n            revision: \"gpt?\".to_string(),\n            ..Default::default()\n        }),\n    );\n    assert!(tokenizer.is_err());\n}\n"
  },
  {
    "path": "tokenizers/tests/offsets.rs",
    "content": "mod common;\n\nuse common::*;\nuse tokenizers::tokenizer::AddedToken;\n\nmacro_rules! check_offsets {\n    ($input: expr, $output:expr, $offset:expr, $result:expr) => {\n        let offsets = $output.get_offsets()[$offset];\n        assert_eq!(&$input[offsets.0..offsets.1], $result);\n    };\n}\n\n#[test]\nfn byte_level_basic() {\n    // Without trimming offsets\n    let tokenizer = get_byte_level(true, false);\n\n    let input = \"Hello there, how are you?\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    check_offsets!(input, output, 0, \"Hello\");\n    check_offsets!(input, output, 1, \" there\");\n    check_offsets!(input, output, 2, \",\");\n    check_offsets!(input, output, 3, \" how\");\n    check_offsets!(input, output, 4, \" are\");\n    check_offsets!(input, output, 5, \" you\");\n    check_offsets!(input, output, 6, \"?\");\n\n    // And when trimming offsets:\n    let tokenizer = get_byte_level(true, true);\n\n    let input = \"Hello there, how are you?\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    check_offsets!(input, output, 0, \"Hello\");\n    check_offsets!(input, output, 1, \"there\");\n    check_offsets!(input, output, 2, \",\");\n    check_offsets!(input, output, 3, \"how\");\n    check_offsets!(input, output, 4, \"are\");\n    check_offsets!(input, output, 5, \"you\");\n    check_offsets!(input, output, 6, \"?\");\n}\n\n#[test]\nfn byte_level_unicode() {\n    let tokenizer = get_byte_level(true, false);\n\n    let input = \"i⭢j\";\n    let output = tokenizer.encode(input, false).unwrap();\n\n    check_offsets!(input, output, 1, \"⭢\");\n    check_offsets!(input, output, 2, \"⭢\");\n    check_offsets!(input, output, 3, \"⭢\");\n}\n\n#[test]\nfn byte_level_double_sequence() {\n    let input_a = \"My name is Anthony\";\n    let input_b = \"What is my name?\";\n\n    // Without trimming offsets\n    let tokenizer = get_byte_level(true, false);\n    let output = tokenizer.encode((input_a, input_b), false).unwrap();\n\n    let offsets = output.get_offsets();\n    assert_eq!(\n        offsets,\n        &[\n            (0, 2),\n            (2, 7),\n            (7, 10),\n            (10, 18),\n            (0, 4),\n            (4, 7),\n            (7, 10),\n            (10, 15),\n            (15, 16)\n        ]\n    );\n    assert_eq!(\n        output.get_word_ids(),\n        &[\n            Some(0),\n            Some(1),\n            Some(2),\n            Some(3),\n            Some(0),\n            Some(1),\n            Some(2),\n            Some(3),\n            Some(4)\n        ]\n    );\n    assert_eq!(output.get_type_ids(), &[0, 0, 0, 0, 1, 1, 1, 1, 1]);\n\n    // When trimming offsets\n    let tokenizer = get_byte_level(true, true);\n    let output = tokenizer.encode((input_a, input_b), false).unwrap();\n    let offsets = output.get_offsets();\n    assert_eq!(\n        offsets,\n        &[\n            (0, 2),\n            (3, 7),\n            (8, 10),\n            (11, 18),\n            (0, 4),\n            (5, 7),\n            (8, 10),\n            (11, 15),\n            (15, 16)\n        ]\n    );\n}\n\n#[test]\nfn byte_level_pre_tokenized_sequence() {\n    let input = [\"My\", \"name\", \"is\", \"Anthonino\"];\n\n    // Without trimming offsets\n    let tokenizer = get_byte_level(true, false);\n    let output = tokenizer.encode(&input[..], false).unwrap();\n\n    assert_eq!(\n        output.get_tokens(),\n        &[\"ĠMy\", \"Ġname\", \"Ġis\", \"ĠAnth\", \"on\", \"ino\"]\n    );\n    assert_eq!(\n        output.get_word_ids(),\n        &[Some(0), Some(1), Some(2), Some(3), Some(3), Some(3)]\n    );\n    assert_eq!(\n        output.get_offsets(),\n        &[(0, 2), (0, 4), (0, 2), (0, 4), (4, 6), (6, 9)]\n    );\n}\n\n#[test]\n#[ignore]\nfn byte_level_pre_tokenized_sequence_with_trimming() {\n    let input = [\"My\", \"name\", \"is\", \"Anthonino\"];\n\n    // When trimming offsets (expect same result)\n    let tokenizer = get_byte_level(true, true);\n    let output = tokenizer.encode(&input[..], false).unwrap();\n\n    assert_eq!(\n        output.get_word_ids(),\n        &[Some(0), Some(1), Some(2), Some(3), Some(3), Some(3)]\n    );\n    assert_eq!(\n        output.get_offsets(),\n        &[(0, 2), (0, 4), (0, 2), (0, 4), (4, 6), (6, 9)]\n    );\n}\n\n#[test]\nfn split_on_added_tokens_bert() {\n    let input = \"Yesterday I saw a [MASK] far away\";\n\n    let mut tokenizer = get_bert();\n    tokenizer.add_special_tokens(&[AddedToken::from(\"[MASK]\", true)]);\n    let output = tokenizer.encode(input, false).unwrap();\n\n    assert_eq!(\n        output.get_offsets(),\n        &[\n            (0, 9),\n            (10, 11),\n            (12, 15),\n            (16, 17),\n            (18, 24),\n            (25, 28),\n            (29, 33)\n        ]\n    );\n    assert_eq!(\n        output.get_tokens(),\n        &[\"yesterday\", \"i\", \"saw\", \"a\", \"[MASK]\", \"far\", \"away\"]\n    );\n    assert_eq!(\n        output.get_word_ids(),\n        &[\n            Some(0),\n            Some(1),\n            Some(2),\n            Some(3),\n            Some(4),\n            Some(5),\n            Some(6)\n        ]\n    );\n}\n"
  },
  {
    "path": "tokenizers/tests/serialization.rs",
    "content": "mod common;\n\nuse common::*;\nuse tokenizers::decoders::byte_level::ByteLevel;\nuse tokenizers::decoders::DecoderWrapper;\nuse tokenizers::models::bpe::BPE;\nuse tokenizers::models::wordlevel::WordLevel;\nuse tokenizers::models::wordpiece::WordPiece;\nuse tokenizers::models::ModelWrapper;\nuse tokenizers::normalizers::bert::BertNormalizer;\nuse tokenizers::normalizers::unicode::{NFC, NFKC};\nuse tokenizers::normalizers::NormalizerWrapper;\nuse tokenizers::pre_tokenizers::bert::BertPreTokenizer;\nuse tokenizers::pre_tokenizers::delimiter::CharDelimiterSplit;\nuse tokenizers::pre_tokenizers::split::{Split, SplitPattern};\nuse tokenizers::pre_tokenizers::whitespace::Whitespace;\nuse tokenizers::pre_tokenizers::PreTokenizerWrapper;\nuse tokenizers::processors::bert::BertProcessing;\nuse tokenizers::processors::PostProcessorWrapper;\nuse tokenizers::{SplitDelimiterBehavior, Tokenizer, TokenizerImpl};\n\n#[test]\nfn bpe_serde() {\n    let bpe = get_byte_level_bpe();\n    let ser = serde_json::to_string(&bpe).unwrap();\n    let de = serde_json::from_str(&ser).unwrap();\n    assert_eq!(bpe, de);\n}\n\n#[test]\nfn wordpiece_serde() {\n    let wordpiece = get_bert_wordpiece();\n    let ser = serde_json::to_string(&wordpiece).unwrap();\n    let de = serde_json::from_str(&ser).unwrap();\n    assert_eq!(wordpiece, de);\n}\n\n#[test]\nfn wordlevel_serde() {\n    let wordlevel = WordLevel::from_file(\"data/gpt2-vocab.json\", \"<unk>\".into()).unwrap();\n    let ser = serde_json::to_string(&wordlevel).unwrap();\n    let de = serde_json::from_str(&ser).unwrap();\n    assert_eq!(wordlevel, de);\n}\n\n#[test]\nfn normalizers() {\n    // Test unit struct\n    let nfc = NFC;\n    let nfc_ser = serde_json::to_string(&nfc).unwrap();\n    assert_eq!(nfc_ser, r#\"{\"type\":\"NFC\"}\"#);\n    // empty struct can deserialize from self\n    serde_json::from_str::<NFC>(&nfc_ser).unwrap();\n    let err: Result<NFKC, _> = serde_json::from_str(&nfc_ser);\n    assert!(err.is_err(), \"NFKC shouldn't be deserializable from NFC\");\n    // wrapper can can deserialize from inner\n    let nfc_wrapped: NormalizerWrapper = serde_json::from_str(&nfc_ser).unwrap();\n    match &nfc_wrapped {\n        NormalizerWrapper::NFC(_) => (),\n        _ => panic!(\"NFC wrapped with incorrect variant\"),\n    }\n    let ser_wrapped = serde_json::to_string(&nfc_wrapped).unwrap();\n    assert_eq!(ser_wrapped, nfc_ser);\n\n    // Test non-empty roundtrip\n    let bert = BertNormalizer::default();\n    let bert_ser = serde_json::to_string(&bert).unwrap();\n    assert_eq!(\n        bert_ser,\n        r#\"{\"type\":\"BertNormalizer\",\"clean_text\":true,\"handle_chinese_chars\":true,\"strip_accents\":null,\"lowercase\":true}\"#\n    );\n    // make sure we can deserialize to self\n    serde_json::from_str::<BertNormalizer>(&bert_ser).unwrap();\n    // wrapper can deserialize from inner serialization\n    let bert_wrapped: NormalizerWrapper = serde_json::from_str(&bert_ser).unwrap();\n    match &bert_wrapped {\n        NormalizerWrapper::BertNormalizer(_) => (),\n        _ => panic!(\"BertNormalizer wrapped with incorrect variant\"),\n    }\n    // wrapped serializes same way as inner\n    let ser_wrapped = serde_json::to_string(&bert_wrapped).unwrap();\n    assert_eq!(ser_wrapped, bert_ser);\n}\n\n#[test]\nfn processors() {\n    let bert = BertProcessing::new((\"SEP\".into(), 0), (\"CLS\".into(), 0));\n    let bert_ser = serde_json::to_string(&bert).unwrap();\n    assert_eq!(\n        bert_ser,\n        r#\"{\"type\":\"BertProcessing\",\"sep\":[\"SEP\",0],\"cls\":[\"CLS\",0]}\"#\n    );\n    serde_json::from_str::<BertProcessing>(&bert_ser).unwrap();\n    let bert_wrapped: PostProcessorWrapper = serde_json::from_str(&bert_ser).unwrap();\n    match &bert_wrapped {\n        PostProcessorWrapper::Bert(_) => (),\n        _ => panic!(\"Bert wrapped with incorrect variant\"),\n    }\n    let ser_wrapped = serde_json::to_string(&bert_wrapped).unwrap();\n    assert_eq!(ser_wrapped, bert_ser);\n}\n\n#[test]\nfn pretoks() {\n    // Test unit struct\n    let bert = BertPreTokenizer;\n    let bert_ser = serde_json::to_string(&bert).unwrap();\n    assert_eq!(bert_ser, r#\"{\"type\":\"BertPreTokenizer\"}\"#);\n    // empty struct can deserialize from self\n    serde_json::from_str::<BertPreTokenizer>(&bert_ser).unwrap();\n    let err: Result<Whitespace, _> = serde_json::from_str(&bert_ser);\n    assert!(\n        err.is_err(),\n        \"Whitespace shouldn't be deserializable from BertPreTokenizer\"\n    );\n    // wrapper can can deserialize from inner\n    let bert_wrapped: PreTokenizerWrapper = serde_json::from_str(&bert_ser).unwrap();\n    match &bert_wrapped {\n        PreTokenizerWrapper::BertPreTokenizer(_) => (),\n        _ => panic!(\"Bert wrapped with incorrect variant\"),\n    }\n    let ser_wrapped = serde_json::to_string(&bert_wrapped).unwrap();\n    assert_eq!(ser_wrapped, bert_ser);\n\n    // Test non-empty roundtrip\n    let ch = CharDelimiterSplit::new(' ');\n    let ch_ser = serde_json::to_string(&ch).unwrap();\n    assert_eq!(ch_ser, r#\"{\"type\":\"CharDelimiterSplit\",\"delimiter\":\" \"}\"#);\n    // make sure we can deserialize to self\n    serde_json::from_str::<CharDelimiterSplit>(&ch_ser).unwrap();\n    // wrapper can deserialize from inner serialization\n    let ch_wrapped: PreTokenizerWrapper = serde_json::from_str(&ch_ser).unwrap();\n    match &ch_wrapped {\n        PreTokenizerWrapper::Delimiter(_) => (),\n        _ => panic!(\"CharDelimiterSplit wrapped with incorrect variant\"),\n    }\n    // wrapped serializes same way as inner\n    let ser_wrapped = serde_json::to_string(&ch_wrapped).unwrap();\n    assert_eq!(ser_wrapped, ch_ser);\n\n    let wsp = Whitespace {};\n    let wsp_ser = serde_json::to_string(&wsp).unwrap();\n    assert_eq!(wsp_ser, r#\"{\"type\":\"Whitespace\"}\"#);\n    serde_json::from_str::<Whitespace>(&wsp_ser).unwrap();\n    let err: Result<BertPreTokenizer, _> = serde_json::from_str(&wsp_ser);\n    assert!(\n        err.is_err(),\n        \"BertPreTokenizer shouldn't be deserializable from Whitespace\"\n    );\n\n    let pattern: SplitPattern = \"[SEP]\".into();\n    let pretok = Split::new(pattern, SplitDelimiterBehavior::Isolated, false).unwrap();\n    let pretok_str = serde_json::to_string(&pretok).unwrap();\n    assert_eq!(\n        pretok_str,\n        r#\"{\"type\":\"Split\",\"pattern\":{\"String\":\"[SEP]\"},\"behavior\":\"Isolated\",\"invert\":false}\"#\n    );\n    assert_eq!(serde_json::from_str::<Split>(&pretok_str).unwrap(), pretok);\n\n    let pattern = SplitPattern::Regex(\"[SEP]\".to_string());\n    let pretok = Split::new(pattern, SplitDelimiterBehavior::Isolated, false).unwrap();\n    let pretok_str = serde_json::to_string(&pretok).unwrap();\n    assert_eq!(\n        pretok_str,\n        r#\"{\"type\":\"Split\",\"pattern\":{\"Regex\":\"[SEP]\"},\"behavior\":\"Isolated\",\"invert\":false}\"#\n    );\n    assert_eq!(serde_json::from_str::<Split>(&pretok_str).unwrap(), pretok);\n}\n\n#[test]\nfn decoders() {\n    let byte_level = ByteLevel::default();\n    let byte_level_ser = serde_json::to_string(&byte_level).unwrap();\n    assert_eq!(\n        byte_level_ser,\n        r#\"{\"type\":\"ByteLevel\",\"add_prefix_space\":true,\"trim_offsets\":true,\"use_regex\":true}\"#\n    );\n    serde_json::from_str::<ByteLevel>(&byte_level_ser).unwrap();\n    let byte_level_wrapper: DecoderWrapper = serde_json::from_str(&byte_level_ser).unwrap();\n    match &byte_level_wrapper {\n        DecoderWrapper::ByteLevel(_) => (),\n        _ => panic!(\"ByteLevel wrapped with incorrect variant\"),\n    }\n    let ser_wrapped = serde_json::to_string(&byte_level_wrapper).unwrap();\n    assert_eq!(ser_wrapped, byte_level_ser);\n}\n\n#[test]\nfn models() {\n    let bpe = BPE::default();\n    let bpe_ser = serde_json::to_string(&bpe).unwrap();\n    serde_json::from_str::<BPE>(&bpe_ser).unwrap();\n    let bpe_wrapper: ModelWrapper = serde_json::from_str(&bpe_ser).unwrap();\n    match &bpe_wrapper {\n        ModelWrapper::BPE(_) => (),\n        _ => panic!(\"BPE wrapped with incorrect variant\"),\n    }\n    let ser_wrapped = serde_json::to_string(&bpe_wrapper).unwrap();\n    assert_eq!(ser_wrapped, bpe_ser);\n}\n\n#[test]\nfn tokenizer() {\n    let wordpiece = WordPiece::default();\n    let mut tokenizer = Tokenizer::new(wordpiece);\n    tokenizer.with_normalizer(Some(NFC));\n    let ser = serde_json::to_string(&tokenizer).unwrap();\n    let _: Tokenizer = serde_json::from_str(&ser).unwrap();\n    let unwrapped_nfc_tok: TokenizerImpl<\n        WordPiece,\n        NFC,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    > = serde_json::from_str(&ser).unwrap();\n    assert_eq!(serde_json::to_string(&unwrapped_nfc_tok).unwrap(), ser);\n    let err: Result<\n        TokenizerImpl<WordPiece, NFKC, PreTokenizerWrapper, PostProcessorWrapper, DecoderWrapper>,\n        _,\n    > = serde_json::from_str(&ser);\n    assert!(err.is_err(), \"NFKC shouldn't be deserializable from NFC\");\n    let de: TokenizerImpl<\n        WordPiece,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    > = serde_json::from_str(&ser).unwrap();\n    assert_eq!(serde_json::to_string(&de).unwrap(), ser);\n}\n\n#[test]\nfn bpe_with_dropout_serde() {\n    let mut bpe = BPE::default();\n    bpe.dropout = Some(0.1);\n    let ser = serde_json::to_string(&bpe).unwrap();\n    let de = serde_json::from_str(&ser).unwrap();\n    assert_eq!(bpe, de);\n\n    // set dropout to 0.0 (which is analogous to None) and reserialize\n    bpe.dropout = Some(0.0);\n    let ser = serde_json::to_string(&bpe).unwrap();\n    let de = serde_json::from_str(&ser).unwrap();\n    assert_eq!(bpe, de);\n}\n\n#[test]\nfn test_deserialize_long_file() {\n    let _tokenizer = Tokenizer::from_file(\"data/albert-base-v1-tokenizer.json\").unwrap();\n}\n"
  },
  {
    "path": "tokenizers/tests/stream.rs",
    "content": "use tokenizers::{\n    normalizers,\n    pre_tokenizers::split::{Split, SplitPattern},\n    AddedToken, NormalizerWrapper, PreTokenizerWrapper, SplitDelimiterBehavior, Tokenizer,\n};\n\n#[test]\nfn test_decoding_with_added_bpe() {\n    let mut tokenizer = Tokenizer::from_file(\"data/llama-3-tokenizer.json\").unwrap();\n    tokenizer.with_normalizer(Some(NormalizerWrapper::from(normalizers::ByteLevel::new())));\n    tokenizer.with_pre_tokenizer(Some(PreTokenizerWrapper::Split(\n        Split::new(\n            SplitPattern::Regex(r\"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\\\r\\\\n\\\\p{L}\\\\p{N}]?\\\\p{L}+|\\\\p{N}{1,3}| ?[^\\\\s\\\\p{L}\\\\p{N}]+[\\\\r\\\\n]*|\\\\s*[\\\\r\\\\n]+|\\\\s+(?!\\\\S)|\\\\s+\".into()),\n            SplitDelimiterBehavior::Isolated,\n            false,\n        )\n        .unwrap(),\n    )));\n    tokenizer.add_tokens(&[AddedToken::from(\"嗎\", false).normalized(false)]);\n    let encoded = tokenizer\n        .encode(\"Hey! how is this token: 嗎\", false)\n        .unwrap();\n    assert_eq!(\n        encoded.get_ids(),\n        [19182, 0, 1268, 602, 82, 62428, 82, 4037, 25, 220, 128256]\n    );\n    assert_eq!(\n        encoded.get_tokens(),\n        [\"Hey\", \"!\", \"Ġhow\", \"Ġi\", \"s\", \"Ġthi\", \"s\", \"Ġtoken\", \":\", \"Ġ\", \"嗎\"]\n    );\n\n    let decoded = tokenizer.decode(encoded.get_ids(), false);\n    assert_eq!(decoded.unwrap(), \"Hey! how is this token: 嗎\");\n\n    tokenizer.add_tokens(&[AddedToken::from(\"д\", false).normalized(true)]);\n    let encoded = tokenizer\n        .encode(\"Hey! how is this token: д\", false)\n        .unwrap();\n    assert_eq!(\n        encoded.get_ids(),\n        [19182, 0, 1268, 602, 82, 62428, 82, 4037, 25, 220, 128257]\n    );\n    assert_eq!(\n        encoded.get_tokens(),\n        [\"Hey\", \"!\", \"Ġhow\", \"Ġi\", \"s\", \"Ġthi\", \"s\", \"Ġtoken\", \":\", \"Ġ\", \"Ð´\"]\n    );\n    let decoded = tokenizer.decode(encoded.get_ids(), false);\n    assert_eq!(decoded.unwrap(), \"Hey! how is this token: д\")\n}\n\n#[test]\nfn test_decode_stream_step_no_panic() {\n    let tokenizer = Tokenizer::from_file(\"data/llama-3-tokenizer.json\").unwrap();\n\n    // \"A B C D E F G H I J\"\n    let mut decode_stream = tokenizer.decode_stream(false);\n    assert_eq!(decode_stream.step(32).unwrap(), Some(\"A\".to_string()));\n    assert_eq!(decode_stream.step(426).unwrap(), Some(\" B\".to_string()));\n    assert_eq!(decode_stream.step(356).unwrap(), Some(\" C\".to_string()));\n    assert_eq!(decode_stream.step(423).unwrap(), Some(\" D\".to_string()));\n    assert_eq!(decode_stream.step(469).unwrap(), Some(\" E\".to_string()));\n    assert_eq!(decode_stream.step(435).unwrap(), Some(\" F\".to_string()));\n    assert_eq!(decode_stream.step(480).unwrap(), Some(\" G\".to_string()));\n    assert_eq!(decode_stream.step(473).unwrap(), Some(\" H\".to_string()));\n    assert_eq!(decode_stream.step(358).unwrap(), Some(\" I\".to_string()));\n    assert_eq!(decode_stream.step(622).unwrap(), Some(\" J\".to_string()));\n    // for (i, &token) in output_tokens.iter().enumerate() {}\n\n    // \"삥뽕빵\" (Korean words composed of 2-3 tokens: [80690, 98], [167, 121, 243], and [102457, 113])\n    let mut decode_stream = tokenizer.decode_stream(false);\n    assert_eq!(decode_stream.step(80690).unwrap(), None);\n    assert_eq!(decode_stream.step(98).unwrap(), Some(\"삥\".to_string()));\n    assert_eq!(decode_stream.step(167).unwrap(), None);\n    assert_eq!(decode_stream.step(121).unwrap(), None);\n    assert_eq!(decode_stream.step(243).unwrap(), Some(\"뽕\".to_string()));\n    assert_eq!(decode_stream.step(102457).unwrap(), None);\n    assert_eq!(decode_stream.step(113).unwrap(), Some(\"빵\".to_string()));\n}\n"
  },
  {
    "path": "tokenizers/tests/training.rs",
    "content": "use tokenizers::models::bpe::BPE;\nuse tokenizers::pre_tokenizers::whitespace::Whitespace;\nuse tokenizers::{DecoderWrapper, NormalizerWrapper, PostProcessorWrapper, PreTokenizerWrapper};\nuse tokenizers::{Model, Tokenizer, TokenizerBuilder};\n\n#[test]\nfn bpe_values_after_training() {\n    let mut tokenizer = TokenizerBuilder::<\n        BPE,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    >::default()\n    .with_model(\n        BPE::builder()\n            .unk_token(\"[UNK]\".to_string())\n            .dropout(0.1)\n            .build()\n            .unwrap(),\n    )\n    .build()\n    .unwrap();\n    let mut trainer = tokenizer.get_model().get_trainer();\n    tokenizer\n        .train_from_files(&mut trainer, vec![\"./data/small.txt\".to_string()])\n        .unwrap();\n    assert_eq!(tokenizer.get_model().dropout, Some(0.1));\n    assert_eq!(tokenizer.get_model().unk_token, Some(\"[UNK]\".to_string()));\n}\n\n#[test]\nfn bpe_continuing_subword_prefix_error() {\n    let mut tokenizer = TokenizerBuilder::<\n        BPE,\n        NormalizerWrapper,\n        PreTokenizerWrapper,\n        PostProcessorWrapper,\n        DecoderWrapper,\n    >::default()\n    .with_model(\n        BPE::builder()\n            .unk_token(\"[UNK]\".to_string())\n            .continuing_subword_prefix(\"##\".to_string())\n            .build()\n            .unwrap(),\n    )\n    .with_pre_tokenizer(Some(PreTokenizerWrapper::Whitespace(Whitespace {})))\n    .build()\n    .unwrap();\n    let mut trainer = tokenizer.get_model().get_trainer();\n    tokenizer\n        .train_from_files(&mut trainer, vec![\"./data/small.txt\".to_string()])\n        .unwrap();\n    tokenizer.save(\"tokenizer.json\", true).unwrap();\n    let tokenizer = Tokenizer::from_file(\"tokenizer.json\").unwrap();\n    assert_eq!(tokenizer.get_vocab_size(false), 1526);\n\n    std::fs::remove_file(\"tokenizer.json\").unwrap();\n}\n"
  },
  {
    "path": "tokenizers/tests/unigram.rs",
    "content": "#[cfg(not(debug_assertions))]\nuse assert_approx_eq::assert_approx_eq;\nuse std::collections::HashMap;\nuse std::fs::read_to_string;\nuse std::path::Path;\n#[cfg(not(debug_assertions))]\nuse tokenizers::models::unigram::Lattice;\nuse tokenizers::models::unigram::Unigram;\nuse tokenizers::models::unigram::UnigramTrainer;\nuse tokenizers::tokenizer::Model;\n\n#[test]\nfn test_unigram_from_file() {\n    let model = Unigram::load(Path::new(\"data/unigram.json\")).unwrap();\n    let string = \"吾輩《わがはい》は猫である。名前はまだ無い。\";\n    assert_eq!(\n        model\n            .tokenize(string)\n            .unwrap()\n            .iter()\n            .map(|tok| tok.value.clone())\n            .collect::<Vec<_>>(),\n        vec![\n            \"吾輩\",\n            \"《\",\n            \"わが\",\n            \"はい\",\n            \"》\",\n            \"は\",\n            \"猫\",\n            \"である\",\n            \"。\",\n            \"名前\",\n            \"はまだ\",\n            \"無い\",\n            \"。\"\n        ]\n    );\n}\n\n#[test]\nfn test_train_unigram_from_file() {\n    let content = read_to_string(\"data/small.txt\").unwrap();\n    let mut word_counts = HashMap::new();\n    content.split_whitespace().for_each(|word| {\n        // This is important for the test of char vs u8\n        let word = format!(\"▁{word}\");\n        *word_counts.entry(word).or_insert(0) += 1;\n    });\n\n    // println!(\"Words counts {:?}\", word_counts);\n\n    let trainer = UnigramTrainer::builder()\n        .show_progress(false)\n        .unk_token(Some(\"<UNK>\".into()))\n        .build()\n        .unwrap();\n    let mut model = Unigram::default();\n\n    let sentences: Vec<_> = word_counts\n        .iter()\n        .map(|(s, i)| (s.to_owned(), *i))\n        .collect();\n    trainer.do_train(sentences, &mut model).unwrap();\n    assert_eq!(model.get_vocab_size(), 719);\n}\n\n#[cfg(not(debug_assertions))]\n#[test]\nfn test_sample() {\n    let mut lattice = Lattice::from(\"ABC\", 0, 2);\n    lattice.insert(0, 1, 1.0, 3); // A\n    lattice.insert(1, 1, 1.2, 4); // B\n    lattice.insert(2, 1, 1.5, 5); // C\n    lattice.insert(0, 2, 1.6, 6); // AB\n    lattice.insert(1, 2, 1.7, 7); // BC\n    lattice.insert(0, 3, 1.8, 8); // ABC\n\n    let thetas: Vec<f64> = vec![0.0, 0.01, 0.5, 0.7, 1.0];\n\n    for theta in thetas {\n        let mut probs: HashMap<String, f64> = HashMap::new();\n        probs.insert(\"A B C\".to_string(), (theta * (1.0 + 1.2 + 1.5)).exp());\n        probs.insert(\"AB C\".to_string(), (theta * (1.6 + 1.5)).exp());\n        probs.insert(\"A BC\".to_string(), (theta * (1.0 + 1.7)).exp());\n        probs.insert(\"ABC\".to_string(), (theta * (1.8)).exp());\n\n        // Computes expected probabilities.\n        let mut z = 0.0;\n\n        for (_, p) in probs.iter() {\n            z += p;\n        }\n        for (_, p) in probs.iter_mut() {\n            *p /= z;\n        }\n\n        let n_trials = 10_000;\n        let mut freq: HashMap<String, u32> = HashMap::new();\n        for _ in 0..n_trials {\n            let string = lattice.sample_token(theta).join(\" \");\n            *freq.entry(string).or_insert(0) += 1;\n        }\n\n        assert_eq!(freq.len(), probs.len());\n        for (s, p) in probs.iter() {\n            assert_approx_eq!(1.0 * (freq[s] as f64) / (n_trials as f64), p, 0.03)\n        }\n    }\n}\n"
  }
]